Institut für Computergraphik und Algorithmen Arbeitsgruppe für

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