Spezialvorlesung Suchalgorithmen Thema: Zeichenkettensuche und Wörterbücher Stefan Edelkamp Struktur des Buchs Überblick Teilstring-Wörterbücher Suffix-Tries und Suffixbäume Konstruktionsalgorithmus von McCreight Generalisierte Suffixbäume Teilmengen-Wörterbücher Tries Hash Tables Unlimited Branching Tree Suffixbäume Ein String W besitzt genau |W| Endstücke, bestehend aus insgesamt |W| über 2 = O(|W|^2) Zeichen. ergänze alle Worte W um ein spezielles Endsymbol $, und füge Suffixe von dem erweiterten Wort W$ in einem Trie ein Suffixtrie Charakterisierung Satz: Jeder Knoten im Suffixtree für W entspricht genau einem eindeutigem Teilstring. Beweis: Sicherlich entspricht jeder Knoten im Suffixtrie mindestens einem Teilstring von W, da er durch ein Anfangsstück eines Suffixes von W erreicht werden kann. Unterschiedliche Zeichenketten führen in einem Trie aber auch zu unterschiedlichen Knoten. Suffixbaum kompakte Darstellungsform eines Suffixtries, in dem jeder Knoten mit nur einem Nachfolger mit seinem Elter verschmolzen ist. Die durch die Elimination von Knoten mit Grad zwei gewonnene Struktur wird PatriciaBaum genannt (Patricia: Akronym aus practical algorithm to retrieve information coded in alphanumeric) Platzkomplexität Suffixbaum Jeder Knoten im Suffixbaum für W hat mehr als einen Nachfolger und W viele Blätter. Die Kantenbeschriftungen werden als Intervall des zugrundeliegenden Strings an den Knoten verwaltet, auf dem die Kante einläuft O(|W|) Platz Definitionen Partieller Weg: Zusammenhängende, bei der Wurzel beginnende Folge von Kanten. Weg: partieller Weg, der bei einem Blatt endet. Ort einer Zeichenkette m: Knoten im Suffixbaum am Ende des mit m bezeichneten Weges (falls er existiert). Erweiterung einer Zeichenkette m: jede Zeichenkette, die als Präfix hat. Erweiterter Ort einer Zeichenkette m: Ort der kürzesten Erweiterung von m, deren Ort definiert ist. Kontraktierter Ort einer Zeichenkette m: Ort des längsten Präfixes von m, dessen Ort definiert ist. Aufteilung von Strings Suffix sufi ist der an Position i beginnendes Suffix von W mit suf1 = W. String headi ist der längste Präfix von sufi, der auch Präfix von sufj für ein j < i ist und String taili ist festgelegt als sufi − headi, also sufi = headitaili. Beispiel: Sei W = ababc, dann suf3 = abc, head3 = ab, und tail3 = c. Eigenschaften Satz: Jeder innere Knoten t im Suffixbaum für W entspricht dem größten gemeinsamen Präfix zweier Suffixe von W. Beweis: Der größte gemeinsame Präfix p von sufi und sufj von W ist Teilstring von sufi und sufj und bildet einen p beschreibenden Knoten t im Suffixtrie. Die sufi und sufj darstellenden Blätter befinden sich aufgrund der Präfixeigenschaft von p in dem Teilbaum, der durch t beschrieben wird. Angenommen, t wird durch Kontraktion gelöscht. Dann hat t nur einen Nachfolger t‘, der eine Erweiterung p‘ von p repräsentiert. Die Zeichenkette p‘ ist jedoch Präfix von sufi und sufj, Widerspruch zu p größter gemeinsame Präfix. Suffixbaum Konstruktion Naives Verfahren In dem ersten Ansatz beginnen wir mit dem leeren Baum T0. Der Baum Ti+1 entsteht aus Ti durch Einfügen des Suffixes sufi+1. Konstruktionsidee Zur Einfügung von sufi wird Ti+1 kann aus Ti wie folgt konstruiert werden: bestimme den erweiterten Ort von headi+1 in Ti und teile die letzte zu diesem Ort führende Kante durch Einfügen eines neuen Knotens in zwei neue Kanten auf. schaffe ein neues Blatt als Ort für sufi+1. Offenbar sichert das eindeutige Endesymbol $, dass stets taili nicht leer ist. Beispiel Es gibt Beispiele, für die der oben beschriebene Algorithmus O(n^2) viele Schritte benötigt, um einen Suffixbaum zu konstruieren. McCreight‘scher Algorithmus …fußt auf dem sogenannten Suffixlink. Der Suffixlink von dem Ort einer Zeichenkette am, a Σ, mΣ* zeigt auf den Ort von m und wird als als Abkürzung bei der Baumkonstruktion verwendet werden. In Ti haben alle sufj, j < i bereits einen Ort headi ist der längste Präfix von sufi, dessen erweiterter Ort in Ti−1 existiert. Linarzeitalgorithmus Wenn der erweiterte Ort von headi+1 in Ti gefunden ist, kann das Erzeugen eines neuen Knotens und das Aufspalten einer Kante in konstanter Zeit geschehen. Der McCreight‘sche Algorithmus läuft in 2 Phasen. 1. Bestimme headi+1 in konstanter amortisierter Zeit in Ti 2. Füge zusätzliche Suffixlinks ein Lemma Wenn headi = am für ein Symbol a und eine (evtl. leere) Zeichenkette m ist, dann ist m ein Präfix von headi+1. Beweis: Sei headi = am, dann existiert ein j < i, so dass a Präfix von sufi und sufj ist nach der Definition von headi. Also ist m ein Präfix sowohl von sufi+1 als auch von sufj+1. Invarianten Beachte Ort von m kann niemals im Teilbaum mit Wurzel beim Ort von am liegen, da in diesem Teilbaum nur Erweiterungen von am liegen. (I1) Alle inneren Knoten von Ti−1 haben einen korrekten Suffix-Zeiger in Ti. (I2) Bei der Konstruktion von Ti wird der kontraktierte Ort von headi in Ti−1 besucht. Offensichtlich gelten beide Bedingungen für i = 1. Ist i > 1, so folgt aus (I2), dass man die Konstruktion von Ti+1 aus Ti beim kontraktierten Ort von headi in Ti−1 beginnen kann. Blick mit der Lupe Ist headi nicht leer, so bezeichnet αi die Konkatenation der Kantenbeschriftungen des Weges zum kontraktierten Ort von headi ohne den ersten Buchstaben ai.Ferner sei βi = headi − ai αiIst headi nicht leer, haben wir in Ti: headi+1 = αiβi γi+1. Schritt 1 des Algorithmus Einfügen des Ortes von headi+1 Schritt 2 des Algorithmus Einfügen des Suffix-Zeigers für den Ort von headi. In einer Implementierung werden natürlich Schritt 1 und 2 in einander verflochten. Beispiel W=bbbbbababbbaabbbbbc Konstruktion von T14 as T13 Durch Einfügen von suf14=bbbbbc Korrektheit Satz: Falls der Ort von αiβi in Ti nicht existiert, dann ist headi+1 = αiβi , d.h. γi+1 ist leer Beweis (Fortführung) Laufzeitanalyse Der Algorithmus von McCreight liefert in Zeit O(|W|) einen Suffixbaum für W. Analyse Rescanning (Fortführung) Analyse Scanning Beispiel für Konstruktion Beispiel (Fortführung) Generalisierte Suffixbäume Patricia–Baum S für alle Suffixe von m1$1,…,mk$k (mögliche Ersetzung $i durch $). Anzahl der Knoten durch die Summe der Stringlängenbeschränkt. Einfügen eines Strings Löschen eines Strings Nutzt „Zwillingsknotenstruktur“ Komplexität Sei S der generalisierten Suffixbaum nach einer beliebigen Anzahl von Einfüge- und Löschoperationen gespeichert sind und D die Summe der Längen aller gespeicherter Strings. Speicherplatz in O(D) Zeit O(|m|) für jede Einzeloperation auf m Teilmengen-Wörterbücher Sei D eine Menge von n Teilmengen von U. Das Subset (Containment) Query Problem fragt für eine gegebene Anfragemenge q D ob es ein p D gibt mit q p (p q). Ein Teilmengen-Wörterbuch ist eine Datenstrukture die Einfügen von Teilmengen von D erlaubt, und Subset und Containment Queries unterstützt. Partial Match Problem Sei * ein „don’t care“ Zeichen, dass jedem Zeichen eines gegebnen Alphabets entspricht. Gegeben eine Menge D von n Vektoren über einem Alphabet Σ, fragt das Partial Match nach einer Datenstruktur, die für jede Anfrage q Σ {*} feststellt, ob es einen Eintrag p in D gibt, so dass q auf des Wort p passt. Äquivalenz Das Partial-Match Problem ist äquivalent zu dem Subset Query Problem Beweis: Tries für Partial Match Hash-Table für Partial Match Alle möglichen Elemente werden gehashed Unlimited Branching Tree für Subset und Containment Query Operationen auf UBTs