author | lindenmannm |
Tue, 08 Mar 2011 21:11:05 +0100 | |
changeset 12 | 8e872e077a21 |
permissions | -rw-r--r-- |
lindenmannm@3 | 1 |
KMP := proc (T::string, P::string) |
lindenmannm@3 | 2 |
# Input: Text T und Muster P |
lindenmannm@3 | 3 |
# Output: Liste L mit Verschiebungen i, |
lindenmannm@3 | 4 |
# an denen P in T vorkommt |
lindenmannm@3 | 5 |
n := length (T); m := length(P); |
lindenmannm@3 | 6 |
L := []; next := KMPnext(P); |
lindenmannm@3 | 7 |
j := 0; |
lindenmannm@3 | 8 |
for i from 1 to n do |
lindenmannm@3 | 9 |
whilej>0and T[i]!=P[j+1] |
lindenmannm@3 | 10 |
do j := next [j] od; |
lindenmannm@3 | 11 |
if T[i] = P[j+1] then j := j+1 fi; |
lindenmannm@3 | 12 |
if j = m then |
lindenmannm@3 | 13 |
L := [L[] , i-m]; |
lindenmannm@3 | 14 |
j := next [j] |
lindenmannm@3 | 15 |
fi; |
lindenmannm@3 | 16 |
od; |
lindenmannm@3 | 17 |
RETURN (L); |
lindenmannm@3 | 18 |
end; |
lindenmannm@3 | 19 |
|
lindenmannm@3 | 20 |
KMPnext := proc (P : : string) |
lindenmannm@3 | 21 |
#Input : Muster P |
lindenmannm@3 | 22 |
#Output : next-Array für P |
lindenmannm@3 | 23 |
m := length (P); |
lindenmannm@3 | 24 |
next := array (1..m); |
lindenmannm@3 | 25 |
next [1] := 0; |
lindenmannm@3 | 26 |
j := 0; |
lindenmannm@3 | 27 |
for i from 2 to m do |
lindenmannm@3 | 28 |
while j > 0 and P[i] <> P[j+1] |
lindenmannm@3 | 29 |
do j := next [j] od; |
lindenmannm@3 | 30 |
if P[i] = P[j+1] then j := j+1 fi; |
lindenmannm@3 | 31 |
next [i] := j |
lindenmannm@3 | 32 |
od; |
lindenmannm@3 | 33 |
RETURN (next); |
lindenmannm@3 | 34 |
end; |