Template:Пример поиска множества значений в сортированных таблицах
Данный пример сравнивает скорость работы функции 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 при проверке строки
// начинает проверку с первого столбца, если он совпадает с искомым значением, переходит ко второму и т.д. Если в таблице много одинаковых значений для многих строк необходимо большее
// число сравнений, чем, для таблиц, где одинаковых значений гораздо меньше. Поэтому, при таком поиске первыми выгодно указывать столбцы, которые содержат наиболее разнообразную информацию
//Это касается как сортированного, так и не сортированного поиска, однако, сортированный поиск менее подвержен влиянию распределения данных в таблице поиска.