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