Algorithmen, Sommersemester 2007 (Nina Lehmann) Handouts zur Vorlesung AVL-Bäume 1. Schreiben Sie an jeden Knoten seine Balance: 2. Fügen Sie die 30 ein. (a) Wo geht die Balance kaputt? (b) Führen Sie eine geeignete Rotationsoperation durch, um die Balance wiederherzustellen. B-Bäume Beweis zu Lemma 6.3.1: 1 www.bioinfoblog.de Algorithmen, Sommersemester 2007 (Nina Lehmann) 1. Welchen Wert hat der Parameter k in dem hier angedeuteten Beispiel? k=2 2. Geben Sie die minimale Anzahl von Blättern in Höhe h an. 2 · k h−1 3. Geben Sie die maximale Anzahl von Blättern in Höhe h an. (2k − 1)h Beispiel: Suchen im B-Baum 1. Suchen Sie den Eintrag “125”. 125 < 233 ⇒1. Kind 125 > 31 ∧ 125 > 97 ∧ 125 < 137 ⇒3. Kind 125 > 100 ∧ 125 > 120 ∧ 125 = 15 ⇒gefunden Beispiel: Einfügen im B-Baum 2 www.bioinfoblog.de Algorithmen, Sommersemester 2007 (Nina Lehmann) Überschuss an Schlüsseln im Knoten muss ausgeglichen werden: Nach dem Ausgleich durch zweifaches Aufsplitten von Knoten erhält man: Beispiel: Löschen aus einem B-Baum 3 www.bioinfoblog.de Algorithmen, Sommersemester 2007 (Nina Lehmann) Nachdem die falsche Anzahl von Kindern korrigiert wurde, indem die beiden Kinder verknüpft wurden, erhält man: Tries 1. Malen Sie für das Alphabet Σ = {#, $, 0, +} einen Σ-markierten Baum mit Tiefe 2. 2. Geben Sie für den folgenden Baum ϕ(v) für jedes v an: 1 2 3 4 5 6 7 8 9 B H BA HA HO HU BAU HAH 10 11 12 13 14 15 16 17 HAU HOF HUH HUN HAHN HAUS HUHN HUND 3. In anderen Worten: Was beschreibt ϕ(v)? Den Pfad von der Wurzel nach v bestehend aus der Konkatenation aller Kanten-Labels. 4. Geben Sie die Menge S der Wörter an, die im Trie in 2. gespeichert sind. {Hahn, Haus, Huhn, Hund, Hof, Bau} 5. Fügen Sie ein Wort zu S hinzu, so dass es nicht mehr präfixfrei ist. Bauernhof 6. Was könnte man tun, um auch für diese Menge wieder Präfixfreiheit zu erzielen? Einfügen eines neuen Knotens für “Bau”, der über eine Kante mit einem Wortende-Zeichen (üblicherweise “#”) mit Knoten 8 verbunden ist. 7. Welche weitere Eigenschaft sollten Tries haben, damit man in ihnen effizient ein Wort suchen kann? Sie müssen soritiert sein. 4 www.bioinfoblog.de Algorithmen, Sommersemester 2007 (Nina Lehmann) 8. Wenn die Kinder sortiert sind, wie kann man dann alle Wörter der Menge S möglichst effizient sortiert ausgeben? Tiefensuche (DFS). 9. Sei T ein schwach besetzter Trie, d.h. die meisten Knoten haben deutlich weniger als |Σ| Söhne. Diskutieren Sie für diesen Fall die Vor- und Nachteile, wenn die Söhne eines Knotens in einem Array oder in einer Liste verwaltet werden: Array Liste Vorteile Zugriffszeit O(1) Speicherverbrauch O(|Σ|) Nachteile Speicherverbrauch O(|Σ|) Zugriffszeit O(n) 10. Bauen Sie den Trie für die Menge S = {ERBE, ERBAU ER, ERBET EN, ERBAU LICH} 11. Wie können Sie die Pfade überspringen? Zusammenfassen aufeinanderfolgender Knoten mit nur einem Kind durch Verschmelzung der Kantenbeschriftungen. Beispiel: E → R → B wird zusammengefasst zu ERB 12. Sei S = {T HIS, IS, T HE, HOU SE, T HAT, JACK, BU ILT } und A = 00001, B = 00010, . . . dann ist die Binärcodierung von S: BUILT HOUSE IS JACK THAT THE THIS 00010 11000 01010 01101 10111 01000 10000 11000 10110 00101 01010 10110 01011 00001 00011 01100 10111 01000 00001 10111 10111 01000 00101 10111 01000 01010 10110 Trie: 5 www.bioinfoblog.de Algorithmen, Sommersemester 2007 (Nina Lehmann) PATRICIA-Baum: Skiplists 1. Oben ist eine normale, verkettete Liste gezeigt. Nehmen Sie an, dass die Anzahl der Elemente in dieser Liste fix ist, und mehrfach nach den in ihr enthaltenen Elementen gesucht wird. Wie können Sie durch zusätzliche Zeiger eine binäre Suche auf einer solchen Liste ermöglichen? Jedes Element enthält zwei Zeiger auf das mittlere Element der linken bzw. rechten Hälfte und der header erhält einen Zeiger auf das mittlere Element der gesamten Liste. 2. Warum ist dieser Ansatz für eine dynamische Liste nicht möglich? Die Laufzeit schießt in die Höhe, da bei jeder Operation, die die Liste verändert, die Zeiger neu berechnet werden müssen. 6 www.bioinfoblog.de Algorithmen, Sommersemester 2007 (Nina Lehmann) 3. Welche Laufzeit benötigen wir für das Suchen eines Elements, wenn jedes Element an Stelle i zusätzlich einen Zeiger auf das Element an Stelle i + 10 hat? n 10 + 10 a ... b ... c ... d ... e ... Liste Jedes zweite Element hat einen Zeiger, der ein Element überspringt zusätzlich hat jedes vierte Element einen Zeiger, das 3 Elemente überspringt zusätzlich hat jedes achte Element einen Zeiger, der 7 Elemente überspringt Skiplist mit randomisierten Zeigerleveln 4. Beschreiben Sie konkret, wie man am effizientesten das Element “21” finden kann. Start im Header. Suche solange mit Zeigern des höchsten Levels bis ein Element > 21 gefunden wurde. Dann erniedrige Levelpointer und suche wieder bis ein Element > 21 gefunden wurde. Tue dies bis 21 gefunden wurde oder der unterste Zeiger-Level erreicht ist und nur noch größere Elemente gefunden werden. 5. Wie sucht man allgemein in Skiplists? Beginne im Startknoten und suche auf dem höchsten Zeigerlevel nach dem ersten Knoten, dessen Schlüssel größer ist als der des gesuchten Knotens. Dann gehe im vorherigen Knoten ein Zeigerlevel runter. Dann suche wieder den erstern Knoten mit zu großem Schlüssel und so weiter. Sobald der niedrigste Level erreicht wurde und ein Knoten mit zu großem Schlüssel gefunden wurde, existiert der gesuchte Schlüssel nicht in der Skiplist. 6. Wie löscht man und wieviel kostet das Löschen, wenn man erstmal das richtige Element gefunden hat? Das zu löschende Element wird gesucht, und alle Zeiger aus allen Ebenen, die auf dieses Element zeigen, werden auf das Element umgehängt, auf das das zu löschende Element in der entsprechenden Ebene gezeigt wird. Dann kann das Element problemlos gelöscht werden. 7 www.bioinfoblog.de Algorithmen, Sommersemester 2007 (Nina Lehmann) Graphentheorie 1. Geben Sie drei Beispiele an, welche Situationen oder Systeme sich als Netzwerk oder Graph darstellen lassen. • Busfahrplan • Straßennetzwerke • Genealogie • Phylogenie 2. Betrachten Sie folgenden Graph: (a) Beschreiben Sie einen Weg von A nach G. {(A, E), (E, G)} (b) Beschreiben Sie einen Pfad von A nach G. {(A, E), (E, G)} (c) Welche Länge hat dieser Pfad? 2 (d) Beschreiben Sie einen Zykel beginnend bei G, der kein einfacher Zykel ist: A, B, D, G, C, D, E, A 3. Euler-Tour-Beweis: 1 ⇒ 2, 2 ⇒ 3, 3 ⇒ 1 1 . . . Ein Graph hat eine Euler-Tour 2 . . . In diesem Graphen haben allen Knoten geraden Grad 3 . . . Die Kanten von G können in Zykel paritioniert werden (a) Beweisen Sie, dass aus 1 2 folgt. Angenommen ein Graph mit Knoten ungeraden Grades hat eine Euler-Tour. In einer EulerTour muss man in jeden Knoten unterschiedlich oft hinein und hinaus gehen. Das ist bei einer ungeraden Anzahl von Kanten an einem Knoten nicht möglich. 8 www.bioinfoblog.de Algorithmen, Sommersemester 2007 (Nina Lehmann) (b) Beweisen Sie, dass aus 2 3 folgt. Tip: Zeigen Sie zuerst, dass ein Graph ganz ohne Zykel sich “zerlegen” lässt (naja, per Definitionen ist auch eine leere Menge oder eine Menge mit einem Knoten ein Zykel). Zeigen Sie dann, dass ein Graph mit k Zykeln sich in einen Graphen mit weniger Zyklen und einen Zyklus zerlegen lässt. (c) Beweisen Sie, dass aus 3 1 folgt. (d) Wie findet man einen Zykel c in einem Graphen? 4. Welche Familie halten Sie aufgrund des Netzwerkes (präsentiert auf einer Projektor-Folie) für am wichtigsten und warum? Medici. Sie haben Beziehungen zu fünf Familien, die ihrerseits wieder mehr Verbindungen zu anderen Familien haben als die benachbarten Familien der Strozzi. 5. Wie hoch ist die Wahrscheinlichkeit, dass a und c in einem Zufallsgraphen miteinander verbunden sind, wenn Sie wissen, dass es einen Knoten b gibt, der mit a und c verbunden ist? 6. Sei G(n, p) ein Zufallsgraph mit n Knoten und p der Wahrscheinlichkeit, dass jede beliebige Kante (v, w) ∈ V × V existiert. Was ist die erwartete Anzahl von Kanten? Maximale Anzahl ungerichteter Kanten in einem Graph mit n Knoten: n(n−1) 2 (gerichtet: n(n − 1)) 7. Sei G ein Graph mit n Knoten und m Kanten. Berechnen Sie den erwarteten Clusteringkoeffizienten in einem Zufallsgraphen mit der selben Anzahl an Knoten und (erwartet) der selben Anzahl an Kanten für die folgenden 3 Graphen. Casting von Filmschauspielern Stromnetz C. elegans (neurales Netzwerk) n m realer durchschnittlicher Clusteringkoeffizient 225.226 675678 0.79 erwarteter Clusteringkoeffizient in Zufallsgraph 2, 7 · 10−4 4.941 282 30634 1974 0.08 0.28 0,005 0,05 Darstellung von Graphen 1. (a) Ist der Graph zyklisch oder azyklisch? azyklisch (b) Füllen Sie die Adjazenzmatrix aus. 0 1 2 3 4 0 0 0 0 0 1 1 1 0 0 0 1 2 0 0 0 0 0 3 0 0 0 0 0 4 0 0 1 0 0 (c) Wie würde die Adjazenzmatrix aussehen, wenn der Graph ungerichtet ist? symmetrisch 9 www.bioinfoblog.de Algorithmen, Sommersemester 2007 (Nina Lehmann) (d) Nennen Sie je eine Realwelt-Beziehung, die “gerichtet” dargestellt werden sollte und eine, die ungerichtet dargestellt werden sollte. gerichtet: Straßennetz, das ausschließlich aus Einbahnstraßen besteht ungerichtet: Straßennetz ohne eine einzige Einbahnstraße 2. Geben Sie für das obige Beispiel InAdj und OutAdj für alle Kanten an. 3. Finden Sie für dieses Beispiel eine topologische Sortierung. 1, 0, 4, 2, 3 4. Gibt es für diesen Graphen eine topologische Sortierung? nein, da zyklisch 5. Zeigen Sie, dass wenn G eine topologische Sortierung hat, G keinen Zykel enthalten kann. Dann wäre die topologische Sortierung nicht mehr eindeutig, da es keine eindeutige hierarchische Abfolge mehr gibt. 6. Zeigen Sie, dass ein azyklischer Graph immer einen Knoten mit indegree(v) = 0 hat. Durchmusterungen Allgemeiner Durchmusterungsalgorithmus Gegeben: Startknoten s ∈ V Gesucht: Menge S von Knoten, die von s aus erreichbar sind 1 S={s} // Menge an erreichbaren Knoten 2 Z={s} // Menge an Knoten mit bisher unbenutzten Kanten 3 Iterator[] pointer // enthält an Stelle i den Zeiger auf die Kanten 4 Initialisiere pointer // der adjazenten Knoten 5 while Z ist nicht leer do 6 currentNode = Z.get(0) 7 if Iterator von currentNode hat noch weitere Kanten e=(v,w) 8 addiere w zu S, wenn noch nicht drin 9 addiere w zu Z an letzter Stelle 10 else 10 www.bioinfoblog.de Algorithmen, Sommersemester 2007 (Nina Lehmann) 11 lösche currentNode aus Z 12 end if 13 end while 14 return S Durchmusterungsalgorithmus 1. Gegeben der allgemeine Algorithmus. In welcher Reihenfolge werden die Knoten das erste Mal betreten? (Am Beispiel des obigen Baumes, beginnend an der Wurzel.) 2. Was passiert, wenn wir Zeile 9 ändern in: Z.add(0, next), also next vorne in Z einfügen? Tiefensuche 3. In diesem Beispiel sind die ausgehenden Kanten jedes Knotens durchnummeriert. Starten Sie mit einer DFS bei A, folgen Sie den Kanten in der angegebenen Reihenfolge und markieren Sie als T, B, F und C. 4. Zeigen Sie, dass die Kanten aus T tatsächlich einen gerichteten Baum konstruieren. 11 www.bioinfoblog.de Algorithmen, Sommersemester 2007 (Nina Lehmann) 1 void DFS(Node v) 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 besucht[v.index()] = true dfsnum[v.index()] = ++z1 for all (v,w)∈E do if not besucht[w] then T ← T∪{(v, w)} DFS(w) else ? if v→w then F ← F∪{(v, w)} T else ? if w→v then B ← {(v, w)} T else C ← {(v, w)} endif endif endif endwhile compnum[v.index()] = ++z2 5. Geben Sie für jeden Knoten im mittleren Feld seine df snum an und im hinteren Feld seine compnum. (Kanten sind “alphabetisch” geordnet) Starke Zusammenhangskomponenten 1. Finden Sie die starken Zuammenhangskomponenten im obigen Graphen. {{bc} , {bef g} , {bcef g}} 2. Wieviele starke Zusammenhangskomponenten gibt es in einem DAG? keine 3. Geben Sie für das Beispiel die zu diesem Zeitpunkt gültige Menge SZKs an. 12 www.bioinfoblog.de Algorithmen, Sommersemester 2007 (Nina Lehmann) {{bc} , {b} , {c} , {e} , {f } , {g} , {h}} 4. Welche davon sind unfertig, was sind ihre Wurzeln? Welche sind abgeschlossen? 1 DFS(v) 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 besucht[v] = true dfsnum[v] = ++z1 push(v, unfertig) push(v, W) for all (v, w)∈E do if not besucht[v] then DFS(w) else if w∈unfertig then while dfsnum[top(W)] > dfsnum[w] do pop(W); endwhile endif endfor compnum[v] = ++z2 if v = top(W) then repeat w := pop(unfertig) print(w) until v = w pop(W) endif 5. Berechnen Sie für den unten stehenden Graphen die angegebenen Distanzen. d(1, 2) = −1 d(2, 3) = 4 d(4, 2) = ∞ d(2, 4) = 6 (wenn d(3, 4) = 2) d(4, 6) = −∞ 13 www.bioinfoblog.de