Re[7]: Что нового сейчас есть в Delphi?
От: swame  
Дата: 02.08.24 19:56
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Здравствуйте, swame, Вы писали:


S>>1. Твой алгоритм не сортирует.

S>>Поставь после сортировки
S>>for w := 0 to 999998 do
S>> Assert (curarray.fitems[w]<=curarray.fitems[w+1],
S>> w.ToString + ' ' + FloatToStr(curarray.fitems[w]) + ' ' + FloatToStr(curarray.fitems[w+1]));

K>А что это? У вас конец массива 999998 а надо 99998, по размеру массива.


я увеличивал у себя размер массива, можешь у себя поставить свое число.

K>Если выставить 99998 — срабатывания не будет.


Должны срабатывать, проверь что ассерты в проекте включены.
Срабатывает Assert а не Range Check

---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EAssertionFailed with message '1 5,53084537386894E-5 2,90726311504841E-5 (C:\M_Src\test\Khimik\Unit1.pas, line 230)'.
---------------------------
Break Continue Copy Help
---------------------------



K>p.s. Влад спрашивает, забанить ли меня, просьба всем неравнодушным заглянуть в тему и поставить либо минус либо плюс:


Я равнодушный

K>https://rsdn.org/forum/flame.politics/8791571.1
Автор: VladD2
Дата: 01.08.24
Отредактировано 02.08.2024 19:58 swame . Предыдущая версия .
Re[8]: Что нового сейчас есть в Delphi?
От: Khimik  
Дата: 03.08.24 04:01
Оценка:
Здравствуйте, swame, Вы писали:

S>Должны срабатывать, проверь что ассерты в проекте включены.

S>Срабатывает Assert а не Range Check

У меня не срабатывает (заменил ассерты на if-ы):

  Скрытый текст
procedure TForm1.Button1Click(Sender: TObject);
var
q,w:integer;
firsttime:longword;
timegpt,timesections:longword;
curarray:tdoublearray;
outstr:string;
begin

firsttime:=GetTickCount;
for q:=0 to 100 do begin
curarray:=tdoublearray.Create;
curarray.Capacity:=100000;
for w:=0 to  99999 do curarray.Add(random);
curarray.QSort2GPT;

for w := 0 to 99998 do if not (curarray.fitems[w]<=curarray.fitems[w+1]) then application.MessageBox(pchar('qsort2gpt'+w.ToString + ' ' + FloatToStr(curarray.fitems[w]) + ' ' + FloatToStr(curarray.fitems[w+1])),'App',MB_OK);

curarray.Free;
end;
timegpt:=gettickcount-firsttime;

firsttime:=GetTickCount;
for q:=0 to 100 do begin
curarray:=tdoublearray.Create;
curarray.Capacity:=100000;

for w:=0 to  99999 do curarray.Add(random);
curarray.QSort10Sections;

for w := 0 to 99998 do if not (curarray.fitems[w]<=curarray.fitems[w+1]) then application.MessageBox(pchar('qsort10sec '+w.ToString + ' ' + FloatToStr(curarray.fitems[w]) + ' ' + FloatToStr(curarray.fitems[w+1])),'App',MB_OK);

curarray.Free;
end;
timesections:=gettickcount-firsttime;


outstr:='GPT: '+inttostr(timegpt)+'; Секции: '+inttostr(timesections);
application.MessageBox(pchar(outstr),'Тест',mb_ok);

end;
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Re[8]: Что нового сейчас есть в Delphi?
От: Khimik  
Дата: 03.08.24 16:13
Оценка:
Здравствуйте, swame, Вы писали:

K>>А что это? У вас конец массива 999998 а надо 99998, по размеру массива.


S>я увеличивал у себя размер массива, можешь у себя поставить свое число.


K>>Если выставить 99998 — срабатывания не будет.


S>Должны срабатывать, проверь что ассерты в проекте включены.

S>Срабатывает Assert а не Range Check

S>---------------------------

S>Debugger Exception Notification
S>---------------------------
S>Project Project1.exe raised exception class EAssertionFailed with message '1 5,53084537386894E-5 2,90726311504841E-5 (C:\M_Src\test\Khimik\Unit1.pas, line 230)'.
S>---------------------------
S>Break Continue Copy Help
S>---------------------------

Вы отредактировали ваше сообщение как ответ на моё последнее? Я думаю скорее всего у вас range check не срабатывает и цикл выходит за границы массива, вы не проверили границы цикла. Вставьте пожалуйста мой код из последнего моего сообщения, К меня ни ассерты ни ифы не срабатывают. Плюс я у меня есть дополнительный код в button2click где тоже всё проверяется.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Отредактировано 03.08.2024 17:00 Khimik . Предыдущая версия .
Re[9]: Что нового сейчас есть в Delphi?
От: swame  
Дата: 03.08.24 17:48
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Здравствуйте, swame, Вы писали:


K>Вы отредактировали ваше сообщение как ответ на моё последнее? Я думаю скорее всего у вас range check не срабатывает и цикл выходит за границы массива, вы не проверили границы цикла. Вставьте пожалуйста мой код из последнего моего сообщения, К меня ни ассерты ни ифы не срабатывают. Плюс я у меня есть дополнительный код в button2click где тоже всё проверяется.


Извиняюсь, то что не сортирует это я сломал неаккуратными изменениями. Сортирует.
Пункт про то что требуется в 8 раз больше памяти, чем надо, остается. 15% скорости в большинстве случаев того не стоят.
Отредактировано 03.08.2024 17:50 swame . Предыдущая версия .
Re[10]: Что нового сейчас есть в Delphi?
От: Khimik  
Дата: 03.08.24 18:18
Оценка:
Здравствуйте, swame, Вы писали:


S>Извиняюсь, то что не сортирует это я сломал неаккуратными изменениями. Сортирует.

S>Пункт про то что требуется в 8 раз больше памяти, чем надо, остается. 15% скорости в большинстве случаев того не стоят.

Наверно если бы размер массива был в 1000 раз больше, разница была бы весьма заметной. Да, мой алгоритм требует больше памяти, так и должно быть в теории. У производительности сортировки есть теоретический предел, если не путаю у быстрой сортировки время пропорционально N*ln(N), у моей сортировки может даже N, хотя не уверен. Мне с моим проектом время от времени приходилось решать задачи на оптимизацию.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
Re[11]: Что нового сейчас есть в Delphi?
От: swame  
Дата: 06.08.24 20:15
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Здравствуйте, swame, Вы писали:



S>>Извиняюсь, то что не сортирует это я сломал неаккуратными изменениями. Сортирует.

S>>Пункт про то что требуется в 8 раз больше памяти, чем надо, остается. 15% скорости в большинстве случаев того не стоят.

K>Наверно если бы размер массива был в 1000 раз больше, разница была бы весьма заметной. Да, мой алгоритм требует больше памяти, так и должно быть в теории. У производительности сортировки есть теоретический предел, если не путаю у быстрой сортировки время пропорционально N*ln(N), у моей сортировки может даже N, хотя не уверен. Мне с моим проектом время от времени приходилось решать задачи на оптимизацию.


С массивом в 1000 раз больше у тебя бы давно уже закончилась память.
Если нужно сортировать не вещественные, а например целые то есть более эффективная сортировка radix
https://habr.com/ru/articles/335920/
если нужна скорость то уже можно было бы распараллелить на ядрах. НО это уже довольно кропотливая работа. В лоб не получится.
Отредактировано 06.08.2024 20:16 swame . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.