45
Algorithmen und Datenstrukturen Prof. Martin Lercher Institut f¨ ur Informatik Heinrich-Heine-Universit¨ at D¨ usseldorf Algorithmen und Datenstrukturen Teil 3 Suchen in Listen Version vom: 15. November 2016 1/1

Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Algorithmen und Datenstrukturen

Prof. Martin Lercher

Institut fur InformatikHeinrich-Heine-Universitat DusseldorfAlgorithmen und Datenstrukturen

Teil 3Suchen in Listen

Version vom: 15. November 2016

1 / 1

Page 2: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Fortsetzung Vorlesung 6

08. November 2016

2 / 1

Page 3: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen in Listen

i-t kleinstes Element

Gegeben: Eine Folge mit n > 0 Elementen a0, . . . , an−1;jedes Element ai hat einen Schlussel ki ∈ N;alle Schlussel sind paarweise verschieden.

Aufgabe: Bestimme das Element mit dem i-t kleinsten Schlussel

Definition

Der Median einer Folge k0, · · · , kn−1 von paarweise verschiedenenSchlusseln ist der Schlussel ki , fur den b n2c Schlussel der Folge kleiner alski sind und d n2e − 1 Schlussel der Folge großer als ki sind.

Es gilt immer ⌊n2

⌋≥⌈n

2

⌉− 1

Spezialfall: Der Median ist das i-t kleinste Element fur i =⌊n2

⌋+ 1.

3 / 1

Page 4: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen in Listen

Beispiel

F1 = 1 10 2 8 13 9 7 0 20

n = 9, b n2c = 4 kleinere Schlussel, d n2e − 1 = 4 großere Schlussel

0 1 2 7︸ ︷︷ ︸<8

8 9 10 13 20︸ ︷︷ ︸>8

Der Median der Folge F1 ist 8.

F2 = 1 10 2 8 13 9 7 0 20 16

n = 10, b n2c = 5 kleinere Schlussel, d n2e − 1 = 4 großere Schlussel

0 1 2 7 8︸ ︷︷ ︸<9

9 10 13 16 20︸ ︷︷ ︸>9

Der Median der Folge F2 ist 9.

4 / 1

Page 5: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen in Listen

Methode 1: Suche in der Folge i-mal das Element mit kleinstem Schlusselund entferne es.

Laufzeit: Θ(i · n)

Der Median kann so in Zeit Θ(n2) gefunden werden.

Methode 2: Sortiere die Folge und suche das Element mit dem i-tkleinsten Schlussel.

Laufzeit: O(n · log(n))

Der Median kann so in Zeit O(n · log(n)) gefunden werden.

5 / 1

Page 6: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen in Listen

Methode 3: (Mit einem Heap) Erstelle aus den gegebenen n Elementeneinen Heap mit umgekehrter Ordnung, d.h., die Schlussel der Nachfolgersind stets großer als die Schlussel der Vorganger.

Entferne dann i mal das kleinste Element.

Laufzeit: O(n + i · log(n))

Der Median kann so ebenfalls in Zeit O(n · log(n)) gefunden werden.

6 / 1

Page 7: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen in Listen

Methode 4: Teile die Folge wie bei Quicksort bezuglich eines geeignetgewahlten Pivotelementes in zwei Teilfolgen F1,F2 auf. F1 enthalt nurElemente mit Schlusseln, die kleiner als das Pivotelement sind; F2 enthaltnur Elemente mit Schlusseln, die großer als das Pivotelement sind.

• Falls F1 genau i − 1 Elemente enthalt, so ist der i-t kleinsteSchlussel das Pivotelement.

• Falls F1 mehr als i − 1 Elemente enthalt, so kommt der i-t kleinsteSchlussel in F1 vor, ansonsten ist der i-kleinste Schlussel in F2.

Suche anschließend den i-t kleinsten Schlussel in F1 bzw. deni − (|F1|+ 1) kleinsten Schlussel in F2.

7 / 1

Page 8: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen in Listen

Kann das Pivotelement so gewahlt werden, dass q · n Elemente in dereinen Teilfolge und (1− q)n Elemente in der anderen Teilfolge sind, fureinen konstanten Bruchteil 1/2 ≤ q < 1, so gilt offenbar folgendes:

Sei T (n) die Anzahl der Schritte des beschriebenen Verfahrens fur dasFinden des Elementes mit i-t kleinstem Schlussels in einer Folge von nElementen. Dann ist

T (n) = T (q · n) +c · n= T (q2 · n) +q · c · n +c · n= T (q3 · n) +q2 · c · n +q · c · n +c · n= T (q4 · n) +q3 · c · n +q2 · c · n +q · c · n +c · n= . . .

fur eine entsprechende Konstante c und somit

T (n) ≤ c · n∞∑i=0

qi = c · n · 1

1− q∈ O(n).

Unter diesen Voraussetzungen kann das i-t kleinste Element in linearerZeit gefunden werden.

Problem: Finde ein geeignetes Pivotelement.8 / 1

Page 9: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Median der Mediane Strategie

Methode 5:

Um in einer Folge von n Elementen das i-t kleinste Element zu finden,benutzt man zum Beispiel die Median der Mediane Strategie von Blum,Floyd, Pratt, Rivest, Tarjan (1972).

1 Falls n kleiner als eine gewisse Konstante C ist, berechne das i-tkleinste Element direkt. (C wird spater bestimmt.)

2 Ansonsten teile die Folge mit n Elementen in b n5c Gruppen zu jefunf Elementen und hochstens eine Gruppe mit < 5 Elementen auf.

3 Bestimme den Median jeder Gruppe direkt.

Man erhalt so d n5e Mediane in Zeit O(n).

4 Suche mit dem gleichen Verfahren rekursiv den Median v derMediane.

9 / 1

Page 10: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Median der Mediane Strategie

5 Wahle den Median v der Mediane als Pivotelement und teile dieFolge in zwei Teilfolgen F1, F2 auf.

F1 enthalt k Elemente mit Schlussel, die kleiner als v sind; F2

enthalt n − k − 1 Elemente mit Schlussel, die großer als v sind.

Die Aufteilung kann in Zeit O(n) erfolgen.

6 Falls i ≤ k ist, suche rekursiv das i-t kleinste Elemente in F1, fallsi > k + 1 ist suche rekursiv das i − (k + 1)-t kleinste Element in F2,falls i = k + 1 ist, hat man das i-t kleinste Element derAusgangsfolge gefunden (namlich v).

10 / 1

Page 11: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Median der Mediane Strategie

Beispiel

Gegeben sei die Folge

25 12 31 4 19 35 11 2 14 22 18 27 9 1 33 13 23 8 3 6

34 10 21 16 7 26 32 30 24 20 29 15 17 28

Gesucht wird der 5-t kleinster Schlussel. Teile die Folge in Gruppen einund bestimme den Median:

25 12 31 4 19︸ ︷︷ ︸Median 19

35 11 2 14 22︸ ︷︷ ︸Median 14

18 27 9 1 33︸ ︷︷ ︸Median 18

13 23 8 3 6︸ ︷︷ ︸Median 8

34 10 21 16 7︸ ︷︷ ︸Median 16

26 32 30 24 20︸ ︷︷ ︸Median 26

29 15 17 28︸ ︷︷ ︸Median 28

11 / 1

Page 12: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Median der Mediane Strategie

Beispiel

Wir suchen rekursiv den Median der Mediane und teilen dafur in Gruppen:

19 14 18 8 16︸ ︷︷ ︸Median 16

26 28︸ ︷︷ ︸Median 28

Der Median der Mediane ist v = 28.

Teile nun die Folge in zwei Teilfolgen F1 und F2 mit v = 28 alsPivotelement:

25 12 17 4 19 15 11 2 14 22 18 27 9 1 20 13 23 8 3 6 24 10

21 16 7 26 |28| 24 30 34 33 29 35 31 32

F1 enthalt 26 Elemente mit Schlusseln, die kleiner als 28 sind.

12 / 1

Page 13: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Median der Mediane Strategie

Beispiel

Suche also rekursiv den 5-t kleinsten Schlussel in F1:

25 12 17 4 19︸ ︷︷ ︸Median 17

15 11 2 14 22︸ ︷︷ ︸Median 14

18 27 9 1 20︸ ︷︷ ︸Median 18

13 23 8 3 6︸ ︷︷ ︸Median 8

24 10 21 16 7︸ ︷︷ ︸Median 16

26︸︷︷︸Median 26

Die rekursive Bestimmung des Medians ergibt:

17 14 18 8 16︸ ︷︷ ︸Median 8

26︸︷︷︸Median 26

Der Median der Mediane ist v = 26.

13 / 1

Page 14: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Median der Mediane Strategie

Beispiel

Teile nun die Folge F1 in zwei Teilfolgen F1 und F2 mit v = 26 alsPivotelement:

25 12 17 4 19 15 11 2 14 22 18 7 9

1 20 13 23 8 3 6 24 10 21 16 |26| 27

F1 enthalt 24 Elemente mit Schlusseln, die kleiner als 26 sind. Bestimmeden Median der Mediane:

25 12 17 4 19︸ ︷︷ ︸Median 17

15 11 2 14 22︸ ︷︷ ︸Median 14

18 7 9 1 20︸ ︷︷ ︸Median 9

13 23 8 3 6︸ ︷︷ ︸Median 8

24 10 21 16︸ ︷︷ ︸Median 21

Der Median der Mediane ist jetzt v = 14

14 / 1

Page 15: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Median der Mediane Strategie

Beispiel

Wir teilen die Folge mit dem Pivotelement 14 in die Folgen F1 und F2

10 12 6 4 3 8 11 2 13 1 9 7 |14|

22 20 16 23 15 19 17 24 25 21 18

Die Folge F1 enthalt jetzt 12 Elemente kleiner als 14.

Suche rekursiv den 5-t kleinsten Schlussel in F1. Hier ware es sinnvoll,den 5-t kleinsten Schlussel direkt zu bestimmen.

Somit ergibt sich 6 als der 5-t kleinste Schlussel der Gesamtfolge.

15 / 1

Page 16: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Median der Mediane Strategie

Analyse:

Anzahl der Elemente fur den rekursiven Aufruf der Methode in Schritt 6:Jede Gruppe (außer die Gruppe, die den Median der Mediane v enthalt,und die Gruppe mit weniger als 5 Elementen) mit einem Median kleinerals v enthalt mindestens drei Elemente mit Schlussel kleiner als v .

In der Ausgangsfolge gibt es genau⌊12

⌈n5

⌉⌋viele Gruppen mit einem

Median kleiner als v und somit mindestens⌊12

⌈n5

⌉⌋− 1 Gruppen mit

genau 5 Elementen und einen Median kleiner als v und somit mindestens

3 · (⌊

1

2

⌈n5

⌉⌋− 1) ≥ 3 · (

⌈1

2

⌈n5

⌉⌉− 2) ≥ 3n

10− 6

Elemente mit Schlussel kleiner als v .

Bemerkung: bac ≥ dae − 1

16 / 1

Page 17: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Median der Mediane Strategie

Jede Gruppe (außer die Gruppe, die v enthalt, und die Gruppe mitweniger als 5 Elementen) mit einem Median großer als v enthaltmindestens drei Elemente mit Schlussel großer als v .

In der Ausgangsfolge gibt es⌈12

⌈n5

⌉⌉− 1 viele Gruppen mit einem

Median großer als v und somit mindestens⌈12

⌈n5

⌉⌉− 2 Gruppen mit

genau 5 Elementen und einen Median großer als v und somit mindestens

3 · (⌈

1

2

⌈n5

⌉⌉− 2) ≥ 3n

10− 6

Elemente mit Schlussel großer als v .

Anweisung 6 des Verfahrens muss somit fur hochstensn − ( 3n

10 − 6) = 7n10 + 6 Elemente aufgerufen werden.

17 / 1

Page 18: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Median der Mediane Strategie

Sei T (n) die Anzahl der Schritte des Verfahrens fur das Finden des i-tkleinsten Elementes in einer Folge von n Elementen.

Dann ist fur n ≥ 24

T (n) ≤ T(⌈n

5

⌉)+ T

(⌈7

10n + 6

⌉)+ a · n

fur eine Konstante a.T(⌈n

5

⌉)ist die Anzahl der Schritte fur den rekursiven Aufruf in Anweisung 4,

T

(⌈7

10n + 6

⌉)ist die Anzahl der Schritte fur den rekursiven Aufruf in Anweisung 6, unda · n der Aufwand in den Schritten (1), (2), (3) und (5).

18 / 1

Page 19: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Median der Mediane Strategie

Wir behaupten, fur n ≥ 24 ist T (n) ≤ c · n mit

c = max

{T (89)

89, 100a

}.

Daraus folgt T (n) ∈ O(n).

Induktionsbeweis:

Die Argumente fur T auf der rechten Seite der Ungleichung sind allekleiner als n, falls 7

10n + 1 + 6 < n bzw. n ≥ 24.

Induktionsanfang fur 24 ≤ n ≤ 89: Offensichtlich gilt

T (24) ≤ T (25) ≤ · · · ≤ T (89)

und wegen der Wahl von c

T (89) ≤ c · 89.

19 / 1

Page 20: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Median der Mediane Strategie

Angenommen T (M) ≤ c ·M sei bereits bewiesen fur alle Argumente Mkleiner als n und großer gleich 89.

Dann ist

T (n) ≤ c · d n5e +c · d( 710n + 6)e +a · n

≤ c ·(15n + 1

)+c ·

(710n + 6 + 1

)+a · n

≤ c · 15n + c +c · 710n + 6c + c +a · n

= 910cn + 8c +a · n

20 / 1

Page 21: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Median der Mediane Strategie

Der letzte Ausdruck ist hochstens c · n, wie folgende Rechnung beginnendmit 89 ≤ n zeigt.

89 ≤ n

⇒ 801 ≤ 9n

⇒ 800 ≤ 9n

⇒ 90n + 800 + n ≤ 100n

⇒ 90010 an + 800a + an ≤ 100an

⇒ 910cn + 8c + an ≤ cn

mit c := 100a

21 / 1

Page 22: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Median der Mediane Strategie

Da wir das i-t kleinste Element in einer Folge mit hochstens 89 Elementenin konstanter Zeit finden konnen, gilt insgesamt die folgende Aussage:

Satz: Das i-t kleinste Element in einer Folge von n Elementen kann inO(n) vielen Schritten gefunden werden.

Bemerkungen:

• Die Aussage ist von großer prinzipieller Bedeutung!

• Praktisch lohnt sich diese Methode erst bei sehr großenDatenmengen.

• Wird bei Quicksort der Median als Pivotelement gewahlt, ist dieAnzahl der Vergleiche im besten, im mittleren und im schlechtestenFall in Θ(n · log(n)).

22 / 1

Page 23: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen in geordneten Listen

Suche Element mit Schlussel k

Gegeben: Eine Folge mit n > 0 Elementen a0, . . . , an−1;jedes Element ai hat einen Schlussel ki ∈ N;ai < ai+1 fur i = 0, . . . , n − 2.

Aufgabe: Suche das Element mit Schlussel k , falls es existiert.

Methode 1: (Lineares Durchsuchen)

Lineares Durchsuchen einer Liste mit n Elementen benotigt n Vergleicheim ungunstigsten Fall, und n/2 Vergleiche im Mittel.

23 / 1

Page 24: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Binare Suche

Methode 2: (Binare Suche)

1 Falls n = 0, breche die Suche ab.

2 Vergleiche den Schlussel des Elementes auf Position x = d n−12 e mitdem Schlussel k.

Ist A[x ].k < k, dann durchsuche rekursiv die FolgeA[x + 1], . . . ,A[n − 1].

Ist A[x ].k > k dann durchsuche rekursiv die FolgeA[0], . . . ,A[x − 1].

Ist A[x ].k = k dann ist das Element mit Schlussel k gefunden.

Die Methode kann rekursiv als auch iterativ implementiert werden.

24 / 1

Page 25: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Binare Suche

Beispiel

Gegeben Sei die bereits sortierte Folge im Feld A:

2 3 5 9 14 20 22 23

Wir suchen den Schlussel k = 5. Wir vergleichen im ersten Schritt denSchlussel auf Position 4 mit dem Schlussel k . Da 14 > 5, suchen wir inder linken Teilfolge rekursiv weiter:

2 3 5 9

Wir vergleichen nun den Schlussel auf Position 2 mit dem Schlussel kund haben das Element gefunden.

Analyse:

Binares Suchen benotigt hochstens O(log(n)) Vergleiche.

Im Mittel benotigt binares Suchen ebenfalls O(log(n)) Vergleiche.25 / 1

Page 26: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Vorlesung 7

11. November 2016

26 / 1

Page 27: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Fibonacci-Suche

Methode 3:(Fibonacci-Suche)

Die Division zur Bestimmung der mittleren Position kann vermiedenwerden, wenn die Folge entsprechend der Fibonacci-Zahlen aufgeteiltwird.

F0 = 0F1 = 1...Fi = Fi−1 + Fi−2 fur (i ≥ 2)

Angenommen das zu durchsuchende Feld hat die Lange n = Fi − 1 furein i > 0. Dann teilen wir die Folge auf in die ersten Fi−2 − 1 Elemente,das Element auf Position Fi−2 − 1 und die letzten Fi−1 − 1 Elemente.

Fi = Fi−2 + Fi−1Fi − 1 = Fi−2 − 1 + 1 + Fi−1 − 1

27 / 1

Page 28: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Fibonacci-Suche

Um fur einen Suchbereich der Lange Fi − 1 die AufteilungspositionFi−2 − 1 zu finden, merken wir uns die beiden Fibonacci-Zahlen f = Fi

und g = Fi−1.

Angenommen fur den zu durchsuchenden Bereich speichern wir das Paar(f , g), dann wird der Schlussel k mit A[(f − g)− 1].k verglichen:

• Falls A[(f − g)− 1].k < k , dann suchen wir rechts weiter.

Der rechte Bereich hat die Lange g − 1.

Als neues Paar fur den rechten Bereich wahlen wir(f ′, g ′) = (g , f − g).

• Falls A[(f − g)− 1].k > k , dann suchen wir links weiter.

Der linke Bereich hat die Lange f − g − 1.

Als neues Paar fur den linken Bereich wahlen wir(f ′, g ′) = (f − g , g − (f − g)).

28 / 1

Page 29: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Fibonacci-Suche

Beispiel

Bei einer Folge mit F7 − 1 = 12 Elementen teilen wir wie folgt auf:

• die linke Teilfolge mit F5 − 1 = 4 Elementen,

• das Element auf Position A[F5 − 1] = A[4] (dessen Schlussel mitdem Schlussel k verglichen wird),

• die rechte Teilfolge mit F6 − 1 = 7 Elementen.

Gesucht sei der Schlussel k = 3 in der Folge

2 3 6 9 12 16 18 19 23 26 34 36

29 / 1

Page 30: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Fibonacci-Suche

Beispiel

Der Schlussel k = 3 wird mit dem Schlussel auf Position A[4] verglichen:Da A[4] > k, suchen wir rekursiv in A[0], · · · ,A[3] weiter.

Die Folge A[0], · · · ,A[3] mit F5 − 1 = 4 Elementen teilen wir wieder auf:

• eine linke Teilfolge mit F3 − 1 = 1 Elementen,

• das Element auf Position A[F3 − 1] = A[1] (dessen Schlussel mitdem Schlussel k verglichen wird),

• die rechte Teilfolge mit F4 − 1 = 2 Elementen.

Da A[1] = k , wird die Suche erfolgreich beendet.

30 / 1

Page 31: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Fibonacci-Suche

Analyse: Wieviele Schlusselvergleiche werden bei der Suche nach einemSchlussel k maximal ausgefuhrt?

Bei einem Suchbereich der Lange Fi − 1 ist die Lange des nachstensSuchbereichs hochstens Fi−1 − 1. Also sind fur die Suche in einemBereich der Lange Fi − 1 hochstens i Schlusselvergleiche erforderlich.

Nun istFi ≈ c · 1.618i

mit einer Konstanten c .Die maximal erforderliche Anzahl von Vergleichen ist somit

O(log1.618(n+1)) = O (log1.618(n)) = O (log1.618(2) · log(n)) = O(log(n)).

Die im Mittel ausgefuhrte Anzahl von Vergleichen ist ebenfalls inO(log(n)).

31 / 1

Page 32: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Fibonacci-Suche

Bemerkung 1: Seien a, b > 1, dann gilt:

logb(n) = logb(a) · loga(n)

weil:

blogb(n) = n = aloga(n) =(blogb(a)

)loga(n)= blogb(a)·loga(n)

Bemerkung 2: Sei bereits bekannt, dass Fj = c · 1.618j fur j < i .Dann gilt:

Fi = c · 1.618i−2 + c · 1.618i−1 = c · 1.618i−1(1 + 1.618−1)

≈ c · 1.618i−1(1.618) = c · 1.618i

32 / 1

Page 33: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Exponentielle Suche

Methode 4:(Exponentielle Suche)

Ist die Lange der Folge vor Beginn der Suche nicht bekannt, so eignetsich die Exponentielle Suche.

Bestimme in exponentiell wachsenden Schritten einen Bereich, in dem derSchlussel k liegen muss.

(1) int i := 1;(2) while (k > A[i-1].k)(3) i:=i+i;

33 / 1

Page 34: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Exponentielle Suche

Danach giltA[i/2].k ≤ k ≤ A[i − 1].k .

Setzen wir voraus, dass die Folge aufsteigend sortiert ist und die Schlusselpaarweise verschiedene nicht negative ganze Zahlen sind, so wachsen dieSchlussel mindestens so stark wie die Indices der Elemente.

Dann wird i in obiger while-Schleife maximal blog(k)c+ 1 mal verdoppelt:

i ≤ 2blog(k)c+1 = 2 · 2blog(k)c ≤ 2 · k

Der Suchbereich A[i/2], . . . ,A[i − 1] hat somit maximal k Elemente.

Er kann anschließend mit binarer Suche oder der Fibonaccisuche nachdem Element mit Schlussel k durchsucht werden.

34 / 1

Page 35: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Exponentielle Suche

Beispiel

Gesucht sei der Schlussel k = 24 in der Folge

2 3 6 9 12 16 18 19 23 24 34 40 41 42 45 52 60 · · ·

Die while-Schleife terminiert nach der 4. Verdopplung von i , dennA[15].k = 52 > 24 = k. Der Suchbereich A[8], · · · ,A[15] kann nun mitbinarer Suche oder der Fibonaccisuche nach dem Element mit Schlussel kdurchsucht werden.

Analyse: Wird der Bereich A[i/2], . . . ,A[i − 1] mit binarer Suche odermit Fibonacci- oder Binarer Suche durchsucht, so findet man Schlussel kstets in maximal O(log(k)) Schritten.

35 / 1

Page 36: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Interpolationssuche

Methode 5:(Interpolationssuche)

Schatze die Position des Elementes mit Schlussel k .

Kleine Schlussel liegen am Anfang, große Schlussel weiter hinten.

Inspiziere als nachstes immer das Element auf Position

m = l +

⌊k − A[l ].k

A[r ].k − A[l ].k(r − l)

⌋,

wobei l die linke Grenze und r der rechte Grenze des Suchbereichs ist.

Ist k < A[m].k , dann suche weiter mit r := m − 1, ist k > A[m] dannsuche weiter mit l = m + 1.

Im nachfolgendem Beispiel wird kein Wert auf die Berucksichtigung derTypkonvertierungen der jeweiligen Programmiersprache gelegt.

36 / 1

Page 37: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Interpolationssuche

Algorithmische Umsetzung:

(1) bool ip Suche (Feld A[ ], int l, int r, int k)(2) {(3) if (l > r)OR(k < A[l ].k)OR(k > A[r ].k)(4) return(false);(7) int m := l + b((k − A[l ].k) / (A[r ].k − A[l ].k)) · (r − l)c;(8) if (A[m].k = k)(9) return(true);(10) if (k < A[m].k)(11) {(12) return(ip Suche(A, l ,m − 1, k));(13) }(14) if (k > A[m].k)(15) {(16) return(ip Suche(A,m + 1, r , k));(17) }(18) }

37 / 1

Page 38: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Interpolationssuche

Beispiel

Gesucht wird der Schlussel k = 16 in der Folge

2 3 6 9 12 16 18 19 23 24 34 40 42 49

Fur m ergibt sich folgende Gleichung, wenn l = 0 und r = (n − 1) = 13die Feldgrenzen sind:

m = 0 +

⌊(16− 2)

(49− 2)(13− 0 + 0.999999...)

⌋,

Daraus ergibt sich m = 4. Da A[4] = 12 < 16 = k , suchen wir rekursivweiter mit l = 5 und r = 13:

m = 5 +

⌊(16− 16)

(49− 16)(13− 5 + 0.999999)

⌋,

Daraus ergibt sich m = 5. Da A[5] = 16 = k , endet die Suche erfolgreich.

38 / 1

Page 39: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Interpolationssuche

Analyse: Man kann zeigen, dass Interpolationssuche im Mittellog(log(n)) + 1 Schlusselvergleiche ausfuhrt, wenn die Schlusselunabhangig und gleich verteilte Zufallszahlen sind.

Bemerkung: Die Interpolationssuche benotigt in aquidistantenSchlusselfolgen aufgrund der Linearitat nur Θ(1) Schritte.

Beachte: Der Vorteil der geringen Anzahl von Schlusselvergleichen gehtleicht durch die hohe Anzahl der auszufuhrenden arithmetischenOperationen verloren.

39 / 1

Page 40: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Selbstanordnende Listen

Das Ziel der Selbstanordnenden Listen ist es, die Elemente, auf die haufigzugegriffen wird, moglichst weit vorne und die Elemente, auf die seltenzugegriffen wird, an das Ende der Liste zu platzieren.

Strategien: Sei k das Element, auf das zugegriffen wird.

1 (MF) Move-to-front-Regel: Mache das Element k zum erstenElement der Liste. Die Anordnung der ubrigen Elemente bleibterhalten.

2 (T) Transpose-Regel: Vertausche k mit seinem Vorganger.

3 (F) Frequency-Count-Regel: Ordne die Elemente nach ihrerZugriffshaufigkeit.

Experimentell ermittelte Messergebnisse fur reale Daten ergaben:

• die T-Regel ist schlechter als die FC-Regel,

• die FC-Regel und MF-Regel sind etwa gleich gut,

• die MF-Regel ist allerdings in manchen Fallen besser.

40 / 1

Page 41: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Move-to-front-Regel

Beispiel

Gegeben ist eine Liste mit folgenden Eintragen: 1,2,3,4,5,6,7

Betrachtet werden die folgenden Anfragen: 4,2,4,5,2,2,7,4,4

Anfrage Folge Vergleiche1 2 3 4 5 6 7

4 4 1 2 3 5 6 7 42 2 4 1 3 5 6 7 34 4 2 1 3 5 6 7 25 5 4 2 1 3 6 7 52 2 5 4 1 3 6 7 32 2 5 4 1 3 6 7 17 7 2 5 4 1 3 6 74 4 7 2 5 1 3 6 44 4 7 2 5 1 3 6 1

Summe 30

41 / 1

Page 42: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Transpose-Regel

Beispiel

Betrachtet werden die folgenden Anfragen: 4,2,4,5,2,2,7,4,4

Anfrage Folge Vergleiche1 2 3 4 5 6 7

4 1 2 4 3 5 6 7 42 2 1 4 3 5 6 7 24 2 4 1 3 5 6 7 35 2 4 1 5 3 6 7 52 2 4 1 5 3 6 7 12 2 4 1 5 3 6 7 17 2 4 1 5 3 7 6 74 4 2 1 5 3 7 6 24 4 2 1 5 3 7 6 1

Summe 26

42 / 1

Page 43: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Frequency-Count-Regel

Beispiel

Betrachtet werden die folgenden Anfragen: 4,2,4,5,2,2,7,4,4

Anfrage Folge Vergleiche

1[0] 2[0] 3[0] 4[0] 5[0] 6[0] 7[0]

4 4[1] 1[0] 2[0] 3[0] 5[0] 6[0] 7[0] 42 4[1] 2[1] 1[0] 3[0] 5[0] 6[0] 7[0] 34 4[2] 2[1] 1[0] 3[0] 5[0] 6[0] 7[0] 15 4[2] 2[1] 5[1] 1[0] 3[0] 6[0] 7[0] 52 4[2] 2[2] 5[1] 1[0] 3[0] 6[0] 7[0] 22 2[3] 4[2] 5[1] 1[0] 3[0] 6[0] 7[0] 27 2[3] 4[2] 5[1] 7[1] 1[0] 3[0] 6[0] 74 2[3] 4[3] 5[1] 7[1] 1[0] 3[0] 6[0] 24 4[4] 2[3] 5[1] 7[1] 1[0] 3[0] 6[0] 2

Summe 28

In den hochgestellten, eckigen Klammern speichern wir, wie haufig aufdas Element bereits zugegriffen wurde.

43 / 1

Page 44: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Selbstanordnende Listen

Gegeben ist eine Liste mit folgenden Eintragen:

1, 2, 3, 4, 5, 6, 7

Betrachte nun die folgenden Anfragen:

1 Greife 10 mal in der Reihenfolge 1, 2, 3, 4, 5, 6, 7 zu.

Anzahl der Vergleiche mit der MF-Regel= 1 + 2 + 3 + 4 + 5 + 6 + 7 + 9 · 7 · 7 = 469.

Das ergibt eine Anzahl von Vergleichen pro Zugriff von 46970 = 6.7.

2 Greife zehn mal auf 1 zu, dann zehn mal auf 2 zu, usw.

Anzahl der Vergleiche mit der MF-Regel= 10 + 11 + 12 + 13 + 14 + 15 + 16 = 91.

Das ergibt eine Anzahl von Vergleichen pro Zugriff von 9170 = 1.3.

44 / 1

Page 45: Algorithmen und Datenstrukturen - HHU...ist die Anzahl der Schritte f ur den rekursiven Aufruf in Anweisung 4, T ˘ 7 10 n + 6 ˇ ist die Anzahl der Schritte f ur den rekursiven Aufruf

Suchen - Selbstanordnende Listen

Mit der FC-Regel werden in beiden Fallen(1 + 2 + 3 + 4 + 5 + 6 + 7) · 10 = 10 + 20 + 30 + 40 + 50 + 60 + 70 = 280Vergleiche durchgefuhrt. Dabei ergeben sich Durchschnittskosten von10+20+30+40+50+60+70

70 = 4.

Die FC-Regel hat den Nachteil, dass sie zusatzlichen Speicherplatzbenotigt.

Es lasst sich zeigen, dass die MF-Regel hochstens doppelt so schlecht ist,wie jede andere Regel. (Amortisierte Laufzeitanalyse.)

45 / 1