|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#30
|
||||
|
||||
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; Програмистами не рождаются, ими становятся! Последний раз редактировалось SCrat.ORS, 14.02.2015 в 19:37. |