code/kmp.code
author lindenmannm
Tue, 08 Mar 2011 21:11:05 +0100
changeset 12 8e872e077a21
permissions -rw-r--r--
fs ml
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;