Einzelnen Beitrag anzeigen

Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
878 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: entwickeltes boyer-moore program läuft nich

  Alt 7. Apr 2008, 20:45
Woher hast du denn diese Methode? Abgesehen davon, dass da diverse Variablen nicht initialisiert wurden und die Einrückung komplett chaotisch ist, fehlen da mindestens ein paar begins und ends. Die Schleifen und If-Konstrukte laufen irgendwie ins Leere.

Und das wichtigste: Das ist nicht Boyer-Moore, allenfalls eine Variante von Boyer-Moore-Horspool. Da fehlt nämlich die Good-Suffix-Strategie

Hier mal eine Implementierung von mir - die Good-Suffix-Regel ist auskommentiert.
Delphi-Quellcode:
function Search_BM(t,p: String): Integer;
var BC: Array[Char] of Integer;
    j, k, m, n: Integer;
    c: Char;
// j: Durchlaufvariable für das Muster
// k: Durchlaufvariable für den Text
// m: Musterlänge
// n: Textlänge
begin
  m := Length(p);
  n := Length(t);
  
  // Vorbereitung
  for c := low(char) to High(Char) do BC[c] := m;
  for j := 1 to m do BC[p[j]] := m-j;
  (* GS := PreProcess_BM_GoodSuffix(p); *)

  // Suche
  k := m;
  result := 0;

  while k <= n do
  begin
    j := 0;
    while (j < m) and (p[m-j] = t[k-j]) do
      inc(j);
    if (j = m) then
    begin
      result := k-j + 1;
      break;
      // Falls weitere Vorkommen gesucht werden sollen:
      // statt break:
      // Vorkommen "irgendwie ausgeben" und
      // k := k + m; //alle nicht überlappenden Vorkommen finden
      // k := k + 1; //alle Vorkommen finden
    end else
      k := k + (*max( GS[m-j],*) max(1, BC[t[k-j]] - j) (*)*);
  end;
Noch ein Edit: Tu dir selbst einen Gefallen, und lies nicht den deutschen Wikipedia-Artikel zu diesem Algorithmus. Die Good-Suffix-Regel ist dort unvollständig, und bei dieser Beschreibung des Algos ist die Laufzeit von O(n) im Worst-Case falsch (die ist dann nämlich O(nm)). Diesen Wiki-Artikel kann man komplett in die Tonne kloppen. Der englische ist schon besser - und da steht ne Qualitätswarnung bei.
  Mit Zitat antworten Zitat