[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: Ledi_Gaga  
Форум » Программирование » Delphi/Pascal » Поиск
Поиск
_Hz_Дата: Среда, 29.07.2009, 16:10 | Сообщение # 1
Генералиссимус
Группа: Администраторы
Сообщений: 179
Награды: 11
Репутация: 7
Статус: Offline
Алгоритм Кнута, Мориса и Пратта

Code
Program KMP;
const
           Mmax = 100; Nmax = 10000;
var
           i, j, k, M, N: integer;
           p: array[0..Mmax-1] of char; {слово}
           s: array[0..Mmax-1] of char; {текст}
           d: array[0..Mmax-1] of integer;
begin
{Ввод текста s и слова p}
Write('N:'); Readln(N);
Write('s:'); Readln(s);
Write('M:'); Readln(M);
Write('p:'); Readln(p);
{Заполнение массива d}
j:=0; k:=-1; d[0]:=-1;
while j<(M-1) do begin
               while(k>=0) and (p[j]<>p[k]) do k:=d[k];
               j:=j+1; k:=k+1;
               if p[j]=p[k] then
                       d[j]:=d[k]
               else
                       d[j]:=k;
end;
{Поиск слова p в тексте s}
i:=0; j:=0;
while (j<M) and (i<N) do begin
            while (j>=0) and (s[i]<>p[j]) do j:=d[j]; {Сдвиг слова}
             i:=i+1; j:=j+1;
end;
{Вывод результата поиска}
if j=M then Writeln('Yes') {найден }
else Writeln('No'); {не найден}
Readln;
end.

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

Code
Program BM;
const
          Mmax = 100; Nmax = 10000;
var
          i, j, k, M, N: integer;
          ch: char;
          p: array[0..Mmax-1] of char; {слово}
          s: array[0..Nmax-1] of char; {текст}
          d: array[' '..'z'] of integer;
begin
{Ввод текста s и слова p}
Write('N:'); Readln(N);
Write('s:'); Readln(s);
Write('M:'); Readln(M);
Write('p:'); Readln(p);
{Заполнение массива d}
for ch:=' ' to 'z' do d[ch]:=M;
for j:=0 to M-2 do d[p[j]]:=M-j-1;
{Поиск слова p в тексте s}
i:=M;
repeat
            j:=M; k:=i;
            repeat {Цикл сравнения символов }
                       k:=k-1; j:=j-1; {слова, начиная с правого.}
            until (j<0) or (p[j]<>s[k]); {Выход, если сравнили все}
            {слово или несовпадение. }
            i:=i+d[s[i-1]]; {Сдвиг слова вправо }
until (j<0) or (i>N);
{Вывод результата поиска}
if j<0 then Writeln('Yes') {найден }
else Writeln('No'); {не найден}
Readln;
end.

Поиск делением пополам

Code
L:=0; R:=N-1; Found:=false;
while(L<=R) and not Found do begin
                m:=(L+R) div 2;
                             if a[m]=x then begin
                      Found:=true
                            end else begin
                      if a[m]<x then L:=m+1 else R:=m-1
                            end
end;

Прямой поиск строки

Code
i:=-1;
repeat
            i:=i+1; j:=0;
            while (j<M) and (s[i+j]=p[j]) do j:=j+1;
until (j=M) or (i=N-M)


 
Форум » Программирование » Delphi/Pascal » Поиск
  • Страница 1 из 1
  • 1
Поиск: