@Deep-Sea:
Aber ich will mich nicht mit fremden Federn schmücken. Der Teil ist aus den einschlägigen Beispielen für Boyer-Moore entnommen und von mir lediglich an Delphi und die Rückwärtssuche angepaßt worden.
@jbg:
Zitat:
Da ist dein "ein JMP gespart" belanglos, was es ohnehin dank Jump-Optimierung seitens Delphi bereits ist. Delphi erkennt, dass du mit "break" auf ein "goto" springst, und leitet den Sprung direkt weiter ohne den Zwischenstopp. (Einfach mal den Assemblercode im CPU-View anschauen).
Danke, das war mir neu.
@all:
Ich hab mal den "goto-verseuchten" Teil umgeschrieben.
Delphi-Quellcode:
// Good-Suffix-Table vorwärts
FGoodTable[0] := 1;
j := 1;
i := iPLen - 1;
k := 0;
bMatch := False;
while j < iPLen
do
begin
while (i > 0)
and (k <> j)
do
begin
while (k < j)
and (i - k > 0)
and (Pattern[iPLen - k] = Pattern[i - k])
do
begin
bMatch := True;
inc(k);
end;
if (k < j)
then // kein ganzes Suffix gefunden
begin
if i-k <= 0
then
i := 0
// Maximal-Skip
else
begin
if bMatch
then // kein Match mit dieser Länge...weitersuchen
begin
k := 0;
// wieder von vorn
bMatch := False;
end;
Dec(i);
end;
end;
end;
FGoodTable[j] := iPLen - i;
inc(j);
end;