Aufgabenblatt 5

Werbung
Informatik III
Universität Augsburg
Wintersemester 2016/17
Prof. Dr. W. Vogler
Moritz Laudahn, M.Sc.
Aufgabenblatt 5
Aufgabe 1
In Aufgabe 1 auf Übungsblatt 3 sollten Sie die binäre Suche derart modifizieren, dass ein
gesuchtes Element x, welches sich in einem Array mit n Elementen an Position k befindet,
in Θ(log k) Zeit anstatt O(log n) Zeit gefunden wird.
a) Wir können Konstanten vernachlässigen und annehmen, dass die Laufzeit zum Finden
des kten Elements genau log k beträgt. Geben Sie, den Erwartungswert der Laufzeit in
Abhängigkeit von n an unter der Annahme, dass die Wahrscheinlichkeit, dass k einen
konkreten Wert in {1, . . . , n} annimmt, gleichverteilt ist. (5P)
b) Geben Sie eine möglichst vereinfachte Funktion f : IN0 → IN an, und beweisen Sie,
dass der Erwartungswert der Laufzeit aus a) in Θ(f ) liegt. (10P)
Lösungsvorschlag zu Aufgabe 1
1a) Der Erwartungswert ist
Pn
k=1 (log 2
n
k)
.
Pn
(log k)
1b) z.z: Es gilt für den Erwartungswert k=1n 2 ∈ Θ(log n).
Variante 1: Im Skript wurde beim BeweisPder unteren Schranke für vergleichsbasiertes
n
Sortieren (Satz 3.1)
bereits gezeigt, dass
k=1 (log2 k) ∈ Θ(n log n) ist. Daraus können
Pn
k=1 (log 2 k)
wir folgern, dass
∈ Θ(log n) ist. (Genau genommen bedarf das einer kleinen
n
Rechtfertigung.)
Pn
Pn
(log k)
1
1
k=1 (log2 k)
2 (n/2)
2n
=
log
n
−
und
≤ n log
=
Variante 2: Es gilt k=1n 2 ≥ (n/2) log
2
n
2
2
n
n
log2 n gelten. Damit liegt der Erwartungswert in Θ(log n).
Aufgabe 2
Betrachten Sie nun ein beliebiges Verfahren, welches ein Element x in einem sortierten
Array A der Größe n sucht und dabei lediglich x mit geeignetem A[j] vergleicht – z.B.
binäre Suche. Zeigen Sie, dass eine solche Suche eine Average-Case Laufzeit von Ω(log n)
hat. (10P)
Hinweis: Verwenden Sie einen Entscheidungsbaum, der an jedem Knoten die i speichert,
für die noch A[i] = x möglich ist.
Lösungsvorschlag zu Aufgabe 2
Der Entscheidungsbaum benötigt n Blätter, in denen jeweils nur eine Position i gespeichert
ist. Ein Baum mit n Blättern hat mindestens eine durchschnittliche Tiefe von Ω(log n).
1
Aufgabe 3
Die Firma Ranzsoft wirbt in ihrer Werbung damit, dass sie eine vergleichsbasierte haldenähnliche Datenstruktur entwickelt hat, die insert(T x) und deletemax() in o(log n) Zeit
unterstützt, wobei n die Anzahl der Elemente in der Datenstruktur bezeichnet. Dabei fügt
insert ein x vom Typ T ein, deletemax entfernt das Maximum aus der Datenstruktur und
gibt es zurück; beide dürfen Elemente vom Typ T nur vergleichen und vertauschen. Widerlegen Sie die Behauptung der Firma durch einen Beweis, dass eine solche Datenstruktur
nicht existieren kann. (14P)
Hinweis: Sie können die Datenstruktur als Black Box betrachten und müssen keinerlei
zusätzliche Annahmen darüber treffen, wie diese realisiert ist.
Lösungsvorschlag zu Aufgabe 3
Sei n die Anzahl der Elemente in einem zu sortierenden Array. Wir haben in der Vorlesung
bewiesen, dass vergleichsbasiertes Sortieren im schlimmsten Fall Ω(n log n) Zeit benötigt
(siehe Satz 3.1). Der beworbene Max-Heap der Firma Ranzsoft würde es erlauben, vergleichsbasiert in o(n log n) Zeit zu sortieren. Dazu würden erst alle n Elemente mittels
insert() in den Heap eingefügt werden, was o(n log n) Zeit benötigt, und anschließend n
Mal das momentane Maximum mittels deletemax() aus dem Heap entnommen und das ite
entnommene Element an Position n − i in das sortierte Array positioniert werden. Wir
hätten eine Variante von Heapsort, die nur o(n log n) Zeit benötigt. Dies ist ein Widerspruch
zu Satz 3.1. Folglich kann ein solcher Heap nicht existieren.
Aufgabe 4
Mithilfe von Bucket-Sort können n ganze Zahlen aus dem Bereich [0, 1, . . . , m] in O(n + m)
Zeit sortiert werden. Außerdem kann im Anschluss in O(1) Zeit die Frage beantwortet
werden, wieviele der gegebenen Zahlen den Wert i haben. Beschreiben Sie (unter Verwendung eines hilfreichen Bildes) eine Modifikation dieses Verfahrens, die es nach lediglich
O(n) Vorabberechnungszeit erlaubt, Anfragen nach der Häufigkeit einer Zahl in O(1) zu
beantworten.
Dabei muss offenbar die Initialisierung in O(m) Zeit vermieden werden. Sie dürfen
davon ausgehen, dass die Allokation eines Array in O(1) Zeit läuft, die Elemente des Arrays
jedoch – anders als in Java – uninitialisiert sind. Damit stehen zu Beginn zufällige Zahlen
in allen benutzten Arrays, d.h. eine Zahl in Ihrer Datenstruktur ist nicht notwendigerweise
irgendwann von Ihnen geschrieben worden. (20P)
Hinweis: Benutzen Sie folgende Datenstruktur: Ein Pointer“-Array P mit Indizes, ein
”
zweites gleichlanges Bucket“-Array B von Paaren aus int Zahlen, das die Häufigkeit jeder
”
Zahl speichert, und einen Pegel“: int valid.
”
2
Lösungsvorschlag zu Aufgabe 4
P:
..
.
B:
..
.
i
k, 2
i, 3
j, 1
valid = # gültiger Einträge in B
= Index 1. freie Zelle
..
.
initial valid = 0
Anzahl
Verifikator
bisher wurde j einmal, i dreimal und k zweimal gefunden
Es wird in O(n) Zeit über alle Zahlen iteriert. Für jede Zahl i wird in P nachgeschaut,
ob P [i] auf eine gültige Zelle von B zeigt, d.h. P [i] < valid . Dann ist der Eintrag B[P [i]]
korrekt. Wenn der dortige Verifikator i ist (B[P [i]].verifikator = i), dann wurde bereits
ein i gelesen: die Anzahl in diesem Paar ist um eins zu erhöhen. Ansonsten (P [i] zeigt
über valid oder Verifikator stimmt nicht) beschriftet man die Zelle B[valid ] mit (i, 1), setzt
P [i] = valid und erhöht schließlich valid um eins.
Eine Anfrage nach der Anzahl an Vorkommen von i kann nun durch Nachsehen in
B[P [i]] erfolgen. Ist der Verifikator ungleich i oder P [i] keine gültige Zelle (P [i] ≥ valid ),
dann kam i nicht vor. ansonsten gibt man die Anzahl in B[P [i]] zurück.
Informationen:
• Abgabe: Bis spätestens Donnerstag, den 24.11.2016, um 12:00 im entsprechend beschrifteten Briefkasten.
3
Herunterladen