Informatik I 4. Kapitel Suchen in sequentiellen Listen



Ähnliche Dokumente
Fibonacci-Suche. Informatik I. Fibonacci-Suche. Fibonacci-Suche. Einführung. Rainer Schrader. 24. Mai 2005

Das Suchproblem. Gegeben Menge von Datensätzen. Beispiele Telefonverzeichnis, Wörterbuch, Symboltabelle

Das Suchproblem 4. Suchen Das Auswahlproblem Suche in Array

Das Suchproblem. Gegeben Menge von Datensätzen. Beispiele Telefonverzeichnis, Wörterbuch, Symboltabelle

Das Suchproblem 4. Suchen Das Auswahlproblem Suche in Array

3. Suchen. Das Suchproblem. Suche in Array. Lineare Suche. 1 n. i = n Gegeben Menge von Datensätzen.

9. Rekursion. 1 falls n 1 n (n 1)!, andernfalls. Experiment: Die Türme von Hanoi. Links Mitte Rechts. Mathematische Rekursion

Übungsblatt 1. f(n) = f(n) = O(g(n)) g(n) = O(f(n)) Zeigen oder widerlegen Sie: 3 n = Θ(2 n ) Aufgabe 1.2 Gegeben sei die folgende Funktion:

Mi, 21. Mai, ab 12:30 Uhr, in E23 (OH14) Dann ab 14:30 Uhr: Motivation: Gegeben: hier: später: Aufgabe:

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Suchverfahren Autor: Stefan Edelkamp / Sven Schuierer

Algorithmen und Datenstrukturen Suchen

Datenstrukturen und Algorithmen. 7. Suchen in linearen Feldern

Kapitel 2. Weitere Beispiele Effizienter Algorithmen

Kap. 3: Sortieren (3)

Abschnitt: Algorithmendesign und Laufzeitanalyse

G. Zachmann Clausthal University, Germany

2. Einfache Suchverfahren

6 Quicksort. die mittlere Laufzeit Θ(n log n) beträgt und. die in der asymptotischen Notation verborgenen Konstanten sehr klein sind.

Grundlagen: Algorithmen und Datenstrukturen

Teil 6: Algorithmen und Datenstrukturen 6.3 Suchalgorithmen Prof. Dr. Max Mühlhäuser FG Telekooperation TU-Darmstadt

14. Sortieren II Heapsort. Heapsort. [Max-]Heap 7. Heapsort, Quicksort, Mergesort. Binärer Baum mit folgenden Eigenschaften

Proseminar Effiziente Algorithmen

8. Sortieren II. 8.1 Heapsort. Heapsort. [Max-]Heap 6. Heapsort, Quicksort, Mergesort. Binärer Baum mit folgenden Eigenschaften

Heapsort, Quicksort, Mergesort. 8. Sortieren II

ADS: Algorithmen und Datenstrukturen

Heapsort, Quicksort, Mergesort. 8. Sortieren II

Einführung Elementare Datenstrukturen. Der Konstruktor muß den Listenkopf head erzeugen. Der Vorgänger und Nachfolger von head ist head selbst.

Das Divide - and - Conquer Prinzip. Quicksort Formulierung und Analyse des Prinzips Geometrisches Divide and Conquer - Closest-Pair - Segmentschnitt

Ein sortiertes Feld kann in O(log n) durchsucht werden, z.b. mit Binärsuche. Der Algorithmus 1 gibt den Pseudocode der binären Suche an.

Einführung in die Informatik I Kapitel II.1: Suchen

Kapitel 10. Komplexität von Algorithmen und Sortieralgorithmen

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Auswählen nach Rang (Selektion)

Theoretische Informatik. Exkurs: Komplexität von Optimierungsproblemen. Optimierungsprobleme. Optimierungsprobleme. Exkurs Optimierungsprobleme

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Wiederholung. Divide & Conquer Strategie

Algorithmen & Komplexität

2. Effizienz von Algorithmen

Abgabe: (vor der Vorlesung) Aufgabe 2.1 (P) O-Notation Beweisen Sie die folgenden Aussagen für positive Funktionen f und g:

JAVA - Suchen - Sortieren

in eine Folge ai, so daß bezgl. einer Ordnung gilt: a a, j < n

3.2. Divide-and-Conquer-Methoden

Algorithmen & Komplexität

Suchen und Sortieren Sortieren. Mergesort

A7.1 Untere Schranke. Algorithmen und Datenstrukturen. A7.1 Untere Schranke. Algorithmen und Datenstrukturen. A7.2 Quicksort. A7.

Algorithmen und Datenstrukturen 1-1. Seminar -

Algorithmen und Datenstrukturen Heapsort

Randomisierte Algorithmen

Algorithmen und Datenstrukturen 1 VL Übungstest WS 2010/ November 2010

Algorithmen I. Prof. Jörn Müller-Quade Institut für Theoretische Informatik Web:

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen 1

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Suchen. Lineare Suche. Such-Algorithmen. Sommersemester Dr.

Datenstrukturen und Algorithmen

Änderung zur Übung. Kap. 4.4: B-Bäume. Motivation. Überblick. Motivation für B-Bäume. B-Bäume. Warum soll ich heute hier bleiben?

4. Sortieren 4.1 Vorbemerkungen

Asymptotische Laufzeitanalyse: Beispiel

Informatik II, SS 2016

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

Kapitel 6 Elementare Sortieralgorithmen

Formaler. Gegeben: Elementfolge s = e 1,...,e n. s ist Permutation von s e 1 e n für eine lineare Ordnung ` '

Suchen und Sortieren

Algorithmen und Datenstrukturen

Datenstrukturen & Algorithmen

Quicksort ist ein Divide-and-Conquer-Verfahren.

Algorithmen und Datenstrukturen 1

Algorithmen II Vorlesung am

Algorithmik Übung 3 Prof. Dr. Heiner Klocke. Sortierfolge nach Werten: Bube Dame König As nach Farben: Karo ( ) Herz ( ) Piek ( ) Kreuz ( )

1. Musterlösung. Problem 1: Average-case-Laufzeit vs. Worst-case-Laufzeit ** i=1

T (n) = max. g(x)=n t(n) S(n) = max. g(x)=n s(n)

QuickSort ist ein Sortieralgorithmus, der auf der Idee des Teile & Beherrsche beruht, und das gegebene Array an Ort und Stelle (in place) sortiert

Informatik II, SS 2016

Heapsort. Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen / 50

> Parallele Systeme Übung: 4. Übungsblatt Philipp Kegel Wintersemester 2012/2013. Parallele und Verteilte Systeme, Institut für Informatik

Algorithmen und Datenstrukturen

Schleifeninvarianten. Dezimal zu Binär

Sortieren & Co. KIT Institut für Theoretische Informatik

Aufgabe 8. 1 Arbeitsweise illustrieren. 2 Korrektheitsbeweis führen. 3 Laufzeitanalyse durchführen.

Algorithmen und Datenstrukturen I. Grundlagen. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München

Datenstrukturen und Algorithmen (SS 2013)

Übung Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen (für ET/IT)

2. Einfache Suchverfahren. Beispiel-Spezifikation in Java. Lineare Listen (2) Lineare Listen Sequentielle Suche Binäre Suche

Sortieralgorithmen. Jan Pöschko. 18. Januar Problemstellung Definition Warum Sortieren?... 2

Programmiertechnik II

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

Übung Algorithmen und Datenstrukturen

Kap. 3 Sortieren. 7. VO DAP2 SS Mai Vorlesung am Do 7.5. entfällt wegen FVV um 14 Uhr HeapSort ff 3.1.

Graphentheorie. Eulersche Graphen. Eulersche Graphen. Eulersche Graphen. Rainer Schrader. 14. November Gliederung.

Algorithmen und Datenstrukturen I Grundlagen

Übersicht. Datenstrukturen und Algorithmen Vorlesung 5: Rekursionsgleichungen (K4) Übersicht. Binäre Suche. Joost-Pieter Katoen. 20.

Informatik II, SS 2018

Exponentielle Suche 4/26/10. Beweis für. Situation: Idee: suche zunächst "rechten Rand" r, so dass k < Ar Algo: Analyse:

Abschnitt 19: Sortierverfahren

Transkript:

Informatik I 4. Kapitel Rainer Schrader Zentrum für Angewandte Informatik Köln 21. Mai 2008 1 / 55 2 / 55 Szenario Suchen in Daten gehört zu den wichtigsten Operationen etwa Suchen nach: Stichworten in Lexika Telefonnummern, Kontonummern, Kfz-Kennzeichen Dateinamen, Absender von emails,... die Daten liegen als sequentielle lineare Listen vor die Daten werden über Schlüssel k N identifiziert nur Schlüsselvergleiche sind erlaubt (elementare Suchverfahren) in späteren Kapiteln: Suchen auf Bäumen Suche durch arithmetische Berechnungen der Adressen temporäre Annahme: keine zwei Schlüssel sind gleich 3 / 55 4 / 55

Gliederung das Auswahlproblem (Medianbestimmung) Suchen in unsortierten Listen Suchen in sortierten Listen selbstorganisierende Listen Auswahlproblem gegeben: n Schlüssel (Datensätze), ein k n, gesucht: der k -kleinste Schlüssel Spezialfall: bestimme den Median: k = n 2 5 / 55 6 / 55 einfache Lösung: suche den kleinsten Schlüssel in linearer Zeit lösche dieses Element suche den kleinsten Schlüssel in den verbleibenden Daten lösche dieses Element,... O(kn) Schritte (O(n 2 ) für das Medianproblem) besser: baue einen min-heap aus den Daten lösche das minimale Element repariere Heap durch Versickern lösche das minimale Element,... besserer Ansatz (bestimme das k -kleinste Element) wähle ein Pivotelement A(i) (wie in Quicksort) teile die Schlüssel auf in S 1 = {A(j) : A(j) < A(i)} S 2 = {A(j) : A(j) > A(i)} suche rekursiv im richtigen Teil weiter: falls S 1 = k 1, dann ist A(i) das gesuchte Element falls S 1 k, suche das k -kleinste Element in S 1 falls S 1 < k 1, suche das k 1 S 1 -kleinste Element in S 2 O(n + k log n) Schritte (O(n log n) für das Medianproblem) 7 / 55 8 / 55

angenommen für ein ε > 0 gilt: wir können A(i) stets so wählen, dass: S 1 εn S 2 εn dann wird die Rekursion auf höchstens (1 ε)n n durchgeführt damit folgt für die Laufzeit T : T (n) T (1 ε)n + cn. Satz T (n) dn für d = c. ε Beweis: Per Induktion folgt: T (n) T (1 ε)n + cn. T (n) T (1 ε)n + cn d (1 ε)n + cn c (1 ε)n + cn ε = dn 9 / 55 10 / 55 Idee damit hätten wir einen linearen Algorithmus zur Bestimmung des k -kleinsten Elements wir müssen nur immer mindestens einen konstanten Teil abspalten teile die n in Fünfergruppen auf (bis auf einen Rest von bis zu 4 n) sortiere diese Gruppen und nimm jeweils das mittlere Element (Median) bestimme rekursiv den Median der n 5 Mediane, benutze dieses Element als Pivotelement sei x der Median der Mediane mit Ausnahme der Gruppe, die x enthält, und evtl. der letzten gilt: eine Gruppe, deren Median kleiner ist als x, enthält 3, die kleiner sind als x eine Gruppe, deren Median größer ist als x, enthält 3, die größer sind als x damit ist die Anzahl der, die kleiner sind als x, mindestens 1 l n m ı εn = 3( 2) 3 2 5 10 n 6. entsprechendes gilt für die Mindestanzahl der, die kleiner als x sind 11 / 55 12 / 55

Illustration: 1 2 n+5 n 10 5 Pivotelement: Median der Mediane Mediane der Gruppen mit einem ähnlichen Argument lässt sich zeigen, dass das Pivotelement zufällig gewählt werden kann: ein Element x heiße zentral, falls höchstens 1 8 1 8 damit sind 3 4 größer sind als x, und kleiner sind als x aller zentral mit hoher Wahrscheinlichkeit ist ein zufällig gewähltes Element zentral und das Verfahren hat eine erwartete Laufzeit, die linear ist. 3 10 n 6 3 10 n 6 13 / 55 14 / 55 Die Listen seien als Feld A implementiert mit n n in den Positionen 1... n. Gliederung das Auswahlproblem (Medianbestimmung) Suchen in unsortierten Listen Suchen in sortierten Listen selbstorganisierende Listen Sequentielle Suche (wie in Kapitel 1) sequential_search (A, n, k) // durchsucht A[1..n] nach n mit Schlüssel k, // liefert Position eines solchen, falls existent, sonst 0 A(0) = k i = n+1 repeat i = i-1 until A(i) = k end do return i 15 / 55 16 / 55

Gliederung Analyse des Suchens in unsortierten Listen offensichtlich gilt: C min (n) = 1, C max (n) = n + 1, C avg (n) = 1 n P n i=1 i = n+1 2 für eine erfolgreiche Suche. Analog für verkettete Listen. das Auswahlproblem (Medianbestimmung) Suchen in unsortierten Listen Suchen in sortierten Listen binäre Suche Fibonacci-Suche exponentielle Suche weitere Suchverfahren selbstorganisierende Listen 17 / 55 18 / 55 nichtrekursive Implementierung Ab jetzt nehmen wir an, dass die Liste sortiert ist, also: A(1) A(2) A(n) Binäre Suche Divide and Conquer: vergleiche mit dem Schlüssel in der Mitte der Liste, Treffer: STOP, kleiner : durchsuche links von der Mitte, größer : durchsuche rechts von der Mitte. binary_search(a, l, r, k) // sucht nach Schlüssel k im Bereich A[l..r], // liefert 0, falls nicht vorhanden m = (l+r)/2 while ((A(m) k) und (l r)) do if (k < A(m)) r = m - 1 else l = m + 1 end if m = (l+r)/2 end while if (k = A(m)) return m else return 0 end if 19 / 55 20 / 55

Analyse der binären Suche: best case: C min (n) = Θ(1) (sofortiger Treffer). Beispiel: n = 7 = 2 3 1 (k = 3): der allgemeine Fall: Position 1 2 3 4 5 6 7 wie lange dauert es, ein Element an Position 1 i n zu finden? vereinfachende Annahmen: n = 2 k 1 für geeignetes k (d.h. k = log(n + 1)) eine Zeiteinheit (ZE) für Bestimmung der Mitte Entscheidung, ob links weiter oder rechts weiter oder Treffer sofortiger Treffer: 1 ZE Treffer in der Mitte links oder rechts: 2 ZE... Zeiteinheiten 3 2 3 1 3 2 3 1 ZE für mittleres Element 2 ZE für mittleres in linker Hälfte 2 ZE für mittleres in rechter Hälfte 3 ZE für die vier anderen worst case: k = log(n + 1) ZE, C max (n) = Θ(log n) (erfolgreich oder -los) 21 / 55 22 / 55 average case: Lemma Anzahl ZE Positionen Produkt aufsummiert 1 1 1 1 2 2 4 5 3 4 12 17 4 8 32 49.. k 2 k 1 k 2 k 1 P k i=1 i 2i 1 ergibt eine durchschnittliche Zeit von: 1 n. kx i 2 i 1. i=1. kx i 2 i 1 = (k 1) 2 k + 1. i=0 Beweis: per Induktion k = 1 : 1 = (k 1) 2 k + 1. k > 1 : kx Xk 1 i 2 i 1 = i 2 i 1 + k 2 k 1 i=0 i=0 = (k 2) 2 k 1 + 1 + k 2 k 1 (per Induktion) = 2k 2 k 1 2 2 k 1 + 1 = k 2 k 1 2 k + 1 = (k 1) 2 k + 1. 23 / 55 24 / 55

Mit k = log(n + 1) folgt: C avg = 1 n kx i 2 i 1 i=0 Gliederung das Auswahlproblem (Medianbestimmung) = 1 n (k 1) 2k + 1 = 1 h i (log(n + 1) 1)(n + 1) + 1 n = 1 h i (n + 1) log(n + 1) n n = n + 1 n = log(n + 1) + log(n + 1) 1 log(n + 1) n 1 n log(n + 1) 1 Suchen in unsortierten Listen Suchen in sortierten Listen binäre Suche Fibonacci-Suche exponentielle Suche weitere Suchverfahren selbstorganisierende Listen C avg (n) = Θ(log n) und nur eine Zeiteinheit weniger als im worst-case. 25 / 55 26 / 55 Grundidee wie bei der Binärsuche aber andere asymmetrische Aufteilung Aufteilung erfolgt anhand der Fibonacci-Zahlen keine Divisionen zur Bestimmung der Mitte, nur Additionen und Subtraktionen Fibonacci-Zahlen sind durch folgende Rekursion gegeben: F 0 = 0 F 1 = 1 F m = F m 1 + F m 2 für m 2 Beispiel: m 0 1 2 3 4 5 6 7 8 9 10 11 12 F m 0 1 1 2 3 5 8 13 21 34 55 89 144 27 / 55 28 / 55

Fibonacci-Zahlen sind durch folgende Rekursion gegeben: F 0 = 0 F 1 = 1 F m = F m 1 + F m 2 für m 2 vereinfachende Annahme: sei n = F m 1 für geeignetes m dann ist F m 1 = F m 2 1 + F m 1 1 + 1 das Intervall [1,..., F m 1] zerfällt an der Position F m 2 in zwei Intervalle der Länge F m 2 1 und F m 1 1. Lemma F m = 1» «m «m 1 + 5 1 5 1 = 5 2 2 5 1 + 5 2 «m + 1. 2 Beispiel für (m = 8): 1 8 = i = Fm 2 20 = n = Fm 1 Beweis: per Induktion. Hierbei steht für Abrunden. 7 = Fm 2 1 12 = Fm 1 1 29 / 55 30 / 55 Beispiel für (m = 8): 1 8 = i = Fm 2 20 = n = Fm 1 1 8 = i = Fm 2 20 = n = Fm 1 7 = Fm 2 1 12 = Fm 1 1 7 = Fm 2 1 12 = Fm 1 1 Fibonacci-Suche Sei n = F m 1 für geeignetes m 2. setze i = F m 2 vergleiche den zu suchenden Schlüssel k mit A(i): A(i) = k : Suche erfolgreich A(i) > k : suche im linken Bereich mit F m 2 1 n A(i) < k : suche im rechten Bereich mit F m 1 1 n Suche im rechten Bereich: Suche im linken Bereich: 1 5 = i = Fm 3 12 = Fm 1 1 4 = Fm 3 1 7 = Fm 2 1 1 3 = i = Fm 4 7 = Fm 2 1 2 = Fm 4 1 4 = Fm 3 1 31 / 55 32 / 55

nach dem letzten Lemma ist F m c 1.618 m mit einer Konstanten c Analyse der Fibonacci-Suche wir starten mit einem Intervall der Länge F m 1 das nächste Intervall hat eine Länge von höchstens F m 1 1... das j-te Intervall hat eine Länge von höchstens F m j+1 1 das Verfahren bricht ab, sobald F m j+1 1 = 1 m j + 1 = 3 damit benötigen wir höchstens m Schlüsselvergleiche für n + 1 = F m c 1.618 m benötigen wir maximal m Vergleiche damit folgt: C max (n) = Θ(log 1.618 (n + 1)) = Θ(log 2 n) es gilt auch (ohne Beweis): C avg (n) = Θ(log 2 n). damit haben wir die gleiche Größenordnung wie bei der Binärsuche, aber hier haben wir keine Divisionen (Shifts), nur Additionen und Subtraktionen 33 / 55 34 / 55 programmtechnische Umsetzung für n = F m 1 wir speichern ein Paar (f 1, f 2 ) = (F m 3, F m 2 ) wir testen an der Stelle f 2 falls Suche im rechten Intervall fortgesetzt wird (Länge F m 1 1): ist f 1 = 0 : F m 3 = 0, F m 2 = 1 F m 1 1 = F m 3 + F m 2 1 = 0 d.h. die Suche bricht ab andernfalls merken wir uns (f 1, f 2) = (F m 4, F m 3 ) = (f 2 f 1, f 1 ) programmtechnische Umsetzung für n = F m 1 wir speichern ein Paar (f 1, f 2 ) = (F m 3, F m 2 ) wir testen an der Stelle f 2 falls Suche im linken Intervall fortgesetzt wird (Länge F m 2 1) : ist f 2 = 1 F m 2 1 = 0 d.h. die Suche bricht ab andernfalls merken wir uns (f 1, f 2) = (F m 5, F m 4 ) = (2f 1 f 2, f 2 f 1 ) 35 / 55 36 / 55

fibonacci_search(a, m, k) // sucht für n = F(m)-1 im Bereich A[1..n] nach Position // mit Schlüssel k; liefert 0, falls nicht vorhanden pos = -1; f1 = F(m-3); f2 = F(m-2); i = f2; while (pos < 0) do if (k > A(i)) // Durchsuche den oberen Bereich if (f1 = 0) then pos = 0 // nicht vorhanden else i = i + f1 t = f1 f1 = f2 - f1 f2 = t end if else if (k < A(i)) // Durchsuche den unteren Bereich if (f2 = 1) then pos = 0 // nicht vorhanden else i = i - f1 f2 = f2 - f1 f1 = f1 -f2 end if else pos = i end if return pos // gefunden 37 / 55 Gliederung das Auswahlproblem (Medianbestimmung) Suchen in unsortierten Listen Suchen in sortierten Listen binäre Suche Fibonacci-Suche exponentielle Suche weitere Suchverfahren selbstorganisierende Listen 38 / 55 Szenario: n ist sehr groß, oder unbekannt Dann ist es sinnvoll, zuerst einen Bereich zu bestimmen, in dem ein gegebener Schlüssel liegen muss. Idee der exponentiellen Suche wir verdoppeln in jedem Schritt den Suchbereich bis wir ein Intervall gefunden haben mit A( i 2 ) < k A(i) in diesem Intervall suchen wir binär weiter. exponential_search(a, 1, n, k) // suche nach Position mit Schlüssel k im Bereich A[1..n] if ((k < A(1) or k > A(n))) return 0 else i = 1 while ((k > A(i)) und (i < n)) do i = i + i if (i > n) i = n return binary_search(a,i/2,i,k) 1 2 4 8 16 39 / 55 40 / 55

Analyse der exponentiellen Suche Annahme: alle Schlüssel sind verschieden, positiv und ganzzahlig. Schlüssel wachsen mindestens so schnell wie die Indizes der wird in der while-schleife d -mal verdoppelt, so gilt 2 d 1 A(2 d 1 ) < k < A(2 d ) d < 1 + log k = Θ(log k ) Vergleiche der Suchbereich enthält dann höchstens 2 d 1 < k Schlüssel Θ(log k ) Vergleiche in binary_search im worst case die Gesamtlaufzeit beträgt somit Θ(log k ). sinnvoll, wenn k n gilt. Gliederung das Auswahlproblem (Medianbestimmung) Suchen in unsortierten Listen Suchen in sortierten Listen binäre Suche Fibonacci-Suche exponentielle Suche weitere Suchverfahren selbstorganisierende Listen 41 / 55 42 / 55 Interpolationssuche sucht man im Telefonbuch den Namen Ackermann, so wird man vorne aufschlagen, bei Knuth eher in der Mitte die Sondierung wird somit in Abhängigkeit von der Verteilung der Namen gewählt m Binärsuche testet stets in der Mitte des Intervalls m = ll + 12 (r l) die Interpolationssuche interpoliert die Schlüssel linear zwischen den Intervallgrenzen A(l) A(r) m = l m l + k A(l) (r l). A(r ) A(l) Satz Sind die n Schlüssel unabhängig und gleichverteilt aus einem Intervall I, so beträgt die mittlere Suchzeit O(log log n). Aber der worst-case beträgt Θ(n) und ist damit schlechter als binäre Suche: Beispiel: A(i) = n für 1 i < n A(n) = 2n k = n + 1 dann liefert die Interpolationssuche m = l + k A(l) ı (r l) = 1 + n + 1 n ı (n 1) = 2 A(r ) A(l) 2n n und danach m = 3, 4, 5... l r 43 / 55 44 / 55

quadratische Binärsuche Versuch, unter Beibehaltung der guten mittleren Laufzeit die worst-case-laufzeit zu verbessern: seien wie vorher A(1) <... < A(n) zusätzlich A(0) < A(1), A(n + 1) > A(n) führe einen Schritt der Interpolationssuche aus teile das verbleibende Suchintervall in Subintervalle der Größe n auf führe lineare Suche auf diesen Subintervallen duch und bestimme das Subintervall, in dem x liegen müsste wende das Verfahren rekursiv auf dieses Subintervall an. setze l := 0, r := n + 1 und rufe quadratische Binärsuche(A,k,l,r) auf. quadratische Binärsuche (A,k,l,r) l m (1) setze aktuell := l + k A(l) (r l) A(r ) A(l) (2) ist k = A(aktuell), stop. (3) ist k > A(aktuell), setze l := aktuell + 1 (4) ist k < A(aktuell), setze r := aktuell 1 (5) bestimme durch lineare Suche ein i mit A(l + (i 1) n ˇ) k A(l + i n ˇ) (6) wende Verfahren rekursiv an auf das Intervall [l + (i 1) n ˇ, l + i n ˇ]. n n n n n 45 / 55 46 / 55 Es lässt sich zeigen: Lemma Seien die Schlüssel unabhängig und gleichverteilt über (A(0), A(n + 1)). Dann ist die mittlere Anzahl C der Vergleiche pro Programmaufruf der quadratischen Binärsuche höchstens 3. das Verfahren findet im Mittel nach drei Schritten das Intervall der Größe n, in dem k liegen müsste. Daraus lässt sich die mittlere Laufzeit abschätzen: Satz Unter der obigen Voraussetzung betragen die mittleren Kosten T avg (n) der quadratischen Binärsuche O(log log n). Beweis: Es gilt: T avg (1) 1, T avg (2) 2 und T avg (n) C + T avg ( n) für n 3. Wir zeigen per Induktion T avg (n) 2 + C log log n: T avg (n + 1) C + T avg ( n + 1) = C + 2 + C log log((n + 1) 1 2 ) = C + 2 + C log 1 log(n + 1) 2 = 2 + C log log(n + 1) Im schlimmsten Fall beträgt die Suchzeit n 1 2 + n 1 4 +... = O( n) Einheiten. 47 / 55 48 / 55

exponentielle und binäre Suche 2. Versuch, unter Beibehaltung der guten mittleren Laufzeit die worst-case-laufzeit zu verbessern: seien wie vorher A(1) <... < A(n) zusätzlich A(0) < A(1), A(n + 1) > A(n) führe einen Schritt der Interpolationssuche aus zerlege das verbleibende Suchintervall in Subintervalle der Größe n, 2 n, 4 n,... 2 i n auf teile das verbleibende Suchintervall in Subintervalle der Größe n auf führe binäre Suche auf diesen Subintervallen durch und bestimme das Subintervall, in dem x liegen müsste wende das Verfahren rekursiv auf dieses Subintervall an. setze l := 0, r := n + 1 und rufe quadratische Binärsuche(A,k,l,r) auf. exponentielle und binäre Suche (A,k,l,r) l m (1) setze aktuell := l + k A(l) (r l) A(r ) A(l) (2) ist k = A(aktuell), stop. (3) ist k > A(aktuell), setze l := aktuell + 1 (4) ist k < A(aktuell), setze r := aktuell 1 (5) bestimme: S(l + 2 i 1 n) < k S(l + 2 i n). (6) auf dem Intervall [l + 2 i 1 n, l + 2 i n] bestimme j durch binäre Suche mit S(l + (j 1) n) < k S(l + j n). (7) wende Verfahren rekursiv auf das Intervall [l + (j 1) n, l + j n] an 49 / 55 50 / 55 Gliederung das Auswahlproblem (Medianbestimmung) Satz Unter der obigen Voraussetzung gilt für die exponentielle und binäre Suche: die Anzahl der Vergleiche im schlechtesten Fall ist O(log n) die Anzahl der Vergleiche im Mittel ist O(log log n) ( da log i i) Suchen in unsortierten Listen Suchen in sortierten Listen binäre Suche Fibonacci-Suche exponentielle Suche weitere Suchverfahren selbstorganisierende Listen 51 / 55 52 / 55

Szenario: Datenstruktur: verkettete, unsortierte Listen wiederholte Suchanfragen unterschiedliche Häufigkeiten für die Schlüssel organisiere Liste so um, dass häufige Anfragen am Anfang der Liste Strategien: Bei jeder Anfrage an einen Schlüssel: vertausche Listenelement mit Element davor, oder erhöhe einen Anfragenzähler und sortiere nach fallendem Zähler, oder setze Element an die Spitze der Liste. 53 / 55 54 / 55 zur Suche haben wir bisher lediglich Vergleichsoperationen auf den Schlüsseln zugelassen wir werden im nächsten Kapitel arithmetische Operationen auf den Schlüsseln erlauben, um daraus die mögliche Position des Datums zu berechnen. 55 / 55