Bargest, спасибо за наводку.
Результат:
2 000 000 Строк, 100 000 циклов поиска: Среднее время поиска
0,078 мсек.
Результат Бинарного поиска от M.A.D.M.A.N. (который мне не удалось сделать, поэтому результат его)
12,6 мсек. (0,0126044552868083 сек).
Это конечно несколько разные подходы к организации массивов и поиска, но ради интереса. Так что да,.. хранить нужно с хешем.
M.A.D.M.A.N. Твой результат в мсек. примерно тоже самое что у меня и показывает. Так что все более менее одинаково и твои Мгновенно - это и есть 11 мсек. Вероятно Бинарный поиск дает свои плоды если количество слов более 10млн, т.к. до 2 млн, он по вычислениям почти совпадает с Простым перебором. Вот такое вот исследование.
Вот как реализовал:
Код:
...
Type TMyArray = Packed Record
SomeName:String;
end;
Type
MyArray = array [$00..$FF] of Array of TMyArray;
...
function crc8(Buffer:String):byte;
var
i,j: Integer;
begin
Result:=$FF;
for i:=1 to Length(Buffer) do begin
Result:=Result xor ord(buffer[i]);
for j:=0 to 7 do begin
if (Result and $80)<>0 then Result:=(Result shl 1) xor $31
else Result:=Result shl 1;
end;
end;
end;
function FindM(const AText: string; const AValues: array of TMyArray): Integer;
var
I: Integer;
begin
Result := -1;
for I := Low(AValues) to High(AValues) do
if AText=AValues[i].SomeName then
begin
Result := I;
Break;
end;
end;
Function Find(S:String; M: MyArray):TPoint;
Var
NDX:Integer;
Begin
NDX:=CRC8(s);
Result.X:=NDX;
Result.Y:=FindM(s,M[NDX]);
End;
...
procedure TForm1.Button1Click(Sender: TObject);
Var
I:TPoint;
N:String;
begin
I:=Find('СТРОКА ПОИСКА', MItemInformation); //MItemInformation - Это массив в котором ищем
If i.Y>-1 then N:=MItemInformation[I.X,I.Y].SomeName;
end;