Datenstrukturen und Algorithmen 7. Suchen in linearen Feldern VO 708.031 Suchen in linearen Feldern robert.legenstein@igi.tugraz.at 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 robert.legenstein@igi.tugraz.at 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 robert.legenstein@igi.tugraz.at 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 robert.legenstein@igi.tugraz.at 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 robert.legenstein@igi.tugraz.at 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 robert.legenstein@igi.tugraz.at 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 robert.legenstein@igi.tugraz.at 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 robert.legenstein@igi.tugraz.at 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 robert.legenstein@igi.tugraz.at 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 robert.legenstein@igi.tugraz.at 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 robert.legenstein@igi.tugraz.at 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 robert.legenstein@igi.tugraz.at 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 robert.legenstein@igi.tugraz.at 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 robert.legenstein@igi.tugraz.at 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 robert.legenstein@igi.tugraz.at 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 robert.legenstein@igi.tugraz.at 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 robert.legenstein@igi.tugraz.at 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 robert.legenstein@igi.tugraz.at 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 robert.legenstein@igi.tugraz.at 20