Внешний вид сайта:

Бинарный поиск в наборе данных

TQuery не имеет никаких функций поиска, подобно функциям TTable FindKey или GotoKey, поэтому мы часто находим процедуры в проектах Delphi, которые выглядят следующим образом:
function SeqSearch(AQuery: TQuery; 
    AField, AValue: String): Boolean;
begin
  with AQuery do begin
    First;
    while (not Eof) and
          (not (FieldByName(AField).AsString = AValue)) do
      Next;
    Result := not Eof;
  end;
end;

Это последовательный поиск, эта функция перебирает набор данных шаг за шагом до его конца. Требуется максимум времени. При помощи метода MoveBy возможно осуществить намного лучший алгоритм поиска - двоичный поиск.

function BinSearch(AQuery: TQuery; 
    AField, AValue: String): Boolean;
var
  Hi, Lo: Integer;
begin
  with AQuery do begin
    First;
    Hi := RecordCount;
    Lo := 0;
    MoveBy(RecordCount div 2);
    while (Hi - Lo) > 1 do begin
      if (FieldByName(AField).AsString > AValue) then begin
        Hi := Hi - ((Hi - Lo) div 2);
        MoveBy(((Hi - Lo) div 2) * -1);
      end
      else begin
        Lo := Lo + ((Hi - Lo) div 2);
        MoveBy((Hi - Lo) div 2);
      end;
    end;
    if (FieldByName(AField).AsString > AValue) then Prior;
    Result := (FieldByName(AField).AsString = AValue)
  end;
end;

Единственное условие этой функции, что записи будут отсортированы. Это легко реализовать через инструкцию ORDER BY запроса SQL.

Комментарии

Нет комментариев. Ваш будет первым!