Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

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

Народ помогите!!! Очень нужно реализовать быстрый поиск массива в массиве, обf масива имеют тип BYTE, причем вся сложность в том что:

1) Массив в котором происходит поиск имеет длинну до 5000000 эллементов, а массив который нужно найти имеет длинну до 255 эллементов...
2) Поиск проходит в цикле от 1 до 5000...

Я сделал так (но это ОООООчень долго):

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
...
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  
Старый 06.03.2008, 12:07
Аватар для Thrasher
Thrasher Thrasher вне форума
Illuminati
 
Регистрация: 06.03.2008
Адрес: Крым, г. Симферополь
Сообщения: 348
Репутация: 8808
По умолчанию

Предлагаю такой вариант.

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:21.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025