.


:




:

































 

 

 

 


--

, , : , m ( ) , . , ( Pascal):

Program SimpleSearch;

Var T: array[1..40000] of char; { }

S: array[1..10000] of char; { ; , }

i,j: longint;

m,n: longint;

Begin

{ }

for i:=1 to n-m+1 do

begin

j:=0;

while (j<m) and (S[j+1]=T[i+j]) do { i-}

j:=j+1;

if j=m then { }

writeln(' ',i,'- '); { }

end;

End.

, . , , . . ( ), n, m . , O((n-m+1)m). , - 100 , , , . , , .

, , , , . , aabc ( aab), , , . , , , .

-

, , , , , . , , . , , , ( Dm, D - ), . , , , , 8 .

Program RabinKarpSearch;

Var T: array[1..40000] of 0..9;

S: array[1..8] of 0..9;

i,j: longint;

n,m: longint;

v,w: longint; {v - , , w m }

k: longint;

const D: longint = 10; { (10 )}

Begin

{ }

v:=0;

w:=0;

for i:=1 to m do

begin

v:=v*D+S[i]; { v, }

w:=w*D+T[i]; { w}

end;

k:=1;

for i:=1 to m-1 do {k w Dm-1}

k:=k*D;

for i:=m+1 to n+1 do

begin

if w=v then { , , , }

writeln(' ',i-m,'- ');

if i<=n then

w:=d*(w-k*T[i-m])+T[i]; { w}

end;

End.

(m ) (n ), , O(n+m). , . ? , . , , . , - ( ). , , , . , , (, ), .

Var T: array[1..40000] of char;

S: array[1..10000] of char;

i,j: longint;

n,m: longint;

v,w: longint;

k: longint;

const P: longint = 7919; {1000- }

D: longint = 256; { ( char)}

Begin

{ }

v:=0;

w:=0;

for i:=1 to m do { v w}

begin

v:=(v*D+ord(S[i])) mod P; {ord }

w:=(w*D+ord(T[i])) mod P;

end;

k:=1;

for i:=1 to m-1 do

k:=k*D mod P; {k Dm-1 mod P}

for i:=m+1 to n+1 do

begin

if w=v then { , , }

begin

j:=0;

while (j<m) and (S[j+1]=T[i-m+j]) do

j:=j+1;

if j=m then { }

writeln(' ',i-m,'- ');

end;

if i<=n then

w:=(d*(w+P-(ord(T[i-m])*k mod P))+ord(T[i])) mod P;

end;

End.

, - , ( 1/P ), . , O(m+n+mn/P), mn/P , . , , , . .

, , - --, , .

--

, : -. S[1..i] S S[1..j] (j<i), , ( ). , abcHelloabc abc ( , ). - , , .. abcHelloabc ( ), ( ). 1 m:

var S: array[1..10000] of char;

P: array[1..10000] of word; {, -}

i,k: longint;

m: longint;

Procedure Prefix; {, -}

Begin

P[1]:=0; { }

k:=0;

for i:=2 to m do { 2 m }

begin

while (k>0) and (S[k+1]<>S[i]) do

k:=P[k]; { }

if S[k+1]=S[i] then

k:=k+1;

P[i]:=k; { -}

end;

End;

, - . : ( ) i , i-1. , , , , .. , . , : , ? , -, - m , k. while (P[k]<k), 0, , . k 1 m . , k 2m . , O(m). , .

Program KnutMorrisPrattSearch;

{ Prefix }

var n: longint;

T: array[1..40000] of char;

Begin

{ }

Prefix; { -}

k:=0; { , }

for i:=1 to n do

begin

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

k:=P[k];

if S[k+1]=T[i] then

k:=k+1;

if k=m then { }

begin

writeln(' ',i-m+1,'- ');

k:=P[k];

end;

end;

End.

, , Prefix. , O(n+m), . . .

, -- , . : -- , , . .

P.S. , .

:

, 1
, 2


: - mycm.cm.u

 



<== | ==>
() 6- . | .. - .
:


: 2016-12-05; !; : 1689 |


:

:

, .
==> ...

1265 - | 1228 -


© 2015-2024 lektsii.org - -

: 0.02 .