Difference between revisions of "Template:Пример поиска множества значений в сортированных таблицах"
m (1 revision imported) |
|
(No difference)
|
Latest revision as of 07:56, 7 February 2021
Данный пример сравнивает скорость работы функции LocateAndGoto для сортированной и не сортированной таблиц. Внутри цикла поиска также происходит увеличение массива с помощью функции AddLineSorted для проверки корректности ее работы.
См. также Пример поиска в сортированных таблицах.
Function TestTable(aTab) for i:=1 to 25000 Do j:=Random(10000)+1; aTab.CurLine:=j; while _And(j>1,aTab.Get(j-1,"b1")=aTab.b1,aTab.Get(j-1,"b2")=aTab.b2,aTab.Get(j-1,"b3")=aTab.b3,aTab.Get(j-1,"b4")=aTab.b4,aTab.Get(j-1,"b5")=aTab.b5) Do j:=j-1; EndDo; j2:=aTab.Locate("b1,b2,b3,b4,b5",aTab.b1,aTab.b2,aTab.b3,aTab.b4,aTab.b5); if j<>j2 then Message("Проблема, невозможно найти индекс "+j+" (простой поиск)","!"); Exit 0,2; EndIf; j2:=aTab.Locate("b1,b2,b3,b4,b5",aTab.b1,aTab.b2,aTab.b3,aTab.b4,aTab.b5,1); if j<>j2 then Message("Проблема, невозможно найти индекс "+j+" (поиск с сортировкой)","!"); Exit 0,2; EndIf; EndDo; EndFunction Randomize(1); aTab:=Tab.Create("b1,b2,b3,b4,b5"); bTab:=Tab.Create("b1,b2,b3,b4,b5"); For i:=1 To 100000 Do bTab.Addline("b1,b2,b3,b4,b5",random(10),random(10),random(10),random(10),random(10)); aTab.Addline("b1,b2,b3,b4,b5",random(1000),random(1000),random(1000),random(1000),random(1000)); EndDo; ProfilerClear(); ProfilerStart(); aTab.Sort("b1,b2,b3,b4,b5"); bTab.Sort("b1,b2,b3,b4,b5"); TestTable(aTab); TestTable(bTab); ProfilerStop(); debugbreak; Message("Done!"); //Для i5, конечные результаты для среднего времени исполнения каждой операции: //aTab.Locate("b1,b2,b3,b4,b5",...) -- 16.45 сек./50000 //aTab.Locate("b1,b2,b3,b4,b5",...,1) -- 708 мс./50000 //aTab.Sort(); -- 3.90 с. //bTab.Sort(); -- 3.92 с. //TestTable(aTab); -- 5.0 с. //TestTable(bTab); -- 13.4 с. // //Как показывает эксперимент, для больших таблиц поиск в сортированной таблице имеет большое преимущество перед поиском без учета сортировки // (23 раза в нашем случае для суммы обеих таблиц), преимущество будет только расти при увеличении количества строк в таблице. //Сортировка больших таблиц работает достаточно медленно, однако, она не зависит от типа данных в таблице. //Для таблиц с большим количеством одинаковых данных (bTab) поиск происходит гораздо медленнее, чем для таблиц, где данные сильно отличаются. Дело в том, что Locate при проверке строки // начинает проверку с первого столбца, если он совпадает с искомым значением, переходит ко второму и т.д. Если в таблице много одинаковых значений для многих строк необходимо большее // число сравнений, чем, для таблиц, где одинаковых значений гораздо меньше. Поэтому, при таком поиске первыми выгодно указывать столбцы, которые содержат наиболее разнообразную информацию //Это касается как сортированного, так и не сортированного поиска, однако, сортированный поиск менее подвержен влиянию распределения данных в таблице поиска.