![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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;
Последний раз редактировалось Thrasher, 06.03.2008 в 12:20. |