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

From SunFlurry wiki
Revision as of 08:56, 7 February 2021 by Admin (talk | contribs) (1 revision imported)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

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