Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kursova2012_Algorytmy_poshuku.doc
Скачиваний:
7
Добавлен:
29.08.2019
Размер:
438.78 Кб
Скачать

Висновок.

Ми розглянули різні алгоритми пошуку підстрічки в стрічці, зробили їх аналіз. Результати можна представити в таблиці (Табл. 4).

Алгоритм

Час на поперед. обробку

Середній час пошуку

Гірший час пошуку

Затрати пам’яті

Час работи (мс) при довж. стрічки ≤250

Примітка

Алгоритми основані на алгоритмі послідовного пошуку

Алгоритм прямого пошуку

Нема

O((m-n+1)*n+1)/2

O((m-n+1)*n+1)

Нема

234

Малі трудозатрати на програму, мала ефективність.

Алгоритм Рабіна

Нема

O(m+n)

O((m-n+1)*n+1)

Нема

93

Алгоритм Кнута-Морріса-Пратта

КМП

O(m)

O(n+m)

O(n+m)

O(m)

31

Універсальний алгоритм, якщо невідома довжина зразка

Алгоритм Бойера-Мура

БМ

O(m+s)

O(n+m)

O(n*m)

O(m+s)

32

Алгоритми цієї групи найбільш ефективні в звичайних ситуаціях. Швидкодія збільшується при збільшені зразка або алфавіта.

Виходячи з отриманих результатів, видно, що алгоритм Бойера - Мура є провідним за всіма параметрами, здавалося б, було знайдено найбільш ефективний алгоритм. Але, як показує експеримент, алгоритм Кнута - Моріса - Прата, перевершує алгоритм БМ при невеликій довжині зразка. Тому я не можу зробити висновок, який із алгоритмів є найбільш оптимальним. Кожен алгоритм дозволяє ефективно діяти лише для свого класу задач, про це ще говорять різні вузькоспрямовані поліпшення. Алгоритм пошуку підстрічками в рядку слід вибирати тільки після точної постановки завдання, які повинна виконувати програма.

Зробивши такий висновок, ми виконали мету даної роботи, тому що для різних класів задач був виділений свій ефективний алгоритм.

Література.

1). Ахо, Альфред Структура данных и алгоритмы. – М.: Издательский дом «Вильямс», 2000. - 384 с.

2). Белоусов А. Дискретная математика. – М.: Издательство МГТУ им. Н.Э. Баумана, 2001. – 744 с.

3). Брайан, К. Практика программирования.- СПб:. Невский диалект, 2001. - 381 с.

4). Вирт, Н. Алгоритмы и структуры данных.– М:. Мир, 1989. – 360 с.

5). Гилл, Арт. Введение в теорию конечных автоматов. – М., 1966. - 272 с.

6). Глушаков С. Программирование Web – страниц. – М.: ООО «Издательство АСТ», 2003. – 387 с.

7). Кнут, Д. Искусство программирования на ЭВМ: Том 3. – М:. Мир, 1978. – 356 с.

8). Матрос Д. Элементы абстрактной и компьютерной алгебры: Учеб. пособие для студ. – М.: Издательский центр «Академия», 2004. – 240 с.

9). Успенский В. Теория алгоритмов: основные открытия и приложения. – М.: Наука, 1987. – 288 с.

10). Шень, А. Программирование: теоремы и задачи. – М.: Московский центр непрерывного математического образования, 1995.

Додаток №1

Рис1. Програма на етапі виконання

Рис2. Збереження результатів виконання

Додаток №2

Головний модуль програми:

unit mainUnit;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

ExtCtrls, StdCtrls, Buttons;

type

TForm1 = class(TForm)

Memo1: TMemo;

OpenDialog1: TOpenDialog;

SaveDialog1: TSaveDialog;

GroupBox1: TGroupBox;

BitBtn1: TBitBtn;

BitBtn2: TBitBtn;

BitBtn3: TBitBtn;

BitBtn4: TBitBtn;

BitBtn7: TBitBtn;

BitBtn6: TBitBtn;

Memo2: TMemo;

Edit1: TEdit;

Label1: TLabel;

procedure BitBtn7Click(Sender: TObject);

procedure BitBtn6Click(Sender: TObject);

procedure BitBtn1Click(Sender: TObject);

procedure BitBtn2Click(Sender: TObject);

procedure BitBtn3Click(Sender: TObject);

procedure BitBtn4Click(Sender: TObject);

end;

var

Form1: TForm1;

Text: String;

SubString: String;

p: byte;

tick,i: integer;

res: double;

implementation

uses findUnit;

{$R *.DFM}

procedure TForm1.BitBtn7Click(Sender: TObject);

begin

if OpenDialog1.Execute then Memo1.Lines.LoadFromFile(OpenDialog1.FileName)

end;

procedure TForm1.BitBtn6Click(Sender: TObject);

begin

if SaveDialog1.Execute then Memo2.Lines.SaveToFile(SaveDialog1.FileName+'.fresult')

end;

//-----> poslidovn poshuk

procedure TForm1.BitBtn1Click(Sender: TObject);

begin

Text:=Memo1.Lines.GetText;

SubString:=Edit1.text; p:=0;

Tick:=GetTickCount;

for i:=1 to 100 do

Search(Text,SubString,p);

Tick:=GetTickCount-Tick;

res:=Tick/100;

Memo2.Lines[0]:='Час методу послідовного пошуку: '+floattostr(res)+' ['+inttostr(p)+']';

end;

//-----> Rabin

procedure TForm1.BitBtn2Click(Sender: TObject);

begin

Text:=Memo1.Lines.GetText;

SubString:=Edit1.text; p:=0;

Tick:=GetTickCount;

for i:=1 to 100 do

SearchRabin(Text,SubString,p);

Tick:=GetTickCount-Tick;

res:=Tick/100;

Memo2.Lines[1]:='Час методу Рабіна: '+floattostr(res)+' ['+inttostr(p)+']';

end;

//-----> KMP

procedure TForm1.BitBtn3Click(Sender: TObject);

begin

Text:=Memo1.Lines.GetText;

SubString:=Edit1.text; p:=0;

Tick:=GetTickCount;

for i:=1 to 100 do

p:=KMPSearch(SubString,Text);

Tick:=GetTickCount-Tick;

res:=Tick/100;

Memo2.Lines[2]:='Час методу алгоритму КМП: '+floattostr(res)+' ['+inttostr(p)+']';

end;

//-----> Bojer Mur

procedure TForm1.BitBtn4Click(Sender: TObject);

begin

Text:=Memo1.Lines.GetText;

SubString:=Edit1.text;

Tick:=GetTickCount;

for i:=1 to 100 do

p:=BMSearch(1,Text,SubString);

Tick:=GetTickCount-Tick;

res:=Tick/100;

Memo2.Lines[3]:='Час методу алгоритму БМ: '+floattostr(res)+' ['+inttostr(p)+']';

end; end.

Додаток №3

Пошуковий модуль програми

unit findUnit;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

ExtCtrls, StdCtrls, Buttons;

Function Search(S: String; X: String; var Place: Byte): Boolean;

Function BMSearch(StartPos: Integer; const S, P: string): Integer;

Function hashCode(s: string,len: integer): real;

Procedure rehash(hash: real; first,last: char);

Function SearchRabin(where,what: string): integer;

Function KMPSearch (t,p : String) : integer;

implementation

//-----> poslidovn poisk

Function Search(S: String; X: String; var Place: Byte): Boolean;

var Res: Boolean; i : Integer;

Begin

Res:=FALSE;

i:=1;

While (i<=Length(S)-Length(X)+1) And Not(Res) do

If Copy(S,i,Length(X))=X then

begin

Res:=TRUE;

Place:=i

end

else i:=i+1;

Search:=Res

End;

//-----> Bojer Mur

function BMSearch(StartPos: Integer; const S, P: string): Integer;

type

TBMTable = array[0..255] of Integer;

var

Pos, lp, i: Integer;

BMT: TBMTable;

begin

for i := 0 to 255 do

BMT[i] := Length(P);

for i := Length(P) downto 1 do

if BMT[Byte(P[i])] = Length(P) then

BMT[Byte(P[i])] := Length(P) - i;

lp := Length(P);

Pos := StartPos + lp - 1;

while Pos <= Length(S) do

if P[lp] <> S[Pos] then

Pos := Pos + BMT[Byte(S[Pos])]

else if lp = 1 then

begin

Result := Pos;

Exit;

end

else

for i := lp - 1 downto 1 do

if P[i] <> S[Pos - lp + i] then

begin

Inc(Pos);

Break;

end

else if i = 1 then

begin

Result := Pos - lp + 1;

Exit;

end;

Result := 0;

end;

//-----> Metod Rabina

Function hashCode(s: string,len: integer): real;

var

p: real;

i: integer;

begin

p:=0;

for i:=0 to len

begin

p:=p*256;

p=p/s[i];

p:=p/q;

end;

result:=p;

end;

Procedure rehash(hash: real; first,last: char);

begin

hash:=hash-h*first;

hash:=hash*256;

hash:=hash/last;

hash:=hash mod q;

end;

Function SearchRabin(where,what: string): integer;

var

n,m,i,j,k: integer;

p,t: float;

diffFound: boolean;

begin

n:=length(where);

m:=length(what);

if n<m then begin result:=-1; break; end;

h:=1;

for k:= 1 to m-1 do

begin

h:=h*256;

h:=h mod q;

end;

p:=hashCode(what, m);

t:=hashCode(where, m);

for i:=1 to n-m do

if p == t then

begin

diffFound = false;

j:=0;

repeat

diffFound:= where[i+j];

inc(j);

until j<m;

if not(diffFound) begin result:=i; break; end;

end

else if i<n-m then rehash(ref t, where[i], where[i+m]);

result:=-1;

end;

//-----> Knut Moris Pratt

Function KMPSearch (t,p : String) : integer;

var F : array of integer;

k,i : integer;

begin

SetLength(F, Length(t) + Length(p));

F[1]:=0; k:=0;

For i:=2 to length(T) do

begin

While (k>0) and (T[k+1]<>T[i]) do

k := F[k];

if T[k+1]=T[i] Then Inc(k);

F[i]:=k;

end;

k:=0;

For i:=1 to length(P) do

begin

While (k>0) and ( T[k+1]<>P[i]) do k:=F[k];

if T[k+1]=P[i] Then Inc(k);

if k=length(T) Then

Begin

Result:=i-length(t)+1;

Break

End;

end;

end;

end.

31

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]