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