5 5 Ausgewählte Algorithmen 5.1 Motivation 5.2 Suchen in sortierten Folgen 5.3 Sortieren 79 5 Ausgewählte Algorithmen Teil V Ausgewählte Algorithmen Überblick Motivation Suchen in sortierten Folgen Sortieren Saake/Schallehn Algorithmen & Datenstrukturen 5–1 Motivation ◮ ◮ ◮ Kennenlernen von Beispielalgorithmen, auch als Grundlage für praktische Übungen Vorbereitung der theoretischen Betrachtungen, etwa Komplexität von Algorithmen informelle Diskussion von Design-Prinzipien Saake/Schallehn 80 Algorithmen & Datenstrukturen 5–2 Uni Magdeburg, WS 2005/06 5 Ausgewählte Algorithmen ◮ Suchen als eine der häufigsten Aufgaben in der Informatik ◮ Vielzahl von Lösungen für unterschiedlichste Aufgaben ◮ ◮ hier: Suchen in sortierten Folgen Annahmen ◮ ◮ ◮ ◮ 5 Suchen in sortierten Folgen Folge F als Feld von numerischen Werten Zugriff auf i-tes Element über F [i] nur Berücksichtigung des Suchschlüssels Beispiel: Telefonbuch, Suche nach Namen Saake/Schallehn Algorithmen & Datenstrukturen 5–3 Sequenzielle Suche: Algorithmus algorithm SeqSearch (F , k ) → p Eingabe: Folge F der Länge n, Schlüssel k for i := 1 to n do if F [i] = k then return i fi od; return NO_KEY Saake/Schallehn Algorithmen & Datenstrukturen 5–4 Sequenzielle Suche: Aufwand bester Fall schlechtester Fall Durchschnitt (erfolgreiche Suche) Durchschnitt (erfolglose Suche) Saake/Schallehn Anzahl der Vergleiche 1 n (n + 1)/2 n Algorithmen & Datenstrukturen Uni Magdeburg, WS 2005/06 5–5 81 5 Ausgewählte Algorithmen Binäre Suche ◮ Prinzip: 1. Wähle den mittleren Eintrag und prüfe ob gesuchter Wert in der ersten oder in der zweiten Hälfte der Liste ist. 2. Fahre rekursiv mit der Hälfte vor, in der sich der Eintrag befindet. Saake/Schallehn Algorithmen & Datenstrukturen 5–6 Binäre Suche: Beispiel 1 2 3 4 0 1 2 4 5 6 7 8 5 8 9 12 13 18 m u 0 1 2 4 0 1 2 4 5 10 o 8 9 12 13 18 m u Saake/Schallehn 9 5 8 9 u m o o 12 13 18 Algorithmen & Datenstrukturen 5–7 Binäre Suche: Algorithmus algorithm BinarySearch (F , k ) → p Eingabe: Folge F der Länge n, Schlüssel k u := 1, o := n; while u <= o do m := (u + o)/2; if F [m] = k then return m else if k < F [m] then o := m − 1 else u := m + 1 fi; fi; od; return NO_KEY Saake/Schallehn 82 Algorithmen & Datenstrukturen 5–8 Uni Magdeburg, WS 2005/06 5 Ausgewählte Algorithmen 5 Binäre Suche: rekursiver Algorithmus algorithm BinarySearch (F , k ) → p Eingabe: Folge F der Länge n, Schlüssel k return BinarySearchRec (F , k , 1, n); algorithm BinarySearchRec (F , k , u, o) → p Eingabe: Folge F , Schlüssel k , unter und obere Schranken u und o ??? Saake/Schallehn Algorithmen & Datenstrukturen 5–9 Binäre Suche: Aufwandsanalyse ◮ nach dem ersten Teilen der Folge: noch n/2 Elemente ◮ nach dem zweiten Schritt: n/4 Elemente ◮ nach dem dritten Schritt: n/8 Elemente ◮ ... ◮ allgemein: im i-ten Schritt max. n/2i Elemente Saake/Schallehn log2 n Algorithmen & Datenstrukturen 5–10 Binäre Suche: Aufwand bester Fall schlechtester Fall Durchschnitt (erfolgreiche Suche) Durchschnitt (erfolglose Suche) Saake/Schallehn Anzahl der Schritte 1 ≈ log2 n ≈ log2 n ≈ log2 n Algorithmen & Datenstrukturen Uni Magdeburg, WS 2005/06 5–11 83 5 Ausgewählte Algorithmen Vergleich der Suchverfahren Verfahren sequenziell (n/2) binär (log2 n) Saake/Schallehn 10 ≈5 ≈ 3.3 102 ≈ 50 ≈ 6.6 103 ≈ 500 ≈ 9.9 104 ≈ 5000 ≈ 13.3 Algorithmen & Datenstrukturen 5–12 Sortieren ◮ ◮ Grundlegendes Problem in der Informatik Aufgabe: ◮ ◮ ◮ Ordnen von Dateien mit Datensätzen, die Schlüssel enthalten Umordnen der Datensätze, so dass klar definierte Ordnung der Schlüssel (numerisch/alphabetisch) besteht Vereinfachung: nur Betrachtung der Schlüssel, z.B. Feld von int-Werten Saake/Schallehn Algorithmen & Datenstrukturen 5–13 Sortieren: Grundbegriffe ◮ Verfahren ◮ ◮ intern: in Hauptspeicherstrukturen (Felder, Listen) extern: Datensätze auf externen Medien (Festplatte, Magnetband) Saake/Schallehn 84 Algorithmen & Datenstrukturen 5–14 Uni Magdeburg, WS 2005/06 5 Ausgewählte Algorithmen 5 Stabilität Ein Sortierverfahren heißt stabil, wenn es die relative Reihenfolge gleicher Schlüssel in der Datei beibehält. ◮ Beispiel: alphabetisch geordnete Liste von Personen soll nach Alter sortiert werden → Personen mit gleichem Alter weiterhin alphabetisch geordnet Name Endig, Martin Geist, Ingolf Höpfner, Hagen Schallehn, Eike Saake/Schallehn Alter 30 28 24 28 Sortieren Name Höpfner, Hagen Geist, Ingolf Schallehn, Eike Endig, Martin Alter 24 28 28 30 Algorithmen & Datenstrukturen 5–15 Sortieren durch Einfügen: Prinzip ◮ Idee ◮ Umsetzung der typischen menschlichen Vorgehensweise, etwa beim Sortieren eines Stapels von Karten: 1. Starte mit der ersten Karte einen neuen Stapel 2. Nimm jeweils nächste Karte des Originalstapels: füge diese an der richtigen Stelle in den neuen Stapel ein Saake/Schallehn Algorithmen & Datenstrukturen 5–16 Sortieren durch Einfügen: Algorithmus algorithm InsertionSort (F ) Eingabe: zu sortierende Folge F der Länge n for i := 2 to n do m := F [i]; /* zu merkendes Element */ j := i; while j > 1 do if F [j − 1] ≥ m then /* Verschiebe F [j − 1] nach rechts */ F [j] := F [j − 1]; j := j − 1 else Verlasse innere Schleife fi; F [j] := m /* Einfügeposition */ od od Saake/Schallehn Algorithmen & Datenstrukturen Uni Magdeburg, WS 2005/06 5–17 85 5 Ausgewählte Algorithmen Sortieren durch Einfügen: Beispiel Saake/Schallehn 1.Durchlauf 5 5 1 1 8 8 3 3 9 9 2 2 2.Durchlauf 1 1 1 5 5 5 8 8 8 3 3 3 9 9 9 2 2 2 3.Durchlauf 1 1 1 5 5 5 8 8 8 3 3 3 9 9 9 2 2 2 4.Durchlauf 1 1 1 3 3 3 5 5 8 8 9 9 2 2 2 5.Durchlauf 1 1 3 3 5 5 8 8 9 9 2 2 6.Durchlauf 1 1 1 2 2 2 3 3 3 5 5 5 8 8 8 9 9 9 Algorithmen & Datenstrukturen 5–18 Analyse: InsertionSort ◮ Aufwand: ◮ ◮ ◮ ◮ Anzahl der Vertauschungen Anzahl der Vergleiche Vergleiche dominieren Vertauschungen, d.h. es werden (wesentlich) mehr Vergleiche als Vertauschungen benötigt Ausserdem Unterscheidung: ◮ ◮ ◮ Bester Fall: Liste ist schon sortiert Mittlerer (zu erwartender) Fall: Liste ist unsortiert Schlechtester Fall: z.B. Liste ist absteigend sortiert Saake/Schallehn Algorithmen & Datenstrukturen 5–19 Analyse: InsertionSort /2 ◮ ◮ ◮ wir müssen in jedem Fall alle Elemente i = 2 bis n durchgehen, d.h. immer Faktor n − 1 dann müssen wir zur korrekten Einfügeposition zurückgehen Bester Fall: Liste sortiert → Einfügeposition ist gleich nach einem Schritt an Position i −1 ◮ ◮ ◮ ◮ bei jedem Rückweg Faktor 1 Gesamtanzahl der Vergleiche: (n − 1) ∗ 1 = n − 1 für Große Listen abgeschätzt als n − 1 ≈ n ”linearer Aufwand” Saake/Schallehn 86 Algorithmen & Datenstrukturen 5–20 Uni Magdeburg, WS 2005/06 5 Ausgewählte Algorithmen ◮ 5 Analyse: InsertionSort /3 Mittlerer (zu erwartender) Fall: Liste unsortiert → Einfügeposition wahrscheinlich auf der Hälfte des Rückwegs ◮ ◮ bei jedem der n − 1 Rückwege Faktor (i − 1)/2 Gesamtanzahl der Vergleiche: (n − 1)/2 + (n − 2)/2 + (n − 3)/2 + · · · + 2/2 + 1/2 (n − 1) + (n − 2) + · · · + 2 + 1 2 1 n ∗ (n − 1) = ∗ 2 2 n ∗ (n − 1) = 4 n2 ≈ 4 = Saake/Schallehn Algorithmen & Datenstrukturen 5–21 Analyse: InsertionSort /4 ◮ Schlechtester Fall: z.B. Liste umgekehrt sortiert → Einfügeposition am Ende des Rückwegs bei Position 1 ◮ ◮ ◮ ◮ bei jedem der n − 1 Rückwege Faktor i − 1 analaog zu vorhergehenden Überlegungen, bloss doppelte Rückweglänge Gesamtanzahl der Vergleiche: 2 n∗(n−1) ≈ n2 2 letzten beiden Fälle: ”quadratischer Aufwand”, wenn konstante Faktoren nicht berücksichtigt werden Saake/Schallehn Algorithmen & Datenstrukturen 5–22 Sortieren durch Selektion ◮ Idee: Suche jeweils größten Wert, und tausche diesen an die letzte Stelle; fahre dann mit der um 1 kleineren Liste fort. algorithm SelectionSort (F ) Eingabe: zu sortierende Folge F der Länge n p := n; while p > 0 do g := Index des größten Elementes aus F im Bereich 1...p; Vertausche Werte von F [p] und F [g]; p := p − 1 od Saake/Schallehn Algorithmen & Datenstrukturen Uni Magdeburg, WS 2005/06 5–23 87 5 Ausgewählte Algorithmen Sortieren durch Selektion: Beispiel Saake/Schallehn 1.Durchlauf 5 1 8 3 9 2 2.Durchlauf 5 1 8 3 2 9 3.Durchlauf 5 1 2 3 8 9 4.Durchlauf 3 1 2 5 8 9 5.Durchlauf 2 1 3 5 8 9 6.Durchlauf 1 2 3 5 8 9 Algorithmen & Datenstrukturen 5–24 Analyse: SelectionSort ◮ ◮ ◮ in jedem Durchlauf das Element von F [p] mit dem größten Element tauschen Variable p läuft von n . . . 1 daher n Vertauschungen in jedem Durchlauf das größte Element aus 1 . . . p ermitteln p − 1 Vergleiche (n − 1) + (n − 2) + (n − 3) + · · · + 2 + 1 = ◮ n(n − 1) n2 ≈ 2 2 Anzahl Vergleiche identisch für besten, mittleren und schlechtesten Fall! Saake/Schallehn Algorithmen & Datenstrukturen 5–25 BubbleSort ◮ Idee: Verschieden große aufsteigende Blasen („Bubbles“) in einer Flüssigkeit sortieren sich quasi von allein, da größere Blasen die kleineren „überholen“. algorithm BubbleSort (F ) Eingabe: zu sortierende Folge F der Länge n do for i := 1 to n − 1 do if F [i] > F [i + 1] then Vertausche Werte von F [i] und F [i + 1] fi od until keine Vertauschung mehr aufgetreten Saake/Schallehn 88 Algorithmen & Datenstrukturen 5–26 Uni Magdeburg, WS 2005/06 5 Ausgewählte Algorithmen 5 BubbleSort: Beispiel 5 1 8 3 9 2 1 5 8 3 9 2 1 5 3 8 9 2 1 5 3 8 2 9 1 3 5 8 2 9 3. 3.Durchlauf Durchlauf 1 3 5 2 8 9 4.Durchlauf 1 3 2 5 8 9 1 2 3 5 8 9 1.Durchlauf 2.Durchlauf 5.Durchlauf Saake/Schallehn Algorithmen & Datenstrukturen 5–27 BubbleSort: Optimierung ◮ ◮ größte Zahl rutscht in jedem Durchlauf automatisch an das Ende der Liste im Durchlauf j reicht die Untersuchtung bis Position n − j Saake/Schallehn Algorithmen & Datenstrukturen 5–28 Analyse: BubbleSort ◮ ◮ ◮ Bester Fall: n Durchschnittlicher Fall normal: n2 2 optimiert: n2 Schlechtester Fall normal: n2 2 optimiert: n2 Saake/Schallehn Algorithmen & Datenstrukturen Uni Magdeburg, WS 2005/06 5–29 89 5 Ausgewählte Algorithmen MergeSort: Prinzip ◮ Idee: 1. Teile die zu sortierende Liste in zwei Teillisten 2. Sortiere diese (rekursives Verfahren!) 3. Mische die Ergebnisse Saake/Schallehn Algorithmen & Datenstrukturen 5–30 Mischen von zwei Folgen: Algorithmus procedure Merge (F1 , F2 ) → F Eingabe: zwei zu sortierende Folgen F1 , F2 Ausgabe: eine sortierte Folge F F := leere Folge; while F1 oder F2 nicht leer do Entferne das kleinere der Anfangselemente aus F1 bzw. F2 ; Füge dieses Element an F an od; Füge die verbliebene nichtleere Folge F1 oder F2 an F an; return F Saake/Schallehn Algorithmen & Datenstrukturen 5–31 Sortieren durch Mischen: Algorithmus algorithm MergeSort (F ) → FS Eingabe: eine zu sortierende Folge F Ausgabe: eine sortierte Folge FS if F einelementig then return F else Teile F in F1 und F2 ; F1 := MergeSort (F1 ); F2 := MergeSort (F2 ); return Merge (F1 , F2 ) fi Saake/Schallehn 90 Algorithmen & Datenstrukturen 5–32 Uni Magdeburg, WS 2005/06 5 Ausgewählte Algorithmen Split Split 5 5 5 Merge Saake/Schallehn 1 1 5 8 1 9 3 2 8 3 9 8 3 9 1 9 1 5 3 9 1 5 8 2 3 1 2 3 5 MergeSort: Beispiel 2 2 3 8 5 9 9 Algorithmen & Datenstrukturen 5–33 Analyse: MergeSort ◮ Folge der Länge n: Anzahl der Vergleiche = Vn Vn = 2Vn/2 + n für n ≥ 2 mit V1 = 0 ◮ ◮ jede Teilfolge sortieren (n/2 Vergleiche), Mischen (n Vergleiche) Annahme: n = 2N (n ist Zweierpotenz) V2N V2N 2N Saake/Schallehn = 2V2N−1 + 2N V2N−1 = +1 2N−1 Algorithmen & Datenstrukturen 5–34 Analyse: MergeSort /2 ◮ sukzessive V2N−i ersetzen bis i = N 2N−i V2N =N 2N ◮ aus 2N folgt N = log n: Vn = n log n Saake/Schallehn Algorithmen & Datenstrukturen Uni Magdeburg, WS 2005/06 5–35 91 5 Ausgewählte Algorithmen QuickSort: Prinzip ◮ Idee: ◮ ◮ ähnlich wie MergeSort durch rekursive Aufteilung Vermeidung des Mischvorgangs durch Aufteilung der Teillisten in zwei Hälften bezüglich eines Pivot-Elementes, wobei ◮ ◮ in einer Liste alle Elemente größer als das Referenzelement sind in der anderen Liste alle Elemente kleiner sind Saake/Schallehn Algorithmen & Datenstrukturen 5–36 QuickSort: Algorithmus algorithm QuickSort (F , u, o) Eingabe: eine zu sortierende Folge F , die untere und obere Grenze u, o if o > u then Zerlege F [u . . . o] in zwei Partitionen F [u . . . r ] und F [l . . . o]; QuickSort (F , u, r ); QuickSort (F , l, o) fi Saake/Schallehn Algorithmen & Datenstrukturen 5–37 QuickSort: Vertauschen von Elementen ◮ Pivot-Element p ◮ ◮ ◮ Folge von links durchsuchen, bis Element gefunden, das größer oder gleich p ist Folge von rechts durchsuchen, bis Element gefunden, das kleiner p ist Elemente ggf. tauschen 2 Saake/Schallehn 92 7 4 6 3 9 Algorithmen & Datenstrukturen 8 5–38 Uni Magdeburg, WS 2005/06 5 Ausgewählte Algorithmen 5 QuickSort: Zerlegen beim QuickSort algorithm Zerlege (F , u, o) Eingabe: Folge F , untere/obere Grenze u, o Ausgabe: Positionen l und r der Zerlegung p := F [(u + o)/2]; l := u; r := o; while l ≤ r do l := Index des ersten Elementes aus l . . . o mit F [l] ≥ p; r := Index des letzten Elementes aus u . . . r mit F [r ] < p; if l ≤ r then Tausche F [l] und F [r ]; l := l + 1; r := r − 1 fi od Saake/Schallehn Algorithmen & Datenstrukturen 5–39 QuickSort: Beispiel Ebene0 Ebene1 Ebene2 8 2 1 5 9 7 3 3 2 1 5 9 7 8 3 2 1 9 7 8 1 2 3 7 9 8 9 8 8 9 1 3 Ebene3 Saake/Schallehn 8 Algorithmen & Datenstrukturen 5–40 Analyse: QuickSort ◮ Aufwand analog zu MergeSort abschätzbar ◮ ◮ ◮ ◮ Bester Fall: n log n Durchschnittlicher Fall: n log n Schlechtester Fall: n log n aber: im Gegensatz zur MergeSort ist QuickSort durch Vorgehensweise bei Vertauschungen instabil Saake/Schallehn Algorithmen & Datenstrukturen Uni Magdeburg, WS 2005/06 5–41 93 5 Ausgewählte Algorithmen Sortierverfahren im Vergleich Verfahren SelectionSort InsertionSort BubbleSort MergeSort QuickSort Saake/Schallehn Stabilität Vergleiche (im Mittel) instabil stabil stabil stabil instabil ≈ n2 /2 ≈ n2 /4 ≈ n2 /2 ≈ n log n ≈ n log n Algorithmen & Datenstrukturen 5–42 Zusammenfassung ◮ Suchen und Sortieren als Grundaufgaben in der Informatik ◮ Grundalgorithmen ◮ Algorithmenmuster „Teile und herrsche“ ◮ Abschätzung des Aufwands ◮ Literatur: Saake/Sattler: Algorithmen und Datenstrukturen, Kapitel 5 Saake/Schallehn 94 Algorithmen & Datenstrukturen 5–43 Uni Magdeburg, WS 2005/06