• Keine Ergebnisse gefunden

Suche in Array

N/A
N/A
Protected

Academic year: 2021

Aktie "Suche in Array"

Copied!
11
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

4. Suchen

Lineare Suche, Binäre Suche, Interpolationssuche, Exponentielle Suche, Untere Schranken [Ottman/Widmayer, Kap. 3.2, Cormen et al, Kap. 2: Problems 2.1-3,2.2-3,2.3-5]

119

Das Suchproblem

Gegeben

Menge von Datensätzen.

Beispiele

Telefonverzeichnis, Wörterbuch, Symboltabelle Jeder Datensatz hat einen Schlüsselk.

Schlüssel sind vergleichbar: eindeutige Antwort auf Fragek1 ≤k2 für Schlüsselk1,k2.

Aufgabe: finde Datensatz nach Schlüsselk.

120

Das Auswahlproblem

Gegeben

Menge von Datensätzen mit vergleichbaren Schlüsselnk. Gesucht: Datensatz, mit dem kleinsten, grössten, mittleren Schlüssel. Allgemein: finde Datensatz mit i-kleinstem Schlüssel.

Suche in Array

Gegeben

ArrayA mitn Elementen(A[1], . . . , A[n]). Schlüsselb

Gesucht: Indexk,1≤ k ≤n mitA[k] =boder ”nicht gefunden”.

10

4

20

2

22

1

24

6

28

9

32

3

35

5

38

8

41

10

42

7

(2)

Lineare Suche

Durchlaufen des Arrays vonA[1]bisA[n]. Bestenfalls1Vergleich.

Schlimmstenfallsn Vergleiche.

Annahme: Jede Anordnung dern Schlüssel ist gleichwahrscheinlich. ErwarteteAnzahl Vergleiche:

1 n

Xn i=1

i = n+ 1 2 .

123

Suche in sortierten Array

Gegeben

Sortiertes ArrayAmitn Elementen(A[1], . . . , A[n])mit A[1]≤ A[2] ≤ · · · ≤A[n].

Schlüsselb

Gesucht: Indexk,1≤ k ≤n mitA[k] =boder ”nicht gefunden”.

10

1

20

2

22

3

24

4

28

5

32

6

35

7

38

8

41

9

42

10

124

Divide and Conquer!

Suche b= 23.

10

1

20

2

22

3

24

4

28

5

32

6

35

7

38

8

41

9

42

10

b <28

10

1

20

2

22

3

24

4

28

5

32

6

35

7

38

8

41

9

42

10

b >20

22

3

24

4

28

5

10

1

20

2

32

6

35

7

38

8

41

9

42

10

b >22

24

4

10

1

20

2

22

3

28

5

32

6

35

7

38

8

41

9

42

10

b <24

24

4

10

1

22

3

20

2

28

5

32

6

35

7

38

8

41

9

42

10

erfolglos

Bin¨arer Suchalgorithmus BSearch(A,b,l,r)

Input : Sortiertes ArrayA vonn Schl¨usseln. Schl¨ussel b. Bereichsgrenzen 1lrn oderl > rbeliebig.

Output : Index des gefundenen Elements. 0, wenn erfolglos.

m← b(l+r)/2c

if l > rthen// erfolglose Suche return0

else if b=A[m] then// gefunden returnm

else if b < A[m] then// Element liegt links returnBSearch(A, b, l, m1)

else// b > A[m]: Element liegt rechts returnBSearch(A, b, m+ 1, r)

(3)

Analyse (Schlimmster Fall)

Rekurrenz (n= 2k) T(n) =

(d fallsn = 1, T(n/2) +c fallsn >1. Teleskopieren:

T(n) =T n 2

+c= T n 4

+ 2c

=T n 2i

+i·c

=T n n

+ log2n·c.

Annahme: T(n) =d+clog2n

127

Analyse (Schlimmster Fall)

T(n) =

(d fallsn = 1, T(n/2) +c fallsn >1. Vermutung: T(n) =d+c·log2n

Beweis durch Induktion:

Induktionsanfang: T(1) =d.

Hypothese: T(n/2) =d+c·log2n/2 Schritt (n/2→ n)

T(n) =T(n/2) +c= d+c·(log2n−1) +c =d+clog2n.

128

Resultat

Theorem

Der Algorithmus zur binären sortierten Suche benötigtΘ(logn) Elementarschritte.

Iterativer bin¨arer Suchalgorithmus

Input : Sortiertes ArrayA vonn Schl¨usseln. Schl¨ussel b.

Output : Index des gefundenen Elements. 0, wenn erfolglos.

l1;r n whilelr do

m← b(l+r)/2c if A[m] =bthen

return m

else if A[m]< bthen lm+ 1 else

rm1 return0;

(4)

Korrektheit

Algorithmus bricht nur ab, falls Aleer oderbgefunden.

Invariante: Fallsbin A, dann im BereichA[l, ..., r]

Beweis durch Induktion

Induktionsanfang: b∈ A[1, .., n](oder nicht) Hypothese: Invariante gilt nach iSchritten Schritt:

b < A[m] ⇒ b∈ A[l, .., m−1]

b > A[m] ⇒ b∈ A[m+ 1, .., r]

131

Geht es noch besser?

Annahme: Gleichverteilung derWerteim Array.

Beispiel

Name ”Becker” würde man im Telefonbuch vorne suchen.

”Wawrinka" wohl ziemlich weit hinten.

Binäre Suche vergleicht immer zuerst mit der Mitte.

Binäre Suche setzt immerm=

l+ r2l .

132

Interpolationssuche

Erwartete relative Position vonb im Suchintervall[l, r]

ρ = b−A[l]

A[r]−A[l] ∈ [0,1].

Neue ”Mitte”: l+ρ·(r−l)

Anzahl Vergleiche im Mittel O(log logn) (ohne Beweis).

? Ist Interpolationssuche also immer zu bevorzugen?

! Nein: Anzahl Vergleiche im schlimmsten Fall Ω(n).

Exponentielle Suche

Annahme: Schlüsselb liegt eher vorne im ArrayA. nsehr gross.

Exponentielles Vorgehen:

1 Lege Suchbereichl= 1,r = 1fest.

2 Verdoppler so lange, bisr > n oderA[r] > b.

3 Setzer← min(r, n).

4 Führe binäre Suche durch mitl ←r/2,r.

(5)

Analyse der Exponentiellen Suche

Seimder gesuchte Index.

Anzahl Schritte für die Verdopplung vonr: maximal log2m. Binäre Suche ist dann auchO(log2m).

Schlechtester Fall ingesamt: Anzahl SchritteO(log2n).

? Wann ist dieses Verfahren sinnvoll?

! Wennm << n. Zum Beispiel bei positiven ganzzahligen paarweise verschiedenen Schlüsseln und b << N (N: grösster Schlüsselwert).

135

Untere Schranke

Binäre und exponentielle Suche (im schlechtesten Fall):Θ(logn) viele Vergleiche.

Gilt fürjedenSuchalgorithms in sortiertem Array (im schlechtesten Fall): Anzahl Vergleiche =Ω(logn)?

136

Entscheidungsbaum

3

1

2

5

4 6

b < A[3]

b < A[5]

b > A[3]

b > A[1] b > A[5]

Für jede Eingabeb=A[i]

muss Algorithmus erfolgreich seinBaum enthält

mindestensnKnoten.

Anzahl Vergleiche im schlechtesten Fall = Höhe des Baumes = maximale Anzahl Knoten von Wurzel zu Blatt.

Entscheidungsbaum

Binärer Baum der Höhehhat höchstens 20+ 21+· · ·+ 2h−1 = 2h−1<2hKnoten.

Mindestensn Knoten im Entscheidungsbaum mit Höheh. n <2h ⇒ h >log2n.

Anzahl Entscheidungen =Ω(logn). Theorem

Jeder Algorithmus zur Suche in sortierten Daten der Längen benötigt im schlechtesten FallΩ(logn) Vergleichsschritte.

(6)

Untere Schranke f¨ur Suchen in unsortiertem Array

Theorem

Jeder Algorithmus zur Suche in unsortierten Daten der Längen benötigt im schlechtesten Fall Ω(n) Vergleichsschritte.

139

Versuch

? Korrekt?

”Beweis”: Umbin Azu finden, muss bmit jedem ElementA[i]

(1≤i ≤ n) verglichen werden.

! Falsch! Vergleiche zwischen Elementen vonAmöglich!

140

Besseres Argument

i Vergleiche ohnebundeVergleiche mitb Vergleiche erzeugeng Gruppen. Initialg =n.

Verbinden zweier Gruppen benötigt mindestens einen Vergleich:

n−g ≤i.

Mindestens ein Element pro Gruppe muss mitb verglichen werden: e≥ g.

Anzahl Vergleiche i+e≥ n−g+g =n.

141

5. Ausw¨ahlen

Das Auswahlproblem, Randomisierte Berechnung des Medians, Lineare Worst-Case Auswahl [Ottman/Widmayer, Kap. 3.1, Cormen et al, Kap. 9]

142

(7)

Min und Max

? Separates Finden von Minimum und Maximum in

(A[1], . . . , A[n])benötigt insgesamt 2n Vergleiche. (Wie) geht es mit weniger als2nVergleichen für beide gemeinsam?

! Es geht mit 32N Vergleichen: Vergleiche jeweils 2 Elemente und deren kleineres mit Min und grösseres mit Max.

143

Das Auswahlproblem

Eingabe

Unsortiertes ArrayA = (A1, . . . , An) paarweise verschiedener Werte

Zahl1≤k ≤ n.

Ausgabe:A[i] mit|{j : A[j] < A[i]}|=k−1 Spezialfälle

k= 1: Minimum: Algorithmus mitn Vergleichsoperationen trivial.

k= n: Maximum: Algorithmus mitn Vergleichsoperationen trivial.

k= bn/2c: Median.

144

Ans¨atze

Wiederholt das Minimum entfernen / auslesen: O(k·n). Median: O(n2)

Sortieren (kommt bald): O(nlogn) PivotierenO(n)!

Pivotieren

1 Wähle ein Elementpals Pivotelement

2 TeileAin zwei Teile auf, den Rang vonpbestimmend.

3 Rekursion auf dem relevanten Teil. Fallsk = r, dann gefunden.

p > > > >

p > > > >

p p

1 r n

(8)

Algorithmus Partition( A[l..r ], p )

Input : ArrayA, welches den Sentinelpim Intervall[l, r] mindestens einmal enth¨alt.

Output : ArrayApartitioniert in [l..r] ump. R¨uckgabe der Position vonp.

whilel < rdo whileA[l]< pdo

ll+ 1 whileA[r]> pdo

rr1 swap(A[l],A[r]) if A[l] =A[r]then

ll+ 1 returnl-1

147

Korrektheit: Invariante

InvarianteI: Aipi[0, l),Ai> pi(r, n],k [l, r] :Ak=p. whilel < rdo

while A[l]< pdo ll+ 1 while A[r]> pdo

rr1 swap(A[l],A[r]) if A[l] =A[r] then

ll+ 1 returnl-1

I

IundA[l]p IundA[r]p IundA[l]pA[r]

I

148

Korrektheit: Fortschritt

whilel < rdo

whileA[l]< pdo ll+ 1 whileA[r]> pdo

rr1 swap(A[l], A[r]) if A[l] =A[r] then

ll+ 1 returnl-1

Fortschritt wennA[l]< p Fortschritt wennA[r]> p

Fortschritt wennA[l]> poderA[r]< p Fortschritt wennA[l] =A[r] =p

Wahl des Pivots

Das Minimum ist ein schlechter Pivot: worst CaseΘ(n2)

p1 p2 p3 p4 p5

Ein guter Pivot hat linear viele Elemente auf beiden Seiten.

p

·n ·n

(9)

Analyse

Unterteilung mit Faktorq (0< q <1): zwei Gruppen mitq ·nund (1−q)·n Elementen (ohne Einschränkungq ≥1−q).

T(n) ≤ T(q·n) +c·n

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

logXq(n)−1 i=0

qi+T(1)

≤ c·n X

i=0

qi

| {z }

geom. Reihe

= c·n· 1

1−q = O(n)

151

Wie bekommen wir das hin?

Der Zufall hilft uns (Tony Hoare, 1961). Wähle in jedem Schritt einen zufälligen Pivot.

1 4

1 4 1

2

schlecht gute Pivots schlecht

Wahrscheinlichkeit für guten Pivot nach einem Versuch: 12 =: ρ. Wahrscheinlichkeit für guten Pivot nachkVersuchen: (1−ρ)k−1·ρ. Erwartungswert der geometrischen Verteilung: 1/ρ = 2

152

[Erwartungswert der geometrischen Verteilung]

ZufallsvariableX ∈N+ mitP(X = k) = (1−p)k1·p. Erwartungswert

E(X) = X

k=1

k·(1−p)k−1·p= X k=1

k·qk−1·(1−q)

= X

k=1

k·qk−1−k·qk = X

k=0

(k+ 1)·qk−k·qk

= X

k=0

qk = 1

1−q = 1 p.

Algorithmus Quickselect ( A[l..r], i )

Input : ArrayAder L¨angen. Indizes1lirn, so dass f¨ur alle xA[l..r] gilt, dass|{j|A[j]x}| ≥lund |{j|A[j]x}| ≤r.

Output : Partitioniertes ArrayA, so dass|{j|A[j]A[i]}|=i if l=r thenreturn;

repeat

w¨ahle zuf¨alligen Pivot xA[l..r]

pl

forj=lto r do

if A[j]xthen pp+ 1 until l+r4 p 3(l+r)4

mPartition(A[l..r], x) if i < mthen

quickselect(A[l..m], i) else

(10)

Median der Mediane

Ziel: Finde einen Algorithmus, welcher im schlechtesten Fall nur linear viele Schritte benötigt.

Algorithmus Select (k-smallest) Fünfergruppen bilden.

Median jeder Gruppe bilden (naiv).

Select rekursiv auf den Gruppenmedianen.

Partitioniere das Array um den gefundenen Median der Mediane.

Resultat: i

Wenni =k, Resultat. Sonst: Select rekursiv auf der richtigen Seite.

155

Median der Mediane

1 Fünfergruppen

2 Mediane

3 Rekursion für Pivot!

4 Basisfall.

5 Pivot (Level 1)

6 Partition (Level 1)

7 Median = Pivot Level 0

8 2. Rekursion startet . . .

. . . . . . . . .

156

Was bringt das?

≤ m

m

≥ m

Anzahl Punkte links / rechts vom Median der Mediane (ohne Mediangruppe und ohne Restgruppe)≥ 3·(d12dn5ee −2)≥ 3n10 −6 Zweiter Aufruf mit maximald7n10 + 6eElementen.

Analyse

Rekursionsungleichung:

T(n)≤ T ln 5

m+T

7n 10 + 6

+d·n.

mit einer Konstantend. Behauptung:

T(n) =O(n).

(11)

Beweis

Induktionsanfang: Wählec so gross, dass

T(n) ≤c·nfür alle n≤ n0. Induktionsannahme:

T(i) ≤ c·i für allei < n. Induktionsschritt:

T(n) ≤T ln 5

m+T

7n 10 + 6

+d·n

=c·ln 5

m+c· 7n

10 + 6

+d·n.

159

Beweis

Induktionsschritt:

T(n) ≤ c·ln 5

m+c· 7n

10 + 6

+d·n

≤ c· n

5 +c+c· 7n

10 + 6c+c+d·n = 9

10 ·c·n+ 8c+d·n.

Wählec ≥80·dundn0= 91.

T(n)≤ 72

80 ·c·n+ 8c+ 1

80 ·c·n =c· 73

80n+ 8

| {z }

nfürn > n0

≤c·n.

160

Resultat

Theorem

Dasi-te Element einer Folge vonnElementen kann in höchstens O(n)Schritten gefunden werden.

¨Uberblick

1. Wiederholt Minimum finden O(n2) 2. Sortieren undA[i] ausgeben O(nlogn) 3. Quickselect mit zufälligem Pivot O(n) im Mittel

4. Median of Medians (Blum) O(n) im schlimmsten Fall

1 4

1 4 1

2

schlecht gute Pivots schlecht

Referenzen

ÄHNLICHE DOKUMENTE

Eine mathematische Funktion f ist theoretisch berechenbar, wenn es einen Algorithmus gibt, der für eine beliebige Eingabe x aus dem Definitionsbereich den Funktionswert f (x

Ob ein Schluss von einer Aussage auf eine andere richtig ist, sollte sich völlig unabhängig vom Gehalt dieser Aussagen nur aufgrund von formalen Regeln begründen lassen.“

So ist die Beschreibung, wie man am schnellsten von Ascona nach Brindisi kommt, kein Algorithmus im eigentlichen Sinne (auch wenn diese eine Handlungsanweisung an einen

[r]

Wir müssen noch zeigen, dass beide Rekursionen dieselben

• Für ein elegantes Programmieren sind gelegentlich Variablen, deren Wert geändert werden kann, ganz nützlich :-). • Darum erweitern wir unsere kleine Programmiersprache

• Am besten wäre es, wenn wir erst auswerten, dann auf das Ergebnis zugreifen .... Helmut Seidl, TU München ;-).. dem Wert für stop ). → Es werden automatisch alle

Auch über die Pädagogische Hochschule Thurgau PHTG, die Partnerhochschule der Universität Konstanz mit gemeinsamen Studiengängen, kommt Konstanzer Studierenden die persönliche