1 / 26

Das LCA – Problem in Suffixbäumen

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

Télécharger la présentation

Das LCA – Problem in Suffixbäumen

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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 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

  4. 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

  5. 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

  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 • 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. 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

  13. 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

  14. 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

  15. 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

  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. 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

  18. 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

  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. 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

  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. 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

  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

More Related