![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Народ помогите!!! Очень нужно реализовать быстрый поиск массива в массиве, обf масива имеют тип BYTE, причем вся сложность в том что:
1) Массив в котором происходит поиск имеет длинну до 5000000 эллементов, а массив который нужно найти имеет длинну до 255 эллементов... 2) Поиск проходит в цикле от 1 до 5000... Я сделал так (но это ОООООчень долго): Код:
... type buffer = array of byte; ... var Buf : buffer; ... Function FindinArray(LINE: String): Boolean; var i,j: INTEGER; InputArrayLength: INTEGER; InputArray : Array [1..255] of byte; err: BYTE; begin Result := False; InputArrayLength := Length(LINE) div 2; for I := 1 to InputArrayLength do InputArray[i]:=StrToInt('$'+Copy(LINE, I * 2 - 1, 2)); for i := 0 to Length(buf)-InputArrayLength do begin if buf[i+2] = InputArray[3] then if buf[i+1] = InputArray[2] then if buf[i] = InputArray[1] then begin err := 0; for j := 4 to InputArrayLength do begin if buf[i+j-1] <> InputArray[j] then begin inc(err); Break; end; end; if err = 0 then begin Result := true; exit; end; end; end; end; ... procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin // Заполняю массив BUF //... // И начинаю цикл.... for i := 0 to 15000 do FindinArray('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'); // Finalize(Buf); end; Пожалуйста помогите сделать поиск как можно быстрее. Заранее благодарен. |
#2
|
||||
|
||||
![]() Предлагаю такой вариант.
Код:
Var Massiv:array of byte;//Где ищем Finder:array [1..255] of byte; //Что ищем NumElements:integer; //Количество элементов в массиве LengthFinder:byte; // Длина массива, который ищем I:integer; CountFinder:integer; //количество итераций поиска j:byte; MassivFound:boolean; begin NumElements:=1000000; SetLength(Massiv,NumElements); //Запролняем массив For I:=0 to NumElements-1 do begin Massiv[i]:=Random(255); end; //Теперь возьмем и запишем в Massiv нужную нам комбинацию (для примера) Massiv[333500]:=40; Massiv[333501]:=41; Massiv[333502]:=42; Massiv[333503]:=43; Massiv[333504]:=44; Massiv[333505]:=45; LengthFinder:=6; //Количесво искомых элементов CountFinder:=NumElements-LengthFinder; //заполним искомый массив Finder[1]:=40; Finder[2]:=41; Finder[3]:=42; Finder[4]:=43; Finder[5]:=44; Finder[6]:=45; MassivFound:=False; For I:=0 to CountFinder-1 do begin if Massiv[i]=Finder[1] then //Если элемент массива совпал с первым элементом поисковой строки begin MassivFound:=True; for J:=1 to LengthFinder do if Massiv[I+J-1]<>Finder[j] then begin MassivFound:=False; Break; end; end; If MassivFound=True then Break; end; if MassivFound=True then ShowMessage('Found at '+IntToStr(I)+' position') else ShowMessage('Not Found');end; Хорошо написанная программа не требует документации ICQ 9-184-668. Последний раз редактировалось Thrasher, 06.03.2008 в 12:20. |