TU Wien:Algorithmen und Datenstrukturen 2 VU (Raidl)/Knuth-Morris-Pratt Boyer-More Hilfsskripte
Zur Navigation springen
Zur Suche springen
- AD2 SS13
- Übung 2 UE2
Knuth-Morris-Pratt[Bearbeiten | Quelltext bearbeiten]
initNext[Bearbeiten | Quelltext bearbeiten]
laut Skriptum, python implementation
def initNext(P): P = " "+P next = list() for x in range(0, len(P)): next.append(0) next[1] = 0 l = 0 for q in range(2, len(P)): while (l > 0 ) and (P[l+1] != P[q]): l = next[l] if P[l+1] == P[q]: l = l+1 next[q] = l return next[1:]
aufzurufen
Pattern = "DBDDBDBD" next = initNext(Pattern)
Boyer-More[Bearbeiten | Quelltext bearbeiten]
initSuffix[Bearbeiten | Quelltext bearbeiten]
berechnet suffix array mithilfe der initNext funktion, gibt dabei alle notwendigen rechenschritte übungsfreundlich aus.
- depends on initNext(P)
def initSuffix(P): print "initSuffix(%s)" % P P = " "+P i = len(P)-1 Pinv = " " suffix = [0] while i > 0: Pinv = Pinv + P[i] suffix.append(0) i = i-1 next = initNext(P) print "next is: " print next nextInv = initNext(Pinv) print "next inverted is: " print nextInv #print next, nextInv M = len(P)-1 for j in range(1, len(P)): suffix[j] = M - next[M-1] print "suffix an der stelle %d ist M - next[%d] = %d" % (j, M, suffix[j]) print "" for q in range(1, M+1): print "fuer q = %d" % q j = M - nextInv[q-1] print "j = M - nextInv[%d] = %d - %d = %d" % (q, M, nextInv[q-1], j) if suffix[j] > (q - nextInv[q-1]): print " suffix[%d] > (%d - nextInv[%d]) " % (j, q, q) print " %d > (%d - %d) " % (suffix[j], q, nextInv[q-1]) suffix[j] = q - nextInv[q-1] print " >>> suffix[%d] = %d" % (j, (q-nextInv[q-1])) print "" return suffix[1:]
aufruf in python
Pattern = "BBACAC" print initSuffix(Pattern)
beware of bugs in the above code, only proved it correct not tried it, maxl