260 likes | 350 Views
Das LCA – Problem in Suffixbäumen. Überblick. Definitionen Anwendungen Voraussetzungen Preprocessing Beantworten von LCA – Anfragen in konstanter Zeit. Definitionen. Ein Suffixbaum T für einen String S (|S| = n) ist ein Baum mit n Blättern, markiert mit 1, …, n
E N D
Überblick • Definitionen • Anwendungen • Voraussetzungen • Preprocessing • Beantworten von LCA – Anfragen in konstanter Zeit K. Swist
Definitionen • Ein Suffixbaum T für einen String S (|S| = n) ist ein Baum mit • n Blättern, markiert mit 1, …, n • Kanten, beschriftet mit nichtleeren Substrings von S • innere Knoten haben mind. 2 Kinder • Alle Label der Kanten von einem Knoten aus beginnenmit unterschiedlichen Zeichen. • Konkatenation der Label der Kanten auf einem Pfad von derWurzel zu einem Blatt i ist gleich S[i... n] (also das Suffix von S,das an Position i startet.). e banane n an 6 1 ane e e 5 2 4 ane 3 K. Swist
u v Definitionen • Ein Knoten u ist Vorfahre eines Knotens v, wenn u sich auf dem Pfad von der Wurzel zu v befindet. • Insbesondere ist jeder Knoten Vorfahre von sich selbst. • Ein echter Vorfahre von v ist ein Vorfahre, der nicht v selbst ist. K. Swist
lca(x, y) x y Definitionen • Der tiefste gemeinsame Vorfahre (lowest common ancestor, lca) zweier Knoten x und y ist • der tiefste Knoten in T, • der sowohl Vorfahre von x, als auch von y ist. K. Swist
Definitionen • Ein vollständiger binärer Baum B ist ein Baum, in dem jeder innere Knoten genau zwei Kinder hat. K. Swist
Überblick • Definitionen • Anwendungen • Voraussetzungen • Preprocessing • Beantworten von lca – Anfragen in konstanter Zeit K. Swist
Anwendungen • Longest common extension • gegeben zwei Strings S1 und S2 • finde zu beliebigen Indexpaaren (i, j) den längsten Match von S1[i..] und S2[j..] • Palindrome • gegeben ein String S • finde alle maximalen Palindrome in S • Komplementäre Palindrome K. Swist
Überblick • Definitionen • Anwendungen • Voraussetzungen • Preprocessing • Beantworten von lca – Anfragen in konstanter Zeit K. Swist
Voraussetzungen für den Algorithmus • Operationen in O(1) Zeit auf Zahlen der Länge O(log n): • lesen, schreiben, adressieren von Zahlen • vergleichen, addieren, subtrahieren, multiplizieren, dividieren von zwei Zahlen • Bitoperationen: AND, OR, XOR • shift rechts, links • Erzeugen einer Maske von aufeinander folgenden Einsen • Finden der am weitesten rechts oder links liegenden Eins in einer Binärzahl K. Swist
Überblick • Definitionen • Anwendungen • Voraussetzungen • Preprocessing • Beantworten von lca – Anfragen in konstanter Zeit K. Swist
001 1 010 100 2 4 101 110 011 3 5 6 Preprocessing – Umwandeln von T in einen vollständigen Binärbaum B • Depth – first search numbers: Nummerieren der Knoten eines Baumes T nach ihrem Auftreten bei der Tiefensuche: K. Swist
001 1 010 100 2 4 101 110 011 3 5 6 Preprocessing – h(v) • Für jede Nummer v bezeichnet h(v) die Position (von rechts) des ersten 1 – Bits in der Binärdarstellung von v. h(1) = 1 h(2) = 2 h(3) = 1 h(4) = 3 h(5) = 1 h(6) = 2 K. Swist
001 1 010 100 2 4 101 110 011 3 5 6 Preprocessing – I(v) • Für einen Knoten v in T bezeichnet I(v) den Knoten w in T, sodass h(w) maximal über alle Knoten im Unterbaum unter v ist. h(1) = 1 I(1) = 4 h(2) = 2 I(2) = 2 h(3) = 1 I(3) = 3 h(4) = 3 I(4) = 4 h(5) = 1 I(5) = 5 h(6) = 2 I(6) = 6 K. Swist
001 1 010 100 2 4 110 101 011 3 5 6 Preprocessing - Gruppen • Eine Gruppe besteht jeweils aus allen Knoten, die den gleichen I – Wert haben. Der Kopf einer Gruppe ist der Knoten, der am nächsten zur Wurzel liegt. I(1) = 4 I(2) = 2 I(3) = 3 I(4) = 4 I(5) = 5 I(6) = 6 K. Swist
Preprocessing • Sei B ein vollständiger binärer Baum mit Knotentiefe d = log2n – 1. (n = Anzahl der Knoten im Suffixbaum T) • Sei p die Anzahl der Blätter von B. • Jeder Knoten v bekommt eine (log2p)+1 Bit lange Pfadnummer, die eindeutig den Pfad von der Wurzel zu v angibt. K. Swist
100 4 010 110 2 6 001 111 1 3 5 7 011 101 Preprocessing - Pfadnummern • Von links gezählt bezieht sich das i – te Bit auf den i – ten Knoten auf dem Pfad von der Wurzel zu v: • 0 bedeutet Verzweigung nach links, 1 nach rechts • Jede Pfadnummer wirddann zu (log2p)+1 Bitsaufgefüllt, indem rechtseine Eins angehängt wirdund entsprechend viele Nullen. K. Swist
100 4 010 110 2 6 001 111 1 3 5 7 011 101 Preprocessing - Pfadnummern • Pfadnummern könnenauch rekursiv vergebenwerden: nummerierezuerst rekursiv das linkeKind, dann die Wurzel,dann rekursiv dasrechte Kind. • Bei der Konstruktion vonB werden nur die Knotenbezeichnet, auf die einKnoten aus T abgebildetwird (also nur die Nummern,die als I – Wert inT vorkommen). K. Swist
Preprocessing - Av • Av ist eine O(log n) Bit lange Zahl, wobei • Bit Av(i) = 1 gdw. Knoten v hat einen Vorfahren in T, der auf Tiefe i in B abgebildet wird • d. h. v hat einen Vorfahren u, sodass h(I(u)) = i. I(1) = 4 h(1) = 1 A1 = 001 I(2) = 2 h(2) = 2 A2 = 011 I(3) = 3 h(3) = 1 A3 = 111 I(4) = 4 h(4) = 3 A4 = 001 I(5) = 5 h(5) = 1 A5 = 101 I(6) = 6 h(6) = 2 A6 = 011 K. Swist
Preprocessing - Algorithmus Eingabe: ein Baum T mit n Knoten • Tiefensuche in T: • Vergeben der depth – first search numbers • Berechnen von h(v) für jeden Knoten v • Setze für jeden Knoten einen Pointer auf seinen Vater • Bottom – up Algorithmus • Berechne I(v) für jeden Knoten v • Für jede Nummer k, sodass ein v existiert mit I(v) = k, setze L(k) als Pointer auf den Kopf der Gruppe, die Knoten k enthält • Erzeuge den kompletten binären Baum B und bilde jeden Knoten v aus T auf den Knoten I(v) in B ab • Berechne Av für jeden Knoten v in T. K. Swist
100 001 4 1 010 100 010 110 2 4 2 6 110 011 3 5 6 3 5 101 011 101 Pointer auf den Vater v I(v) Preprocessing - Beispiel h(1) = 1; I(1) = 4 h(2) = 2; I(2) = 2 h(3) = 1; I(3) = 3 h(4) = 3; I(4) = 4 h(5) = 1; I(5) = 5 h(6) = 2; I(6) = 6 K. Swist
Überblick • Definitionen • Anwendungen • Voraussetzungen • Preprocessing • Beantworten von lca – Anfragen in konstanter Zeit K. Swist
Beantworten von LCA - Anfragen • lca(i, j) in B: i und j sind Pfadnummern (binäre Darstellung; Länge d) • Prüfen, ob i Vorfahre von j oder umgekehrt • Sei xij = XOR(i, j). Finde Position k (von links gezählt) des am weitesten links liegenden 1 – Bits in xij. • Links von k stehen Nullen, also sind die Pfade von der Wurzel bis zur k – ten Verzweigung gleich. • Folglich besteht die Pfadnummer von lca(i, j) aus den ersten (k – 1) Zeichen von i (oder j), einer Eins und dann d – k – 1 Nullen. K. Swist
100 4 010 110 2 6 3 5 011 101 Beantworten von LCA - Anfragen z.B. lca(5, 3): XOR(101, 011) = 110 k = 1 lca = 100 K. Swist
Beantworten von LCA – Anfragen - Algorithmus Eingabe: zwei Knoten x und y in T • Finde b = lca(I(x), I(y)) in B. • Finde die kleinste Position j h(b), sodass sowohl Ax, als auch Ay an Position j eine Eins haben. j ist dann h(I(lca(x, y))). • Finde Knoten x‘, den am nächsten zu x gelegenen Knoten, der in der gleichen Gruppe wie lca(x, y) liegt wie folgt: • Finde Position l des am weitesten links liegenden Eins – Bits in Ax. (l = h(I(x))) K. Swist
Beantworten von LCA – Anfragen - Algorithmus • Wenn l = j, setze x‘ = x (x und lca(x, y) liegen in der gleichen Gruppe) und gehe zu Schritt 4. • Sonst (l < j): Finde Position k des am weitesten links liegenden 1 – Bits in Ax, das noch rechts von j liegt.Entwickle eine Zahl w bestehend aus den Bits von I(x) links von Position k gefolgt von einer Eins, aufgefüllt mit Nullen. Suche Knoten L(w) und setze Knoten x‘ als Vater von L(w) in T. • Finde Knoten y‘, den am nächsten zu y liegenden Knoten aus der Gruppe von lca(x, y) wie in Schritt 3. • Wenn x‘ < y‘, setze lca(x, y) = x‘; sonst lca(x, y) = y‘. Ausgabe: lca(x, y) K. Swist