algorytm.org

Implementacja w Delphi/Pascal



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Algorytm KR (Karpa-Rabina) - Implementacja w Delphi/Pascal
Ocena użytkownikóww: *****  / 2
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 16 listopada 2006 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

KR delphi/Algorytm_KR.dpr:
//www.algorytm.org
//Algorytm KR (Karpa-Rabina) - wyszukiwanie wzorca
//(c)2006 Tomasz Lubinski

program Algorytm_KR;

uses
  Forms,
  Math,
  Sysutils;

{$R *.RES}
{$Apptype console}

var
m,n,i,j:Integer;
rm,h1,h2:Int64;
wzorzec:String;
tekst:String;

const q:Integer=117899; //możliwie duża liczba pierwsza
      r:Integer=256;    //liczba symboli alfabetu

//oblicza a^b mod m
function power_modulo_fast(a: Integer; b: Integer; m: Integer): Integer;
var
   i: Integer;
   x: Int64;
begin
   result := 1;
   x := a mod m;

   i := 1;
   while (i<=b) do
      begin
         x := x mod m;
         if ((b and i) <> 0) then
            begin
               result := (result * x) mod m;
            end;
         x := x * x;
         i := i shl 1;
      end;
   result := result mod m;
end;

//Algorytm KR (Karpa-Rabina) - wyszukiwanie wzorca
begin
writeln('Podaj tekst');
readln(tekst);
writeln('Podaj wzorzec');
readln(wzorzec);

n:=length(tekst);
m:=length(wzorzec);

rm:=power_modulo_fast(r, m-1, q);
h1:=0;
h2:=0;
writeln('Indeksy poczatkow wzorca w tekscie');
//algorytm Hornera do obliczenia funkcji haszującej h(wzorzec)
for i:=1 to m do
   begin
      h1:=((h1*r) + Ord(wzorzec[i]));
      h1:=h1 mod q;
   end;
//algorytm Hornera do obliczenia funkcji haszującej h(tekst[1..m])
for i:=1 to m do
   begin
      h2:=((h2*r) + Ord(tekst[i]));
      h2:=h2 mod q;
   end;

i:=1;
while i<n-m+1 do
        begin
        j:=0;
        if h1=h2 then while ((j<m)and(wzorzec[j+1]=tekst[i+j])) do j:=j+1;
        if j=m then writeln((IntToStr(i)));
        h2:=h2-Ord(tekst[i])*rm;
        h2:=h2*r;
        h2:=h2+Ord(tekst[i+m]);
        h2:=h2 mod q;
        if (h2<0) then h2:=h2+q;
        i:=i+1;
        end;
j:=0;
if h1=h2 then while ((j<m)and(wzorzec[j+1]=tekst[i+j])) do j:=j+1;
if j=m then writeln((IntToStr(i)));

readln;
end.
Dodaj komentarz