- •Анотація
- •1. Теоретичні відомості про алгоритми пошуку підстрічки в стрічці
- •1.1. Основні поняття.
- •1.1.1 Стрічка, її довжина, підстрічка.
- •1.1.2. Поняття про складність алгоритму.
- •1.2. Алгоритми основані на методі послідовного пошуку.
- •1.2.1. Алгоритм послідовного (прямого) пошуку (The Brute Force Algorithm).
- •1.2.2. Алгоритм Рабіна.
- •1.3. Алгоритм Кнута - Моріса - Прата (кмп).
- •1.4. Алгоритм Бойера – Мура і деякі його модифікації.
- •1.4.1. Алгоритм Бойера – Мура.
- •1.4.2. Модификації бм. Швидкий пошук (Класифікація Thierry Lecroq ).
- •Турбо бм (Класифікація Thierry Lecroq ).
- •1.5. Пошук підстрічок з допомогою скінченного автомата.
- •1.5.1. Структура автомата.
- •1.5.2. Приклад побудови скінченного автомата
- •2. Експериментальний аналіз алгоритмів
- •2.1. Суть експерименту.
- •2.2. Результати і аналіз експерименту.
- •3. Програмна реалізація
- •Висновок.
- •Література.
Висновок.
Ми розглянули різні алгоритми пошуку підстрічки в стрічці, зробили їх аналіз. Результати можна представити в таблиці (Табл. 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.