Difference between revisions of "Template:Пример поиска в сортированных таблицах"
m (1 revision imported) |
|
(No difference)
|
Latest revision as of 07:56, 7 February 2021
Данный пример сравнивает скорость работы функции FindAndGoto для сортированной и не сортированной таблиц. Внутри цикла поиска также происходит увеличение массива с помощью функции AddLineSorted для проверки корректности ее работы.
См. также Пример поиска множества значений в сортированных таблицах.
ProfilerClear(); ProfilerStart(); randomize(1); aTab:=Tab.Create("Col1,Col2,Col3"); For i:=1 To 100000 Do aTab.AddLineSorted("Col1","Col1,Col2,Col3",Random(10000),Random(10000),Random(10000)); EndDo; For i:=1 To 10000 Do j:=Random(aTab.Size())+1; aCol1:=aTab.Get(j,"Col1"); While _And(j>1,aTab.Get(j-1,"Col1")=aCol1) Do j:=j-1; EndDo; aTab.FindAndGoto(aCol1,,"Col1",1); If j<>aTab.CurLine Then Message("Проблема при поиске значения!","!"); EndIf; //Добавление случайного значения внутри цикла поиска aTab.AddLineSorted("Col1","Col1,Col2,Col3",Random(10000),Random(10000),Random(10000)); EndDo; randomize(1); aTab:=Tab.Create("Col1,Col2,Col3"); For i:=1 To 100000 Do aTab.AddLine("Col1,Col2,Col3",Random(10000),Random(10000),Random(10000)); EndDo; aTab.Sort("Col1"); For i:=1 To 10000 Do j:=Random(aTab.Size())+1; aCol1:=aTab.Get(j,"Col1"); While _And(j>1,aTab.Get(j-1,"Col1")=aCol1) Do j:=j-1; EndDo; aTab.FindAndGoto(aCol1,,"Col1"); If j<>aTab.CurLine Then Message("Проблема при поиске значения (2)!","!"); EndIf; //Добавление случайного значения внутри цикла поиска aTab.AddLineSorted("Col1","Col1,Col2,Col3",Random(10000),Random(10000),Random(10000)); EndDo; ProfilerStop(); debugbreak; Message("Done!"); //Для i5, конечные результаты для среднего времени исполнения каждой операции: //aTab.AddLineSorted() (нач. заполнение) -- 3.61 сек. //aTab.AddLine() и aTab.Sort(); -- 3.45 сек. //aTab.FindAndGoto(aCol1,,"Col1",1); -- 36 мс./10000 //aTab.FindAndGoto(aCol1,,"Col1"); -- 35010 мс./10000 // //Как показывает эксперимент, для больших таблиц поиск в сортированной таблице имеет очень большое преимущество перед поиском без учета сортировки (1000 раз в нашем случае), // преимущество будет только расти при увеличении количества строк в таблице //Сортировка больших таблиц работает достаточно медленно, однако, использование функции AddLineSorted не имеет преимущества перед заполнением массива в случайном порядке, а затем его сортировкой. // AddLineSorted, однако, незаменим в случаях, когда необходимо добавлять строки в таблицу в цикле, в котором одновременно происходит сортированный поиск в этой же таблице.