Template:Пример поиска в сортированных таблицах

From SunFlurry wiki
Jump to: navigation, search

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