Institut für Computergraphik und Algorithmen Arbeitsgruppe für Algorithmen und Datenstrukturen Übungen zu Effiziente Algorithmen 186.144 VU 2.0 - WS 2007/08 Übungsblatt 2 (Teil 1) 4. Dezember 2007 Die hier angeführten Aufgaben sind für die Übungsstunde am 22. Jänner 2008 vorzubereiten. Der zweite Teil dieses Übungsblattes wird veröffentlicht, wenn die entsprechenden Inhalte in der Vorlesung behandelt werden. Aufgabe 1 Huffman Kodierung Angenommen die Häufigkeit aller Zeichen in einem Text sind paarweise verschieden, ist der HuffmanKodierungsbaum immer eindeutig? Aufgabe 2 Zip-Bombe Welches der vorgestellten Textkompressionsverfahren eignet sich am besten für das Basteln von Zip-Bomben? (Zip-Bombe: Text, der komprimiert möglichst wenig Speicherplatz benötigt, entpackt aber aus fast beliebig vielen Zeichen besteht.) Aufgabe 3 Suffix-Trees: Suffix-Links Erstellen Sie einen Suffix-Tree für eine beliebige, selbst gewählte Zeichenkette S (S nicht schon in der Vorlesung behandelt), die zumindest 10 Zeichen lang ist. Der resultierende Suffix-Tree soll dabei am Ende mindestens 3 Suffix-Links enthalten. Die Erstellung des Trees muss nicht mit dem Algorithmus von Ukkonen erfolgen. Aufgabe 4 Suffix-Trees: Longest Common Substring Veranschaulichen Sie mit zwei selbst gewählten Strings Sa (|Sa | = ma ) und Sb (|Sb | = mb ), wie mit Hilfe von Suffix-Trees der längste gemeinsame Substring in O(ma + mb ) gefunden werden kann. Aufgabe 5 Suffix-Trees: Zirkuläre Strings Zeigen Sie anhand eines selbst gewählten Beispiels, wie ein zirkulärer String S (S hat keine definierte Anfangsund Endposition) mittels eines Suffix-Trees so ,,aufgeschnitten” werden kann, dass der lexikalisch kleinste aller möglichen Strings daraus resultiert. Aufgabe 6 Suffix-Trees: DNA Kontaminierung Ein großes Problem im Bereich der DNA-Sequenzierung ist die Verschmutzung (Kontaminierung) einer DNASequenz mit Stücken fremder DNA. Um Ergebnisse zu sichern, sollte eine Überprüfung auf Verschmutzung erfolgen. Gegeben sind zwei Strings: Sa (|Sa | = ma ) , die zu überprüfende DNA-Sequenz, und Sb (|Sb | = mb ), eine Sequenz von einzelnen, aneinandergefügten DNA-Stücken, die zu einer Kontaminierung von Sa geführt haben können. Gesucht sind nun alle Substrings von Sb in Sa , die eine bestimmte Länge l überschreiten und damit Kandidaten für eine Verunreinigung darstellen. Demonstrieren Sie anhand eines selbst gewählten, kleinen Beispiels, wie dieses Problem in O(ma + mb ) gelöst werden kann. 1 Aufgabe 7 Suffix-Trees: Textkompression Das Ziv-Lempel-Kompressionsverfahren auf Basis von LZSS kann mit Hilfe von Suffix-Trees effizient implementiert werden. Beschreiben Sie den LZ-Algorithmus unter Verwendung von Suffix-Trees. Wie würden Sie das Problem des sich ,,bewegenden” Textfensters lösen? Aufgabe 8 Suffix-Arrays Geben Sie das Suffix-Array für den String S =wendende an und berechnen Sie den Inhalt der beiden Arrays Llcp und Rlcp. Aufgabe 9 Suffix-Trees und -Arrays: Recherche Recherchieren Sie mindestens drei Einsatzgebiete von Suffix-Trees bzw. Suffix-Arrays und stellen Sie diese kurz vor. Aufgabe 10 Fibonacci Heaps – Maximale Höhe Nach der Vorlesung “Effiziente Algorithmen” gibt es einen Riesen-Hype um die Fibonacci Heaps. Viele eingefleischte Fans schwören sogar darauf, dass die Höhe eines Fibonacci Heaps mit n Knoten durch O(log n) beschränkt sei. Widerlegen Sie diese radikale Behauptung, indem Sie ein Schema angeben, das für jedes n ∈ N einen Fibonacci Heap mittels einer Sequenz von Operationen konstruiert, der nur aus einem einzigen entarteten Baum in Form einer linearen Liste mit n Knoten besteht. Aufgabe 11 Fibonacci Heaps – Anregung Bei increaseKey werden Knoten angeregt, wenn sie ein Kind verlieren. Verliert ein angeregter Knoten ein weiteres Kind, wird er abgespaltet. In Summe wird ein Knoten abgespaltet, wenn er 2 Kinder verloren hat. Erläutern Sie das Verhalten von verschiedenen Varianten, wo ein Knoten abgespaltet wird, nachdem er k (= 1, 3, 4, . . . ) Kinder verloren hat. Aufgabe 12 Amortisierte Analyse – Fit-Arrays Stellen Sie sich vor, dass positive Integer-Zahlen als Summe von Fibonacci-Zahlen repräsentiert werden. Um eine Zahl x darzustellen, benutzen wir statt den herkömmlichen Bit-Arrays sogenannte Fit-Arrays, in denen das i-te Fit von rechts angibt, ob die i-te Fibonacci-Zahl als Summand in der Zahl vorkommt. Beispiel: 101110F steht für die Zahl F6 + F4 + F3 + F2 = 8 + 3 + 2 + 1 = 14. Sind damit alle positive Integer-Zahlen codierbar? Beschreiben und analysieren Sie Operationen, die den Wert einers Fit-Arrays in amortisiert konstanter Zeit in- bzw. dekrementieren. 2