Präsentation herunterladen
1
Das LCA – Problem in Suffixbäumen
2
Überblick Definitionen Anwendungen Voraussetzungen Preprocessing
Beantworten von LCA – Anfragen in konstanter Zeit K. Swist
3
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 beginnen mit unterschiedlichen Zeichen. Konkatenation der Label der Kanten auf einem Pfad von der Wurzel zu einem Blatt i ist gleich S[i... n] (also das Suffix von S, das an Position i startet.). e banane an n 6 1 ane e e 2 4 5 ane 3 K. Swist
4
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. u v K. Swist
5
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. lca(x, y) x y K. Swist
6
Definitionen Ein vollständiger binärer Baum B ist ein Baum, in dem jeder innere Knoten genau zwei Kinder hat. K. Swist
7
Überblick Definitionen Anwendungen Voraussetzungen Preprocessing
Beantworten von lca – Anfragen in konstanter Zeit K. Swist
8
Anwendungen Longest common extension Palindrome
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
9
Überblick Definitionen Anwendungen Voraussetzungen Preprocessing
Beantworten von lca – Anfragen in konstanter Zeit K. Swist
10
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
11
Überblick Definitionen Anwendungen Voraussetzungen Preprocessing
Beantworten von lca – Anfragen in konstanter Zeit K. Swist
12
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: 5 6 4 3 2 1 001 100 110 101 011 010 K. Swist
13
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 5 6 4 3 2 1 001 100 110 101 011 010 K. Swist
14
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. 5 6 4 3 2 1 001 100 110 101 011 010 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
15
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. 5 6 4 3 2 1 001 100 110 101 011 010 I(1) = 4 I(2) = 2 I(3) = 3 I(4) = 4 I(5) = 5 I(6) = 6 K. Swist
16
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
17
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 wird dann zu (log2p)+1 Bits aufgefüllt, indem rechts eine Eins angehängt wird und entsprechend viele Nullen. 1 7 5 6 4 2 3 001 101 111 110 011 100 010 K. Swist
18
Preprocessing - Pfadnummern
Pfadnummern können auch rekursiv vergeben werden: nummeriere zuerst rekursiv das linke Kind, dann die Wurzel, dann rekursiv das rechte Kind. Bei der Konstruktion von B werden nur die Knoten bezeichnet, auf die ein Knoten aus T abgebildet wird (also nur die Nummern, die als I – Wert in T vorkommen). 1 7 5 6 4 2 3 001 101 111 110 011 100 010 K. Swist
19
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
20
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
21
Preprocessing - Beispiel
001 5 6 4 3 2 1 100 110 101 011 010 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 Pointer auf den Vater v I(v) K. Swist
22
Überblick Definitionen Anwendungen Voraussetzungen Preprocessing
Beantworten von lca – Anfragen in konstanter Zeit K. Swist
23
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
24
Beantworten von LCA - Anfragen
z.B. lca(5, 3): XOR(101, 011) = 110 k = 1 lca = 100 5 6 4 2 3 101 110 011 100 010 K. Swist
25
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
26
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
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.