Sortieren und Suchen IFB 2002 Daniel Jonietz Sortieren
Sortieren und Suchen IFB 2002 Daniel Jonietz
Sortieren und Suchen Überblick 4 Teil 1: Elementare Sortieralgorithmen 4 Teil 2: Quicksort 4 Teil 2: Effizienz von Sortierverfahren 4 Teil 3: Suchalgorithmen Jonietz
Sortieren und Suchen Teil 1 Elementare Sortieralgorithmen Jonietz
Sortieren und Suchen Motivation 4 Eine Reihe von Werten liegt unsortiert vor. Ziel: Die Werte sollen (aufsteigend) sortiert werden. Jonietz
Sortieren und Suchen Datenmodell 4 Die Werte liegen in einer Reihung vor: t. Index 0 1 2 user_max prog_max . . . t. Wert t. Zahlen Jonietz
Sortieren und Suchen Daten und Typen 4 const prog_max = 1000; Insgesamt höchstens 1000 Werte 4 type t. Wert = integer; t. Index = integer; t. Zahlen = array [0. . prog_max] of t. Wert; 4 var zahlen: t. Zahlen; user_max: t. Wert = 14; Jonietz Verwenden davon nur 15
Sortieren und Suchen Sortieren durch Auswahl 4 Idee: Suche das kleinste Element und lege es beiseite. Dann wähle aus den übrigen wiederum das kleinste Element und lege es daneben. 4 Sortieren von Münzen Jonietz
Sortieren und Suchen Auswahl-Sortieren V 1 1 Jonietz 1 2 3 4 5 1 2 3 4 5 7 5 7 2 8 3 4 5 7 8 7 8 8 8 1 4 4
Sortieren und Suchen Auswahl-Sortieren V 2 Jonietz 5 7 2 8 3 1 4 1 7 2 8 3 5 4 1 2 7 8 3 5 4 1 2 3 8 7 5 4 1 2 3 4 7 5 8 1 2 3 4 5 7 8 „in situ“
Sortieren und Suchen Algorithmus 4 Brauchen Möglichkeit zur Bestimmung des Minimums aus einem Bereich der Zahlen Jonietz
Sortieren und Suchen Minimum und Maximum 4 Aufruf findet statt in procedure TForm 1. suche_minimum(Sender: TObject); procedure TForm 1. suche_maximum(Sender: TObject); Jonietz
Sortieren und Suchen Aufgabe 4 Implementieren Sie die Funktionen function min(anfang, ende: t. Index): t. Index; function max(anfang, ende: t. Index): t. Index; die den Index eines minimalen bzw. maximalen Elementes aus dem Bereich anfang. . . ende liefert. 4 Implementieren Sie damit die Prozedur procedure minsort; Wer möchte, auch procedure maxsort; Idee? Jonietz
Sortieren und Suchen Lösungsvorschlag function min(anfang, ende: t. Index): t. Index; var i, min_pos: t. Index; min_wert: t. Wert; begin Kandidat min_pos: = anfang; min_wert: = zahlen[min_pos]; for i: = anfang+1 to ende do if (zahlen[i] < min_wert) then begin min_pos: = i; besserer Kandidat min_wert: = zahlen[min_pos]; end; min: = min_pos; end; Jonietz
Sortieren und Suchen Lösungsvorschlag function max(anfang, ende: t. Index): t. Index; var i, max_pos: t. Index; max_wert: t. Wert; begin Kandidat max_pos: = anfang; max_wert: = zahlen[max_pos]; for i: = anfang+1 to ende do if (zahlen[i] > max_wert) then begin max_pos: = i; besserer Kandidat max_wert: = zahlen[max_pos]; end; max: = max_pos; end; Jonietz
Sortieren und Suchen Lösungsvorschlag procedure minsort; var i, merke: t. Index; begin for i: = 0 to user_max-1 do begin merke: = min(i, user_max); tausche(zahlen[merke], zahlen[i]); end; Jonietz
Sortieren und Suchen Lösungsvorschlag procedure maxsort; var i, merke: t. Index; begin for i: = user_max downto 1 do begin merke: = max(0, i); tausche(zahlen[merke], zahlen[i]); end; 4 Idee: Suche immer das Maximum und sammle von rechts Jonietz
Sortieren und Suchen Sortieren durch Einfügen 4 Idee: Nimm das nächste Element und füge es sortiert ein. 4 Sortieren eines Kartenspiels Jonietz
Sortieren und Suchen Sortieren durch Einfügen 5 5 Jonietz 5 7 2 5 7 8 2 3 5 7 8 1 2 3 4 5 7 7 2 8 3 1 4 3 1 4 4 8
Sortieren und Suchen Sortieren durch Einfügen Jonietz 5 7 2 8 3 1 4 2 5 7 8 3 1 4 2 3 5 7 8 1 4 1 2 3 5 7 8 4 1 2 3 4 5 7 8 „in situ“
Sortieren und Suchen Sortieren durch Einfügen 4 Verschiebeoperationen sind auf Reihungen schwierig zu realisieren 4 Günstig auf anderen Datenstrukturen ( Listen) Jonietz
Sortieren und Suchen Bubblesort 4 Idee: Vergleiche paarweise und schiebe große Elemente nach hinten 4 Sortieren wie Blasen in einem Wasserglas aufsteigen: Große Blasen steigen schnell auf Jonietz
Sortieren und Suchen Bubblesort - Beispiel Jonietz 5 7 2 8 3 1 4 5 2 7 3 1 4 8 2 5 3 1 4 7 8 2 3 1 4 5 7 8 2 1 3 4 5 7 8 1 2 3 4 5 7 8
Sortieren und Suchen Algorithmus 4 Ende des Sortiervorgangs: – Wenn keine Vertauschung mehr stattfand – spätestens nach „Anzahl“ Schleifendurchläufen Jonietz
Sortieren und Suchen Aufgaben 4 Implementieren Sie die procedure bubblesort; 4 Der vorgestellte Bubblesort-Algorithmus kann noch verbessert werden: Die innere Schleife muss nicht immer bis zum Ende durchlaufen werden. Durchdenken Sie dies und verbessern Sie Ihre Implementierung. Jonietz
Sortieren und Suchen Lösungsvorschlag procedure bubblesort; var i: t. Index; getauscht: boolean; begin repeat getauscht: = FALSE; for i: = 0 to user_max-1 do if (zahlen[i] > zahlen[i+1]) then begin tausche(zahlen[i], zahlen[i+1]); getauscht: = TRUE; end; until not getauscht; end; Jonietz
Sortieren und Suchen Teil 2 Quicksort Jonietz
Sortieren und Suchen Quicksort 4 Prinzip: Teile und Herrsche 4 Wähle ein Pivot-Element, das Problem in zwei Teilprobleme zerlegt. 4 Ein Bereich enthält dann alle Elemente, die kleiner sind als das Pivot-Element, der andere Bereich alle Elemente, die größer sind. 4 Löse die Teilprobleme auf die gleiche Art und Weise. Jonietz
Sortieren und Suchen Quicksort - Beispiel Jonietz 5 1 8 4 3 7 2 2 1 3 4 8 7 5 1 2 3 4 5 7 8
Sortieren und Suchen Quicksort - Pivot-Element 4 Die Wahl des Pivot-Elementes beeinflusst wesentlich die Anzahl benötigter Durchgänge 4 schlecht: – p=min() und p=max() 4 gut: – p=Zahlen[(links + rechts) div 2] – Feld mittleren Wertes 4 optimal: ein Element das den zu sortierenden Bereich in zwei gleich große Teile partitioniert Jonietz
Sortieren und Suchen Quicksort - Zerlegen 5 3 Jonietz 2 7 4 8 1 3 5
Sortieren und Suchen Quicksort - Zerlegen Jonietz 5 2 7 3 2 1 4 8 1 3 7 5
Sortieren und Suchen Quicksort - Zerlegen Jonietz 5 2 7 4 8 1 3 3 2 1 4 8 7 5
Sortieren und Suchen Zerlege - Algorithmus Jonietz
Sortieren und Suchen Quicksort - Algorithmus Jonietz
Sortieren und Suchen Aufgaben 4 Schreiben Sie die Funktion function pivot (links, rechts: t. Index): t. Index; 4 Implementieren Sie procedure zerlege (var links, rechts: t. Index); 4 und damit dann insgesamt Quicksort procedure quicksort(anfang, ende: t. Index); Jonietz
Sortieren und Suchen Lösungsvorschlag function pivot (links, rechts: t. Index): t. Index; begin pivot: = zahlen[(links + rechts) DIV 2] end; Jonietz
Sortieren und Suchen Lösungsvorschlag procedure zerlege (var links, rechts: t. Index); var p : t. Wert; begin p : = pivot(links, rechts); repeat while zahlen[links] < p do links: = links +1; while zahlen[rechts] > p do rechts: = rechts -1; . . . Jonietz
Sortieren und Suchen Lösungsvorschlag. . . if (links <= rechts) then begin if (links < rechts) then tausche (zahlen[links], zahlen[rechts]); links : = links +1; rechts : = rechts -1; end; until (links > rechts); end; Jonietz
Sortieren und Suchen Lösungsvorschlag procedure quicksort(anfang, ende: t. Index); var links, rechts: t. Index; begin links: = anfang; rechts: = ende; zerlege (links, rechts); if (anfang < rechts) then quicksort(anfang, rechts); if (links < ende) then quicksort(links, ende); end; Jonietz
Sortieren und Suchen Weitere Sortierverfahren 4 Heapsort 4 Shellsort 4 Bucketsort 4 Platzziffersortieren 4 Mergesort Jonietz
Sortieren und Suchen Teil 3 Effizienz von Sortierverfahren Jonietz
Sortieren und Suchen Kriterien 4 Stabilität – Bleiben evtl. vorhandene Vorsortierungen erhalten? 4 Geschwindigkeit – Anzahl Vergleiche – Anzahl Tauschoperationen 4 Einfluss von Parametern auf den Sortiervorgang – Quicksort: Bestimmung des Pivot-Elementes Jonietz
Sortieren und Suchen Stabilität 4 Was passiert mit nach anderen Kriterien bereits sortierten Daten? Angenommen, Blau < Rot Jonietz 1 4 3 4 1 4 2 1 1 2 3 4 4 4 Auswahl (von links) 1 1 2 3 4 4 4 Auswahl (von rechts)
Sortieren und Suchen Stabilität 4 Beispiel: Adressdaten (Telefonbuch o. ä. ) 4 Daten: – Name – Ort –. . . 4 Sind bereits sortiert nach Ort, sollen jetzt nach Name sortiert werden 4 Die Vorsortierung soll erhalten bleiben! Jonietz
Sortieren und Suchen Komplexität 4 Unterscheiden 3 Fälle: – Best Case – (Average Case) – Worst Case 4 Aufwandsbestimmung – Messung – Zählung und arithmetische Rechnung – asymptotische Abschätzung Jonietz
Sortieren und Suchen Experimente 4 Verwenden Zähler zur Abschätzung des Aufwandes Jonietz
Sortieren und Suchen Experimente - Daten 4 2 neue Zähler: var tausch_z: integer = 0; // Anzahl Tauschoperationen vergleich_z: integer = 0; // Anzahl Vergleichsoperationen Jonietz
Sortieren und Suchen Exkurs - Ereignissteuerung 4 Die Initialisierung der Zähler geschieht beim Aufruf der Sortierprozedur aus der Ereignissteuerung heraus: procedure TForm 1. austausch_sortieren(Sender: TObject); begin tausch_z: = 0; vergleich_z: = 0; Zähler initialisieren minsort; zeige_zaehler; Verfahren starten zeige_zahlen; Aktuelle Werte anzeigen end; Jonietz
Sortieren und Suchen Aufgaben 4 Erweitern Sie die Algorithmen so, dass die entsprechenden Zähler erhöht werden. – – – tausche min bzw. max minsort bzw. maxsort bubblesort zerlege quicksort 4 Untersuchen Sie experimentell den Aufwand bei der Sortierung einiger Zahlenreihen. Wie verhalten sich die verschiedenen Verfahren bei bereits sortierten und umgekehrt sortierten Daten? Jonietz
Sortieren und Suchen Lösung (exemplarisch) procedure tausche(var x, y: t. Wert); var hilf: t. Wert; begin hilf: = x; x: = y; y: = hilf; tausch_z: = tausch_z +1; end; Jonietz
Sortieren und Suchen Groß-O-Notation 4 Wenn für die Laufzeit T(n) eines Algorithmus gilt: T(n) c*n für eine Konstante c>0 und alle Werte n>n 0, so sagt man „T(n) ist in O(n)“ 4 (Id. R reicht es den „stärksten“ Ausdruck zu wählen. ) Jonietz
Sortieren und Suchen Aufwand minsort 4 Aufwand für die Suche des Minimums: (n Elemente) – beim 1. Durchlauf: – beim 2. Durchlauf: – beim n. Duchlauf: – Gesamt: n-1 Vergleiche n-2 Vergleiche n-n Vergleiche n (n - i) =. 5 n²-. 5 n ~ n² in O(n²) i=1 4 Tauschoperationen: – in jedem Durchlauf genau eine, also gesamt n-1 Stück in O(n) Jonietz
Sortieren und Suchen Aufwand bubblesort Die ursprüngliche Fassung 4 Vergleichsoperationen (best case) – beim 1. Durchlauf: – Fertig! n-1 Vergleiche 4 Tauschoperationen (best case) – keine Jonietz
Sortieren und Suchen Aufwand bubblesort 4 Vergleichsoperationen (worst case) – – – beim 1. Durchlauf: beim 2. Durchlauf: . . . beim n. Duchlauf: Gesamt: n-1 Vergleiche n*(n-1) = n²-n in O(n²) 4 Tauschoperationen (worst case) – – beim 1. Durchlauf: beim 2. Durchlauf: . . . beim n. Durchlauf: – Gesamt: Jonietz n-1 Austausche n-2 Austausche n-n Austausche n (n - i) =. 5 n²-. 5 n in O(n²) i=1
Sortieren und Suchen Aufwand Quicksort 4 Bestimmung des Pivot-Elementes – hier so gestaltet, dass Aufwand zur Bestimmung vernachlässigbar – aber: Wahl des Elementes hat großen Einfluß auf den weiteren Aufwand! Ungünstigste Wahl führt zu O(n²)! 4 Vereinfachte Analyse unter folgenden Bedingungen: – Anzahl Elemente 2 er-Potenz: n=2 k – Zerlegung halbiert immer – Zerlegung: fortwährende Halbierung führt zu Zerlegungstiefe log 2 (n) – führt insgesamt auf: O(n*log 2(n)) Jonietz
Sortieren und Suchen Messergebnisse 4 Überblick und Ergebnisse der Zählungen 4 Min/Maxsort: 4 Bubblesort: 4 Quicksort: Jonietz O(n²) O(n*log 2(n))
Sortieren und Suchen Teil 4 Suchalgorithmen Jonietz
Sortieren und Suchen Suchalgorithmen 4 Zwei grundlegende Strategien: – lineares (sequenzielles) Suchen – binäres Suchen 4 Beispiel Telefonbuch – Suche nach Namen: binär (naja, in etwa) – Suche nach Nummer: linear 4 Beispiel Reihe von Zahlen – Suche nach Minimum und Maximum: linear Jonietz
Sortieren und Suchen Lineares Suchen - Bsp Suche nach Element 11 möglich unmöglich Testelement Treffer Jonietz 1 3 5 7 11 13 17 1 3 5 7 11 13 17
Sortieren und Suchen Lineares Suchen 4 Prüfe der Reihe nach alle Elemente ab, bis das gesuchte Element gefunden ist oder keine Elemente mehr da sind. 4 keine Voraussetzungen an die Daten, dürfen auch unsortiert sein. Jonietz
Sortieren und Suchen Lineares Suchen - Alg. Jonietz
Sortieren und Suchen Binäres Suchen 4 Voraussetzung: sortierte Daten 4 Idee: – Beginne mit der Suche in der Mitte der Daten; – wenn der Suchschlüssel kleiner ist suche in der Mitte des rechten Bereiches weiter, – wenn der Suchschlüssel größer ist in der Mitte des linken Bereiches. Jonietz
Sortieren und Suchen Binäres Suchen - Beispiel Suche nach Element 11 möglich unmöglich Testelement Treffer Jonietz 1 3 5 7 11 13 17
Sortieren und Suchen Binäres Suchen - Alg. Jonietz
Sortieren und Suchen Aufgabe 4 Vereinbarung: Wenn das Gesuchte nicht in den Daten enthalten ist soll -1 zurückgegeben werden! 4 Erweiterung der Datenstruktur: type t. Index. Fehler = integer; 4 Implementieren Sie function lineare_suche(wonach: t. Wert): t. Index. Fehler; function binaere_suche(wonach: t. Wert): t. Index. Fehler; Jonietz
Sortieren und Suchen Lösung function lineare_suche(wonach: t. Wert): t. Index. Fehler; var i: t. Index; position: t. Index. Fehler; begin position: = -1; i: = 0; repeat if zahlen[i] = wonach then position: = i; i: = i+1; until (position <> -1) OR (i-1 = user_max); lineare_suche: = position; end; Jonietz
Sortieren und Suchen Lösung function binaere_suche(wonach: t. Wert): t. Index. Fehler; var links, rechts, position : t. Index; begin links: = 0; rechts: = user_max; // hier eigentliche Suche. . . if (wonach = zahlen[position]) then binaere_suche: = position else binaere_suche: = -1; end; Jonietz
Sortieren und Suchen Lösung // das hier ist die eigentliche Suche: repeat position: = (links + rechts) div 2; if (wonach < zahlen[position]) then rechts: = position -1; else if (wonach > zahlen[position]) then links: = position +1; until (wonach = zahlen[position]) //Treffer! OR (links > rechts); //nicht gefunden Jonietz
Sortieren und Suchen Lineare vs. Binäre Suche 4 Verdoppelt sich die Anzahl Elemente, so führt dies schlimmstenfalls zu – einer Verdopplung des Aufwandes bei linearer Suche – einem zusätzlichen Vergleich bei binärer Suche 4 Einbau von Zählern verdeutlicht dies: var linear_z: integer = 0; binaer_z: integer = 0; Jonietz
Sortieren und Suchen Übung 4 Erweitern Sie die Suchfunktionen, indem Sie die Zähler für jeden benötigten Suchschritt (jeden benötigten Vergleich) erhöhen function binaere_suche(wonach: t. Wert): t. Index. Fehler; function lineare_suche(wonach: t. Wert): t. Index. Fehler; Jonietz
Sortieren und Suchen Such-Experimente Jonietz
Sortieren und Suchen Weitere Suchverfahren 4 Fibonacci-Suche 4 Sprungsuche Jonietz
- Slides: 72