Бинарный поиск в наборе данных
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.
Комментарии