Показать сообщение отдельно
  #1  
Старый 29.02.2008, 12:50
Vlad_88 Vlad_88 вне форума
Прохожий
 
Регистрация: 29.02.2008
Сообщения: 8
Репутация: 10
По умолчанию Поиск массива в массиве...

Народ помогите!!! Очень нужно реализовать быстрый поиск массива в массиве, об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;

Пожалуйста помогите сделать поиск как можно быстрее.
Заранее благодарен.
Ответить с цитированием