Algorithmik Votierübungen 4

Werbung
Diekert/Weiß/Milosavljevic
Wintersemester 2011/12
Algorithmik
Votierübungen 4
Besprechung: 7./8.12. bzw. 14./15.12.
1. Queapsort:
Implementieren Sie Queapsort (siehe Folien), sowie normales Quicksort mit Median-aus-3 als
Pivot-Element in einer Programmiersprache Ihrer Wahl. Führen Sie Tests mit verschiedenen
Eingabegrößen (n ungefähr zwischen 105 und 108 ) durch und messen sie jeweils die Laufzeit
sowie die Anzahl der benötigten Vergleiche.
Benutzen Sie nun auch für Queapsort die Median-aus-3-Methode sowie eigene Methoden zur
Bestimmung des Pivot-Elements.
Welcher der Algorithmen schneidet für großes/kleines n am Besten ab? Wie erklären Sie
sich die Ergebnisse?
Bringen Sie eine kurze graphische Darstellung Ihrer Ergebnisse in die Übungsgruppe mit.
Wie könnte man Queapsort weiter verbessern?
2. Heaps und Heapsort
a) Stellt das Array [19, 15, 12, 3, 10, 2, 5, 1, 2, 9, 0] einen gültigen Heap dar?
b) Sei ein Heap mit n Elementen gegeben. Nun kommt ein Bösewicht und setzt k Elemente
auf beliebige Werte. Er sagt Ihnen an welchen Stellen er Änderungen ausgeführt hat.
Wie lässt sich die Heapeigenschaft wieder effizient herstellen? Wie ist die asymptotische
Laufzeit dieses Vorgehens? Lässt sich die Laufzeitabschätzung verbessern, wenn nur in
den letzten n/4 des Heaps Änderungen durchgeführt werden dürfen?
c) Zeigen sie, dass die Laufzeit von Standard-Heapsort im worst-case Ω(n log n) ist.
Gibt es Eingaben, bei denen Standard-Heapsort nur O(n) Vergleiche benötigt?
3. Amortisierte Analyse Betrachten wir die Binärdarstellung natürlicher Zahlen, z.B. ’1011’
für 11. Wenn man unter Verwendung der Binärdarstellung hochzählt,
0 → 1 → 10 → 11 → 100 → 101 → . . .
dann fällt auf, dass der übertrag manchmal weit und manchmal (jedes zweite Mal) gar nicht
läuft.
Wenn man davon ausgeht, dass das ändern einer Ziffer eine Einheit kostet, dann sind die
Kosten für das Inkrementieren einer beliebigen natürlichen Zahl n:
cost(n) = 1 + Anzahl der endenden Einsen in der bin. Darst. von n
Da die Kosten in jedem Schritt stark schwanken, muss für die Abschätzung der Gesamtkosten das n-fache der maximalen Einzelkosten angenommen werden. Daher wären für das
Hochzählen von 0 bis n insgesamt O(n · log n) Schritte nötig.
Zeigen Sie durch eine amortisierte Laufzeitanalyse, dass die Gesamtkosten des Zählens von
0 nach n durch 2n beschränkt sind.
Hinweis: Versuchen den Beweis mit der Bankkontomethode. Zahlen Sie für jede Inkrementierung zwei Einheiten auf ein imaginäres Bankkonto und ziehen Sie nur die Einheiten ab,
die Sie im jeweiligen Schritt verbrauchen. Beweisen Sie nun, dass das Bankkonto niemals
überzogen wird.
4. Fibonacci Heaps
a) Geben Sie eine obere Schranke für die Höhe eines Fibonacci Heaps mit n Knoten, das
durch eine beliebige folge von Operationen aus dem leeren Heap erzeugt wurde. Zeigen
Sie, dass diese Schranke scharf ist.
b) Nehmen Sie an, dass ein Knoten nun erst markiert wird, wenn er sein k-tes Kind
verliert, für ein festes k ∈ N. (Normale Fibonacci Heaps verwenden also k = 1). Welche
Auswirkungen hat dies auf die amortisierte Laufzeitanalyse?
5. Quicksort: In der Praxis kann die Laufzeit von von Quicksort verbessert werden, indem man
die schnelle Laufzeit von Insertion-Sort auf Eingaben, die schon “fast” sortiert sind, ausnutzt.
Wenn Quicksort auf einem Teilarray mit weniger als k Elementen aufgerufen wird, soll es
einfach nichts tun und das Array unsortiert lassen. Nach dem Aufruf von Quicksort für das
ganze Array ist es also “fast” sortiert und kann dann mit Insertion-Sort vollständig sortiert
werden. Zeigen Sie: dieses Verfahren läuft in erwarteter Zeit O(nk + n log(n/k)). Wie sollte
man k wählen um mit möglichst wenigen Vergleichen auszukommen?
Herunterladen