O(log n)

Werbung
Datenstrukturen und
Algorithmen
7. Suchen in linearen Feldern
VO 708.031
Suchen in linearen Feldern
[email protected]
1
Inhalt der Vorlesung
1. Motivation, Einführung, Grundlagen
2. Algorithmische Grundprinzipien
3. Sortierverfahren
4. Halden
5. Gestreute Speicherung
6. Suchen in linearen Feldern
7. Bäume
Suchen in linearen Feldern
[email protected]
2
Suchverfahren
Verfahren, das in einem Suchraum nach Mustern oder Objekten
mit bestimmten Eigenschaften sucht.
Anwendungsbereiche für Suchverfahren:
– Suchen in Datenbanken, Web-Search, DNA-Tests
– Suchen nach ähnlichen Mustern: z.B. Viren, Malware
– Bilderkennungsverfahren: Suchen nach Mustern
– Suchen in Textdateien, ...
Inhalt der VO: einfache Suchverfahren auf Feldern und später
auf Bäumen
Suchen in linearen Feldern
[email protected]
3
In dieser Vorlesung
1. Statische, kleine Menge: Feld als Datenstruktur
• Ohne Vorsortierung, z.B. A=[34, 4, 99, 13, 42]
– Sequentielle Suche
– Selbstanordnende Felder
• Mit Vorsortierung, z.B. A=[4, 13, 34, 42, 99]
–
–
–
–
Binärsuche
Interpolationssuche
Quadratische Binärsuche
Fastsearch
Suchen in linearen Feldern
[email protected]
4
In den nächsten VOs
2. Dynamisch, große Menge , effiziente Zugriffe notwendig
• z.B. große Produktdatenbanken, Suchmaschinen, …
• Lösung: Baum als dynamische Datenstruktur (einfügen,
löschen), organisiert als binärer Suchbaum. Suchen in O(h),
wobei h die Baumhöhe ist.
• Effizientes Suchen: Binärer Suchbaum, der eine möglichst
geringe Höhe h garantiert. Sollte möglichst balanziert sein,
z.B. 2-4 Baum, Rot-Schwarz Baum usw.
Suchen in linearen Feldern
[email protected]
5
4. Suchen in linearen Feldern
1. Ohne Vorsortierung
– Sequentielle Suche
– Selbstanordnende Felder
Wir wollen in einer Datenmenge (lineares Feld A[1..n]) nur
Suchen (statischer Fall, kein Sortieren, Einfügen bzw.
Entfernen)
Input: Feld A[1..n], Wert x.
Output: Index t für das gesuchte Element x.
Falls x ∉ A, wird als Ergebnis -1 ausgegeben
Suchen in linearen Feldern
[email protected]
6
Sequentielle Suche
• Durchsuche das Feld von Anfang bis Ende
SEARCH(A, x)
1: i ← 0
3: WHILE i<n
4:
i ← i+1
6:
IF A[i]=x THEN
7:
RETURN i
10: RETURN -1
T(n) = Θ(n) im schlechtesten Fall, bzw. im mittleren Fall,
wenn jedes Element gleich oft gesucht wird
Suchen in linearen Feldern
[email protected]
7
Sequentielle Suche
• Verbesserung der erwarteten Laufzeit:
– Speichere die Elemente A[i] nach ihrer
Zugriffswahrscheinlichkeit pi: p1 ≥ p2 ≥ p3 …
1
 T (n)  (n) (avg. case)
• Gleichverteilung: pi 
n 1
• Exponentielle Verteilung: pi 
1
 T (n)  O(1) (avg. case)
i
2
– Zugriffswahrscheinlichkeiten pi müssen bekannt sein
Suchen in linearen Feldern
[email protected]
8
Selbstanordnende Felder
• Wenn pi unbekannt: verschiebe Elemente, die häufiger gesucht
werden, nach vorne.
• Bsp. 3 Heuristiken:
Wird auf A[i] zugegriffen,
– vertausche A[i] mit A[1]:
– vertausche A[i] mit A[i-1]:
– Zählen der Zugriffe u. dementsprechend das Feld sortieren
Im Mittel sind diese Methoden zumindest halb so gut wie die Anordnung nach
fallender Zugriffswahrscheinlichkeit bei bekannten pi. Achtung: Ist pi
gleichverteilt, dann sind die Heuristiken ineffizienter als die sequentielle Suche.
9
4. Suchen in linearen Feldern
2. Mit Vorsortierung
– Binärsuche
– Interpolationssuche
– Quadratische Binärsuche
– Fastsearch
Input: Feld A[1..n] mit A[1] ≤ A[2] ≤ … ≤ A[n], Wert x
Output: Index t für das gesuchte Element x (A[1] ≤ x ≤ A[n])
Falls x ∉ A, wird als Ergebnis -1 ausgegeben
Suchen in linearen Feldern
[email protected]
10
Binärsuche
(Binary Bisection Search)
Teile das Feld in zwei gleich große Hälften und vergleiche mit dem mittleren
Element; falls ident → gefunden, sonst suche entweder in der linken (kleiner)
oder rechten Hälfte (größer) weiter
BINSEARCH(von, bis, x)
rekursive Version
1: IF von ≤bis THEN
Aufruf: BINSEARCH(1,n,x)
2:
t ← [ (von+bis)/2 ]
3:
IF x=A[t] THEN
4:
RETURN t
5:
ELSE
6:
IF x<A[t] THEN
7:
RETURN BINSEARCH(von,t-1,x)
8:
ELSE
9:
RETURN BINSEARCH(t+1,bis,x)
10: ELSE RETURN -1
T(n) = T(n/2) + O(1) ⇒ T(n) = O(log n)
Suchen in linearen Feldern
[email protected]
11
Binärsuche
(Binary Bisection Search)
Teile das Feld in zwei gleich große Hälften und vergleiche mit dem mittleren
Element; falls ident → gefunden, sonst suche entweder in der linken (kleiner)
oder rechten Hälfte (größer) weiter
BINSEARCH_ITERATIVE(A, x)
1: pos ← -1; von ← 1; bis ← n
2: REPEAT
3:
t ← [ (von+bis)/2 ]
4:
IF x=A[t] THEN pos ← t
5:
ELSE
6:
IF x<A[t] THEN bis ← t-1
7:
ELSE von ← t+1
8: UNTIL (pos ≠ -1) OR (von>bis)
9: RETURN pos
Suchen in linearen Feldern
iterative Version
[email protected]
12
Interpolationssuche
Suche nicht in der Mitte, sondern dort, wo das Element „sein sollte“, unter
der Annahme, dass die Werte linear steigen
A[bis]
x
A[von]
von
Suchen in linearen Feldern
t
[email protected]
bis
13
Interpolationssuche
Suche nicht in der Mitte, sondern dort, wo das Element „sein sollte“, unter
der Annahme, dass die Werte linear steigen
INTSEARCH(von, bis, x)
1: IF A[von] < A[bis] THEN
2:
t ← von +
3:
IF x=A[t] THEN Return t
4:
ELSE
5:
IF x<A[t] THEN
6:
RETURN INTSEARCH(von, t-1,x)
7:
ELSE
8:
RETURN INTSEARCH(t+1,bis,x)
9: ELSE
10: IF x=A[von] THEN RETURN von
11: ELSE RETURN -1
Suchen in linearen Feldern
[email protected]
rekursive Version
Aufruf:
INTSEARCH(1,n,x)
Erwartete Laufzeit:
T(n) = O(log log n)
Worst-case:
T(n) = Θ(n)
14
Quadratische Binärsuche
Idee: Verhindere den worst-case der Interpolationssuche durch Anwendung
der Interpolationssuche auf n Teilfelder der Länge n
• Berechne Index t durch Interpolationssuche:
• Suche von t aus das korrekte Teilfeld (in Sprüngen von
dort aus weiter:
n ) und suche von
Identifizieren des korrekten Teilfeldes in O(1) erwarteter Zeit
Suchen in linearen Feldern
[email protected]
15
Quadratische Binärsuche
rekursive Version
Aufruf:
QUADSUCH(1,n,x)
Erwartete Laufzeit:
(Teilfeld in O(1) Zeit)
T(n) = O(log log n)
Worst-case:
(alle Teilfelder probiert)
T(n) = O( n )
Suchen in linearen Feldern
[email protected]
16
FastSearch
Kombination von Binärsuche und Interpolationssuche mit O(log log n) im
mittleren Fall und O(log n) im schlechtesten Fall (zumindest immer so gut wie
das bessere der beiden Verfahren)
A
von
mB
Binärsuche
Suchen in linearen Feldern
B
C
mI
bis
Interpolationssuche
[email protected]
17
FastSearch
Kombination von Binärsuche und Interpolationssuche mit O(log log n) im
mittleren Fall und O(log n) im schlechtesten Fall (zumindest immer so gut wie
das bessere der beiden Verfahren)
Suchen in linearen Feldern
[email protected]
18
Laufzeitverhalten der Suchverfahren
Mittlerer Fall
Schlechtester Fall
O(log n)
O(log n)
Interpolationssuche
O(log log n)
O(n)
Quadratische Binärsuche
O(log log n)
O( n )
„FastSearch“
O(log log n)
O(log n)
Binärsuche
Speicherbedarf:
• Rekursive Algorithmen: proportional zur Laufzeit (Rekursionstiefe)
• Iterative Algorithmen: O(1)
Suchen in linearen Feldern
[email protected]
19
Laufzeitverhalten der Suchverfahren
Beispiel: Anzahl der Vergleiche für 109 Elemente
Mittlerer Fall
Schlechtester Fall
Binärsuche
30
30
Interpolationssuche
5
1.000.000.000
Quadratische Binärsuche
5
32.000
„FastSearch“
10
60
Suchen in linearen Feldern
[email protected]
20
Herunterladen