Technopedia Center
PMB University Brochure
Faculty of Engineering and Computer Science
S1 Informatics S1 Information Systems S1 Information Technology S1 Computer Engineering S1 Electrical Engineering S1 Civil Engineering

faculty of Economics and Business
S1 Management S1 Accountancy

Faculty of Letters and Educational Sciences
S1 English literature S1 English language education S1 Mathematics education S1 Sports Education
  • Registerasi
  • Brosur UTI
  • Kip Scholarship Information
  • Performance
  1. Weltenzyklopädie
  2. Baeza-Yates-Gonnet-Algorithmus – Wikipedia
Baeza-Yates-Gonnet-Algorithmus – Wikipedia 👆 Click Here!
aus Wikipedia, der freien Enzyklopädie
(Weitergeleitet von Shift-Or-Algorithmus)

Der Baeza-Yates-Gonnet-Algorithmus bzw. Shift-or-Algorithmus, der auch unter den Namen Shift-and oder Bitap bekannt ist, löst das String-Matching-Problem, indem er einen nichtdeterministischen Automaten simuliert. Unter anderem wird eine Abwandlung dieses Algorithmus bei dem Unix-Tool grep benutzt.

Da die Implementierung auf Bit-Operationen zurückgeführt werden kann, ist der Algorithmus alleine von der Ausführung her bereits sehr effizient. Kombiniert man dies mit dem zu Grunde liegenden System (im Preprocessing einmal Schleife über das Muster, während der Suche einmal Schleife über den Text) ergibt sich ein extrem effizienter Algorithmus.

Grundlage

[Bearbeiten | Quelltext bearbeiten]

Grundlage des Algorithmus bildet eine Menge von Vektoren R j {\displaystyle R_{j}} {\displaystyle R_{j}} mit folgender Definition:

R j + 1 [ i ] = { 1 , falls  i = 0 1 , falls  R j [ i − 1 ] = 1  und  M u s t e r z e i c h e n i = E i n g a b e z e i c h e n j + 1 0 sonst {\displaystyle R_{j+1}[i]={\begin{cases}1,&{\mbox{falls }}i=0\\1,&{\text{falls }}R_{j}[i-1]=1{\text{ und }}\mathrm {Musterzeichen} _{i}=\mathrm {Eingabezeichen} _{j+1}\\0&{\text{sonst}}\end{cases}}} {\displaystyle R_{j+1}[i]={\begin{cases}1,&{\mbox{falls }}i=0\\1,&{\text{falls }}R_{j}[i-1]=1{\text{ und }}\mathrm {Musterzeichen} _{i}=\mathrm {Eingabezeichen} _{j+1}\\0&{\text{sonst}}\end{cases}}}

Anschaulich bedeutet dies, dass R j [ i ] {\displaystyle R_{j}[i]} {\displaystyle R_{j}[i]} genau dann 1 {\displaystyle 1} {\displaystyle 1} ist, wenn nach der Verarbeitung von j {\displaystyle j} {\displaystyle j} Zeichen des Textes die letzten i {\displaystyle i} {\displaystyle i} Zeichen mit den ersten i {\displaystyle i} {\displaystyle i} Zeichen des Suchmusters übereinstimmen.

Ein Treffer für ein Suchmuster mit Länge m {\displaystyle m} {\displaystyle m} ist demnach gefunden, falls R j [ m ] = 1 {\displaystyle R_{j}[m]=1} {\displaystyle R_{j}[m]=1}.

Weiterhin werden die charakteristischen Vektoren für alle möglicherweise im Text vorkommenden Zeichen benötigt:

s a [ i ] = { 1 , falls im Suchmuster an Stelle  i  das Zeichen  a  steht 0 sonst {\displaystyle s_{a}[i]={\begin{cases}1,&{\text{falls im Suchmuster an Stelle }}i{\text{ das Zeichen }}a{\text{ steht}}\\0&{\text{sonst}}\end{cases}}} {\displaystyle s_{a}[i]={\begin{cases}1,&{\text{falls im Suchmuster an Stelle }}i{\text{ das Zeichen }}a{\text{ steht}}\\0&{\text{sonst}}\end{cases}}}

Beispiel:

Suchmuster a b c a c {\displaystyle abcac} {\displaystyle abcac}, Länge m = 5 {\displaystyle m=5} {\displaystyle m=5}

Charakteristische Vektoren:

s a s b s c s d . . . a 1 0 0 0 . . . b 0 1 0 0 . . . c 0 0 1 0 . . . a 1 0 0 0 . . . c 0 0 1 0 . . . {\displaystyle {\begin{matrix}&s_{a}&s_{b}&s_{c}&s_{d}&...\\a&1&0&0&0&...\\b&0&1&0&0&...\\c&0&0&1&0&...\\a&1&0&0&0&...\\c&0&0&1&0&...\end{matrix}}} {\displaystyle {\begin{matrix}&s_{a}&s_{b}&s_{c}&s_{d}&...\\a&1&0&0&0&...\\b&0&1&0&0&...\\c&0&0&1&0&...\\a&1&0&0&0&...\\c&0&0&1&0&...\end{matrix}}}

Ablauf (exaktes Matching)

[Bearbeiten | Quelltext bearbeiten]

Um den Ablauf zu vereinfachen, wird zunächst eine spezielle Bit-Operation Bitshift bzw. ≫ {\displaystyle \gg } {\displaystyle \gg } für den Vektor R {\displaystyle R} {\displaystyle R} eingeführt: R = 0 0 0 0 0 ⟶ B i t s h i f t 1 0 0 0 0 ⟶ B i t s h i f t 1 1 0 0 0 ⟶ B i t s h i f t 1 1 1 0 0 {\displaystyle R={\begin{matrix}0\\0\\0\\0\\0\end{matrix}}\quad {\stackrel {\mathrm {Bitshift} }{\longrightarrow }}\quad {\begin{matrix}1\\0\\0\\0\\0\end{matrix}}\quad {\stackrel {\mathrm {Bitshift} }{\longrightarrow }}\quad {\begin{matrix}1\\1\\0\\0\\0\end{matrix}}\quad {\stackrel {\mathrm {Bitshift} }{\longrightarrow }}\quad {\begin{matrix}1\\1\\1\\0\\0\end{matrix}}} {\displaystyle R={\begin{matrix}0\\0\\0\\0\\0\end{matrix}}\quad {\stackrel {\mathrm {Bitshift} }{\longrightarrow }}\quad {\begin{matrix}1\\0\\0\\0\\0\end{matrix}}\quad {\stackrel {\mathrm {Bitshift} }{\longrightarrow }}\quad {\begin{matrix}1\\1\\0\\0\\0\end{matrix}}\quad {\stackrel {\mathrm {Bitshift} }{\longrightarrow }}\quad {\begin{matrix}1\\1\\1\\0\\0\end{matrix}}}

Der Algorithmus für exakte Übereinstimmungen lässt sich nun auf wenige einfache Schritte reduzieren:

  1. Initialisiere den R {\displaystyle R} {\displaystyle R}-Vektor mit 0 (für alle Positionen) und beginne mit dem ersten Zeichen des zu durchsuchenden Textes
  2. Verschiebe alle Bits in R {\displaystyle R} {\displaystyle R} mittels Bitshift um eine Position nach rechts.
  3. Führe eine U N D {\displaystyle UND} {\displaystyle UND}-Verknüpfung von R {\displaystyle R} {\displaystyle R} und dem charakteristischen Vektor des aktuellen Textzeichens durch.
  4. Gehe zum nächsten Textzeichen. Falls Ende erreicht, breche ab, sonst gehe zu (2)

Die Schritte (2) und (3) führen bei genauer Betrachtung genau die Berechnungsvorschrift für R {\displaystyle R} {\displaystyle R} aus: Durch das Shiften wird aus dem „alten“ R {\displaystyle R} {\displaystyle R} das Zeichen an Stelle i {\displaystyle i} {\displaystyle i} an die Stelle i + 1 {\displaystyle i+1} {\displaystyle i+1} angelegt (entspricht in Kombination mit U N D {\displaystyle UND} {\displaystyle UND} der Bedingung R j [ i ] = 1 {\displaystyle R_{j}[i]=1} {\displaystyle R_{j}[i]=1}). Der charakteristische Vektor des aktuellen Textzeichens enthält an der Stelle i + 1 {\displaystyle i+1} {\displaystyle i+1} genau dann eine 1 {\displaystyle 1} {\displaystyle 1}, falls Muster und Text hier übereinstimmen. Durch das U N D {\displaystyle UND} {\displaystyle UND} werden beide Bedingungen verknüpft.

Beispiel (exaktes Matching)

[Bearbeiten | Quelltext bearbeiten]

Muster: a b c a c {\displaystyle abcac} {\displaystyle abcac}, m = 5 {\displaystyle m=5} {\displaystyle m=5}

Text: a b c a b c a c {\displaystyle abcabcac} {\displaystyle abcabcac}

| i ∖ R 0 ≫ s a R 1 1 0 1 1 1 2 0 0 0 0 3 0 0 0 0 4 0 0 1 0 5 0 0 0 0 | | ≫ s b R 2 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 | | ≫ s c R 3 1 0 0 0 0 0 1 1 1 0 0 0 0 1 0 | | ≫ s a R 4 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 | | ≫ s b R 5 1 0 0 1 1 1 0 0 0 0 0 0 1 0 0 | | ≫ s c R 6 1 0 0 0 0 0 1 1 1 0 0 0 0 1 0 | | ≫ s a R 7 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 | | ≫ s c R 8 1 0 0 1 0 0 0 1 0 0 0 0 1 1 1 | {\displaystyle {\begin{vmatrix}i\setminus &R_{0}&\gg &s_{a}&R_{1}\\1&0&1&1&1\\2&0&0&0&0\\3&0&0&0&0\\4&0&0&1&0\\5&0&0&0&0\end{vmatrix}}{\begin{vmatrix}\gg &s_{b}&R_{2}\\1&0&0\\1&1&1\\0&0&0\\0&0&0\\0&0&0\end{vmatrix}}{\begin{vmatrix}\gg &s_{c}&R_{3}\\1&0&0\\0&0&0\\1&1&1\\0&0&0\\0&1&0\end{vmatrix}}{\begin{vmatrix}\gg &s_{a}&R_{4}\\1&1&1\\0&0&0\\0&0&0\\1&1&1\\0&0&0\end{vmatrix}}{\begin{vmatrix}\gg &s_{b}&R_{5}\\1&0&0\\1&1&1\\0&0&0\\0&0&0\\1&0&0\end{vmatrix}}{\begin{vmatrix}\gg &s_{c}&R_{6}\\1&0&0\\0&0&0\\1&1&1\\0&0&0\\0&1&0\end{vmatrix}}{\begin{vmatrix}\gg &s_{a}&R_{7}\\1&1&1\\0&0&0\\0&0&0\\1&1&1\\0&0&0\end{vmatrix}}{\begin{vmatrix}\gg &s_{c}&R_{8}\\1&0&0\\1&0&0\\0&1&0\\0&0&0\\1&1&1\end{vmatrix}}} {\displaystyle {\begin{vmatrix}i\setminus &R_{0}&\gg &s_{a}&R_{1}\\1&0&1&1&1\\2&0&0&0&0\\3&0&0&0&0\\4&0&0&1&0\\5&0&0&0&0\end{vmatrix}}{\begin{vmatrix}\gg &s_{b}&R_{2}\\1&0&0\\1&1&1\\0&0&0\\0&0&0\\0&0&0\end{vmatrix}}{\begin{vmatrix}\gg &s_{c}&R_{3}\\1&0&0\\0&0&0\\1&1&1\\0&0&0\\0&1&0\end{vmatrix}}{\begin{vmatrix}\gg &s_{a}&R_{4}\\1&1&1\\0&0&0\\0&0&0\\1&1&1\\0&0&0\end{vmatrix}}{\begin{vmatrix}\gg &s_{b}&R_{5}\\1&0&0\\1&1&1\\0&0&0\\0&0&0\\1&0&0\end{vmatrix}}{\begin{vmatrix}\gg &s_{c}&R_{6}\\1&0&0\\0&0&0\\1&1&1\\0&0&0\\0&1&0\end{vmatrix}}{\begin{vmatrix}\gg &s_{a}&R_{7}\\1&1&1\\0&0&0\\0&0&0\\1&1&1\\0&0&0\end{vmatrix}}{\begin{vmatrix}\gg &s_{c}&R_{8}\\1&0&0\\1&0&0\\0&1&0\\0&0&0\\1&1&1\end{vmatrix}}}

Da R 8 [ 5 ] = 1 {\displaystyle R_{8}[5]=1} {\displaystyle R_{8}[5]=1} liegt ein Treffer bei 8 − 5 + 1 {\displaystyle 8-5+1} {\displaystyle 8-5+1} (Position − Musterlänge + Korrektur für erstes Zeichen) vor.

Erweiterung (approximatives Matching)

[Bearbeiten | Quelltext bearbeiten]

Der Algorithmus kann durch leichte Modifikationen eine fehlertolerante Suche durchführen. Hierfür wird der Vektor R {\displaystyle R} {\displaystyle R} aufgeteilt:

  1. R j 0 [ i ] {\displaystyle R_{j}^{0}[i]} {\displaystyle R_{j}^{0}[i]}: entspricht dem vorherigen R j [ i ] {\displaystyle R_{j}[i]} {\displaystyle R_{j}[i]}; Der Index 0 {\displaystyle 0} {\displaystyle 0} steht für die Anzahl der aufgetretenen Fehler.
  2. R j 1 [ i ] {\displaystyle R_{j}^{1}[i]} {\displaystyle R_{j}^{1}[i]}: Bezeichnet einen R {\displaystyle R} {\displaystyle R}-Vektor, der auf Treffer mit maximal einem Fehler ausgerichtet ist.
  3. ...
  4. R j k [ i ] {\displaystyle R_{j}^{k}[i]} {\displaystyle R_{j}^{k}[i]}: Bezeichnet einen R {\displaystyle R} {\displaystyle R}-Vektor, der auf Treffer mit maximal k {\displaystyle k} {\displaystyle k} Fehlern ausgerichtet ist.

Achtung: Bei den fehlerbehafteten Vektoren ist die obige Interpretation mit „nach j Zeichen stimmen die letzten i mit den ersten i des Musters überein“ schwierig und nicht mehr unbedingt einleuchtend.

Die Berechnungsvorschrift für R j 0 [ i ] {\displaystyle R_{j}^{0}[i]} {\displaystyle R_{j}^{0}[i]} bleibt unverändert. Für Fehlervektoren R j + 1 k {\displaystyle R_{j+1}^{k}} {\displaystyle R_{j+1}^{k}}wird nach der verursachenden Aktion unterschieden:

Einfügen eines Zeichens in das Suchmuster

[Bearbeiten | Quelltext bearbeiten]

R j + 1 k = ( B i t s h i f t ( R j k )   ∧   s x ) ∨   R j k − 1 {\displaystyle R_{j+1}^{k}=({\mathit {Bitshift}}(R_{j}^{k})\ \wedge \ s_{x})\quad \vee \ R_{j}^{k-1}} {\displaystyle R_{j+1}^{k}=({\mathit {Bitshift}}(R_{j}^{k})\ \wedge \ s_{x})\quad \vee \ R_{j}^{k-1}}

Erläuterung: Der erste Teil des Ausdrucks beschreibt den Fall, dass bereits k {\displaystyle k} {\displaystyle k} Fehler vorhanden sind, aber das aktuelle Zeichen von Text und Muster übereinstimmen. Der zweite Teil beschreibt den Fehlerfall: Bisher (in j {\displaystyle j} {\displaystyle j}) lagen nur k − 1 {\displaystyle k-1} {\displaystyle k-1} Fehler vor, das aktuelle Zeichen kann also in das Muster eingefügt werden.

Interpretation: R j k [ i ] = 1 {\displaystyle R_{j}^{k}[i]=1} {\displaystyle R_{j}^{k}[i]=1}, falls nach j {\displaystyle j} {\displaystyle j} Zeichen der Eingabe von den letzten i + k {\displaystyle i+k} {\displaystyle i+k} Zeichen mindestens i {\displaystyle i} {\displaystyle i} Zeichen mit dem Suchmuster übereinstimmen und der Rest durch Einfügen der fehlenden Zeichen zur Übereinstimmung gebracht werden kann.

Löschen eines Zeichens aus dem Suchmuster

[Bearbeiten | Quelltext bearbeiten]

R j + 1 k = ( B i t s h i f t ( R j k )   ∧   s x ) ∨   B i t s h i f t ( R j + 1 k − 1 ) {\displaystyle R_{j+1}^{k}=({\mathit {Bitshift}}(R_{j}^{k})\ \wedge \ s_{x})\quad \vee \ {\mathit {Bitshift}}(R_{j+1}^{k-1})} {\displaystyle R_{j+1}^{k}=({\mathit {Bitshift}}(R_{j}^{k})\ \wedge \ s_{x})\quad \vee \ {\mathit {Bitshift}}(R_{j+1}^{k-1})}

Erläuterung: Der erste Teil des Ausdrucks beschreibt den Fall, dass bereits k {\displaystyle k} {\displaystyle k} Fehler vorhanden sind, aber das aktuelle Zeichen von Text und Muster übereinstimmen. Der zweite Teil beschreibt den Fehlerfall: Schaut man sich bei j + 1 {\displaystyle j+1} {\displaystyle j+1} Zeichen des Textes nicht die ersten i {\displaystyle i} {\displaystyle i} Zeichen an, sondern nur die ersten i − 1 {\displaystyle i-1} {\displaystyle i-1} (im Vektor die Position darüber), so stimmt das Muster bis auf k − 1 {\displaystyle k-1} {\displaystyle k-1} Fehler überein. Das i . {\displaystyle i.} {\displaystyle i.} Zeichen des Musters wird daraufhin einfach gelöscht.

Ersetzen eines Zeichens im Muster

[Bearbeiten | Quelltext bearbeiten]

R j + 1 k = ( B i t s h i f t ( R j k )   ∧   s x ) ∨   B i t s h i f t ( R j k − 1 ) {\displaystyle R_{j+1}^{k}=({\mathit {Bitshift}}(R_{j}^{k})\ \wedge \ s_{x})\quad \vee \ {\mathit {Bitshift}}(R_{j}^{k-1})} {\displaystyle R_{j+1}^{k}=({\mathit {Bitshift}}(R_{j}^{k})\ \wedge \ s_{x})\quad \vee \ {\mathit {Bitshift}}(R_{j}^{k-1})}

Erläuterung: Der erste Teil des Ausdrucks beschreibt den Fall, dass bereits k {\displaystyle k} {\displaystyle k} Fehler vorhanden sind, aber das aktuelle Zeichen von Text und Muster übereinstimmen. Der zweite Teil beschreibt den Fehlerfall: Nach j {\displaystyle j} {\displaystyle j} Zeichen stimmten die letzten i − 1 {\displaystyle i-1} {\displaystyle i-1} Zeichen überein. Ersetzt man nun also das i . {\displaystyle i.} {\displaystyle i.} Zeichen im Muster durch das j + 1. {\displaystyle j+1.} {\displaystyle j+1.} Zeichen des Textes, stimmen auch nach j + 1 {\displaystyle j+1} {\displaystyle j+1} Zeichen die letzten i {\displaystyle i} {\displaystyle i} Zeichen mit den ersten i {\displaystyle i} {\displaystyle i} Zeichen des „neuen“ Musters überein.

Die Varianten können mittels bitweisem oder beliebig verknüpft werden.

Literatur

[Bearbeiten | Quelltext bearbeiten]
  • Ricardo A. Baeza-Yates, Gaston H. Gonnet: A New Approach to Text Searching. In: Communications of the ACM. Band 35, Nr. 10, Oktober 1992, ISSN 0001-0782, S. 74–82, doi:10.1145/135239.135243. 

Weblinks

[Bearbeiten | Quelltext bearbeiten]
  • StringSearch – high-performance pattern matching algorithms in Java (Implementierungen des Shift-Or-Algorithmus in Java; englisch)
  • BNDM-Algorithmus (PDF; 289 kB)
Abgerufen von „https://de.teknopedia.teknokrat.ac.id/w/index.php?title=Baeza-Yates-Gonnet-Algorithmus&oldid=214456308“
Kategorien:
  • Suchalgorithmus
  • Dynamische Programmierung

  • indonesia
  • Polski
  • العربية
  • Deutsch
  • English
  • Español
  • Français
  • Italiano
  • مصرى
  • Nederlands
  • 日本語
  • Português
  • Sinugboanong Binisaya
  • Svenska
  • Українська
  • Tiếng Việt
  • Winaray
  • 中文
  • Русский
Sunting pranala
Pusat Layanan

UNIVERSITAS TEKNOKRAT INDONESIA | ASEAN's Best Private University
Jl. ZA. Pagar Alam No.9 -11, Labuhan Ratu, Kec. Kedaton, Kota Bandar Lampung, Lampung 35132
Phone: (0721) 702022
Email: pmb@teknokrat.ac.id