Sortieralgorithmen Vorlesung Algorithmen und Datenstrukturen 2 im SS 2004 Prof. Dr. W. P. Kowalk Universität Oldenburg ● Literatur Die folgenden Bücher wurden für die Vorlesung verwendet. Darüber hinaus gibt es viele weitere Literatur zu diesen Themen, die u.a. in diesen Büchern zitiert wird: – Robert Sedgewick: Algorithmen. Pearson Studium 2002. – Mark Allen Weiss: Data Structures & Algorithm Analysis in Java. Addison Wesley Longman 1999. – Timothy Budd: Classic Data Structures in Java. Addison Wesley Longman 2001. – I.N. Bronstein, K.A. Semendjajew: Taschenbuch der Mathematik. Verlag Harri Deutsch. 1987. Übersicht AD 2 ● Übersicht über die Inhalte der Vorlesung AD 2 – Datenstrukturen ● ● – Sortieralgorithmen ● ● – Bewertung von Algorithmen (Komplexität vs. Laufzeitmessung) Algorithmen auf Datenstrukturen Direkte Sortierverfahren Höhere Sortierverfahren Suchalgorithmen ● ● Einfache Suchverfahren Suchstrukturen Übersicht AD 2 ● Übersicht über die Inhalte der Vorlesung AD 2-2 – Paralle Programmierung ● ● ● ● ● – Numerische Algorithmen: ● ● ● ● ● Threads in Java (Wiederholung aus Java-Kurs) Synchronisation von Proessen Semaphore Monitore Synchronisationsmechanismen in Java Nullstellen, Extremum von Funktionen Analytische Funktionen Splines Lineare Programmierung Weitere Themen Rückschau auf AD 1 ● Sprache der Informatik ● Wissenschaftstheorie und Informatik – Modelle und Systeme ● Automaten ● 3AA ● Informatik und Information/Informationstheorie ● Formale Sprachen / Syntax von Programmen ● Algorithmen Rückschau auf AD 1 ● Ausdrücke, Anweisungen, Programme ● Datentypen ● Abstrakten Datentypen – Stack – Queues – Deques – BigNumbers in Java ● Funktionen und Prozeduren ● Rekursion ● Laufzeitkomplexität Sortieren Grundbegriffe Klassifizierung Komplexität Direkte Sortieralgorithmen Höhere Sortieralgorithmen Spezielle Verfahren Sortieren – Einführung ● Zum Beschleunigen des Zugriffs auf größere Mengen von Datenobjekten – Daten in bestimmte Reihenfolge bringen ● ● ● ● alphabetisch (Telefonbuch, Lexikon) numerisch (Buchseiten, Hausnummern) lexikographisch (allgemeines Alphabet) Vorgang wird als Sortieren (sorting) bezeichnet – Beispiele ● ● ● Anordnung von Zeitschriften nach Erscheinungsdatum, Schülern nach Größe Studentennamen nach alphabetischer Ordnung Sortieren – Einführung ● ● ● Grundsätzliche Fragestellungen und Algorithmen zum Sortieren Man klassifiziert Sortieralgorithmen in – innere Sortieralgorithmen – äußere Sortieralgorithmen. inneren Sortieralgorithmen unterteilt in – direkte Sortieralgorithmen – höhere Sortieralgorithmen Sortieren – Einführung ● Direkte Sortieralgorithmen i.d.R. langsamer – ● ● Sehr viel einfacher zu implementieren In vielen höhere Sortieralgorithmen als Hilfsalgorithmen verwendet – ● Aufwand meist O(N2), kurze Folgen in der Regel mit höheren Sortieralgorithmen nur sehr viel langsamer zu sortieren Direkte Sortieralgorithmen daher sehr wichtig. Sortieren – Einführung ● Laufzeitkomplexität höherer Sortieralgorithmen meist von Ordnung O(N*log N) – ● konstanter Faktor spielt wichtige Rolle Lineare Laufzeitkomplexität möglich – eigenen Rechnerarchitektur (parallele Prozessoren) – zusätzlicher Speicheraufwand – Dieses werden wir ebenfalls untersuchen. Sortieren – Grundlagen ● ● Daten häufig bei der Sammlung/Erstellung bereits sortiert Dennoch interessante Sortieralgorithmen Sortieren – Grundbegriffe ● ● Eine Folge von N Zahlen lässt sich in einem Feld abspeichern: – integer array Feld [1..N]; – Unsortiertes Feld – Sortiertes Feld Permutieren Vertauschen zweier Elemente des Feldes Sortieren – Grundbegriffe ● ● Permutation: Ein anderes Feld mit gleichen Elementen wie Feld, evtl. in anderer Reihenfolge Zu Feld mit N Elementen gibt es N! verschiedene Permutationen – Beweis durch mathematische Induktion – Formel, wenn einige Elemente gleich sind? Sortieren – Grundbegriffe ● ● Feld[i]>Feld[j] – Feld[i] ist größer als Feld[j] – auch, wenn Ordnung „>“ nicht übliche Bedeutung wie bei Zahlen i<j – Feld[i] steht links von Feld[j] – Feld[j] steht rechts von Feld[i] Sortieren – Grundbegriffe ● ● Total geordnet – Feld[i] < Feld[j], – Feld[i] == Feld[j] oder – Feld[i] > Feld[j] Partiell geordnet – Elemente, zwischen denen keine dieser drei möglichen Relationen besteht – beispielsweise Tupel (a,b) von Zahlen (komplexe Zahlen) (a,b) ≤ (c,d) ↔ a ≤ b ٨ c ≤ d a ,b∈ Sortieren – Grundbegriffe ● Aufsteigend geordnet – ● Absteigend geordnet – ● ● i < j → Feld[i] < Feld[j] i < j → Feld[i] > Feld[j] Total geordnete Menge N verschiedener Feldelementen kann stets auf genau eine Weise (aufsteigend) sortiert werden. Sortierung einer partiell geordneten Menge – i < j → ¬ Feld[i] > Feld[j] Sortieren – Grundbegriffe ● Stabiles Sortierverfahren – i < j ٨ Feld[i] = Feld[j] → iS < jS Ordnung gleicher Feldelemente bleibt erhalten. – Sortierung bei verschiedenen Schlüsseln (Vorname, Nachname) Sortieren – Grundbegriffe ● Fehlstellungszahl – Untere Fehlstellungszahl nj zu Index j – Anzahl i: i < j, für die Feld[i] > Feld[j] – Untere Fehlstellungszahl: n=∑ n j N i=0 N – ● obere Fehlstellungszahl analog: m=∑ m j Satz: n = m – i=0 Untere Fehlstellungszahl = obere Fehlstellungszahl Sortieren – Grundbegriffe ● Allgemein nur Fehlstellungszahl (Inversionszahl) ● Bedeutung der Inversionszahl – ● kleinste Anzahl von Vertauschungen benachbarter Elemente, um Permutation in sortiertes Feld zu überführen. Wieso? Größte Inversionszahl eines Feldes der Länge N – absteigend sortiertes Feld mit verschiedenen Feldelementen Sortieren – Grundbegriffe ● ● ● ● Anzahl der Fehlstellungen kann quadratisch mit Anzahl der Feldelemente N wachsen Sortierung durch Vertauschen benachbarter Elemente in Fehlstellung Inversionszahl meistens sehr groß – im Mittel etwa Hälfte der maximalen Inversionszahl – z.B. Bubble Sort mit Laufzeitkomplexität O(N2) effizientes Sortierverfahren sollte schneller sein Sortieren – Grundbegriffe ● Ordnungsverträglich – Laufzeit eines Sortierverfahrens wächst monoton mit Inversionszahl jeder Permutation – Effizientere Verfahren sind häufig nicht oder nur teilweise ordnungsverträglich Sortieren – Grundbegriffe ● A-fast geordnet – In manchen Fällen stehen alle Elemente nahezu an ihrem Platz – ak: Abstand des Elements an Stelle k von Zielplatz – für jedes k sei |k-ak| < A, – Feld heißt A-fast geordnet. – Fehlstellungszahl kleiner als N·A – Laufzeitkomplexität für Sortierung dieses Feldes wächst linear mit Anzahl der Feldemente N: O(N). Sortieren – Grundbegriffe ● Komplexere Algorithmen sortieren mit einem maximalem Aufwand von O(n·log(N)) – häufig verschiedene Nachteile ● ● ● ● nicht stabil nicht ordnungsverträglich zusätzlicher Speicherplatz Wichtig, die Eigenschaften von Algorithmen zu kennen – abhängig von Anwendungen – quantitative, qualitative Eigenschaften – minimale, maximale, mittlere Laufzeiten Einteilung der Sortierverfahren ● ● Verwendete Datensätze – public class CDatenSatz { public CDatenSatz (int i) {key=i}; int key = 0; String Name = ""; } – key wird als Schlüssel bezeichnet Äußere Sortierverfahren halten nur kleine Teilmenge der Daten im Speicherplatz – größter Teil der Daten auf externen Speichermedien – sequentieller Zugriff – früher meist Magnetbändern Einteilung der Sortierverfahren ● ● Innere Sortierverfahren halten sämtliche zu sortierenden Daten im Speicher Vertauschen – ● Elemente in falscher Reihenfolge werden solange vertauscht, bis alle in richtiger Reihenfolge stehen. Auswählen – kleinstes Element wird herausgesucht, an richtige Stelle gebracht usw. Einteilung der Sortierverfahren ● Einfügen – ● Element wird an richtiger Stelle einer sortierten Teilfolge eingefügt. Mischen – Zwei sortierte Teilfolgen werden zur längeren sortierten Teilfolge zusammengefasst. Einteilung der Sortierverfahren ● ● ● Verteilen – Elemente mit verschiedenen Schlüsseln werden in unterschiedliche Felder sortiert, – mindestens so viele Felder, wie Schlüssel Verfahren haben unterschiedliche Vor- und Nachteile, Entscheidung für ein geeignetes Verfahren hängt i.d.R. von jeweiliger Situation ab. Langsamste Sortierverfahren ● maximale Dauer – keine unsinnigen Operationen ● – keine Elemente in richtiger Reihenfolge vertauschen. Vertauscht man nur benachbarte, falsch stehende Elemente, so erhalt man ● ● Bubble Sort-Algorithmus, Laufzeit proportional der Inversionszahl – maximale Laufzeit eines Sortieralgorithmus im gleichen Maße wie die Inversionszahl, – in der Regel quadratisch mit Anzahl der Feldelemente Schnellste Sortierverfahren ● ● ● Anzahl oberer und unterer Fehlstellungen – Index si des Platzes eines Elements bestimmen – si = i + mi – ni (Index des Elements Feld[i]) Jeder Platz nur zweimal berührt, d.h. Laufzeitkomplexität O(2·N) = linear! Meist ist Anzahl oberer / unterer Fehlstellungen nicht bekannt – kaum praktikabel Schnellste Sortierverfahren ● nur zwei Elemente vergleichen oder vertauschen ● vorliegende Information möglichst ausnutzen ● über Lage der Feldelemente informieren – ● Sortierung mit linearem Aufwand Kenntnis über Teilfolge: Feld[1] bis Feld [m] – nächstes Element einsortieren mit Binärteilungsprinzip O (log(2·m)) – Gesamter Aufwand ● ● log2(2) + log2(3) + log2(4) + … + log2(N) = log2(N!) ≈ O(N·log2(N)) Stirlingsche Formel Schnellste Sortierverfahren ● ● Vergleich jeweils zweier Elemente – Ausnutzung bereits sortierter Datenmengen – Algorithmus nicht schneller als O(N·log2(N)) Grenze akzeptabel – Algorithmen mit Aufwand N·log2(N) für Praxis völlig ausreichend – Logarithmusfunktion wächst nur sehr langsam – Algorithmen von geringerer Ordnung meist andere Nachteile Direkte Sortierverfahren ● Aufwand stets O(N2) – ● für größere Anzahl zu sortierender Elemente unvertretbar zeitaufwendig Höhere Verfahren besser geeignet – direkte Verfahren teilweise Hilfsverfahren bei höheren Verfahren – höheren Verfahren bei kleinen zu sortierenden Datenmengen sehr ineffizient Folgen und Reihen ● Zahlenfolge – a 1 , a 2 , a 3, , a N −2 , a N −1 , a N Zahlenfolge heißt arithmetisch Folge, wenn ∀ i1: d i =ai −a i−1=d =konstant – Die Summe der Summanden einer arithmetischen Folge heißt arithmetischen Reihe – Für die Summenformel der arithmetischen Reihe gilt a1a N ∑ ai = 2 . i=1 N (erste Glied + letztes Glied durch 2). Folgen und Reihen ● Beweis für Summenformel mit 2⋅ = = a1 a2 aN a N −1 = a1 a1d a1d⋅ N −1 a1d N −2 = 2 a1d⋅ N −1 2 a1d⋅ N −1 = a1a1d⋅ N −1 a1a1d⋅ N −1 = N⋅a1a1d⋅ N −1 = N⋅a1a N N⋅a1a N ⇒ = . 2 a i =a1i−1⋅d a N −1 a2 a1d N −2 a1d 2 a1d⋅ N −1 aN a1 a1d⋅ N −1 a1 2 a1d⋅ N −1 a1a1d⋅ N −1 Folgen und Reihen ● Zahlenfolge a 1 , a 2 , a 3 , , a N −1 , a N – Zahlenfolge heißt geometrische Folge, wenn – Die Summe der Summanden einer arithmetischen Folge heißt geometrische Reihe – Für die Summenformel der geometrischen Reihe gilt ai ∀ i1 :qi = =q=konstant a i−1 N N q −1 ∑ ai =a1⋅ q−1 . i=1 Folgen und Reihen ● i−1 a =a ⋅q=a ⋅q Beweis für Summenformel mit i i−1 1 = q⋅ = a1 a 1⋅q a 1⋅q 2 a 1⋅q N −2 a 1⋅q a 1⋅q 2 a 1⋅q 3 −q⋅=a 1−a 1⋅q N ⋅1−q=a 1⋅1−q N a 1−a 1⋅q N 1−q N = =a 1⋅ . 1−q 1−q Mathematische Induktion ● ● ● Beweisverfahren für (natürliche Zahlen) Einfachste Form: Beweise E(n) für alle natürlichen Zahlen n. – Beweise E(1). – Beweise: Gilt für irgendein n: E(n), so gilt auch E(n+1). Hinweise – 'Beweis' dieses Beweisverfahrens: E(1) E(2) E(3) ... E(n–1) E(n). – Bezeichnung (Mathematische) Induktion von Pascal. – Bessere Beschreibung: Stereotype logische Deduktion. Mathematische Induktion ● Geltungsbereich – Nur wenn E(1) gilt; jeweils explizit nachzuweisen. – Beweis gilt nur für endliche Zahlenmengen, also nicht für die Menge der natürlichen Zahlen. – Gegenbeispiel: ● E(k) {Die Menge {1,2,..,k} ist endlich} ● Es gilt E(1), da {1} eine endliche Menge ist. Da die Vereinigung zweier endlicher Mengen endlich ist, gilt auch: {1,2,..,m-1}{m}={1,2,..,m-1,m} ist endlich. ● Also folgt: E(m-1) und {m} endlich E(m) für jede Zahl m. ● Daher wäre die Menge der natürlichen Zahlen endlich. ● Mathematische Induktion – Beispiel ● Anzahl der Permutationen von N Elementen: N!. – Ein Element: (a), eine Anordnung – (nicht nötig, 2 Elemente: (a,b) (b,a): zwei Anordnungen) – (nicht nötig, 3 Elemente: (a,b,c) (a,c,b) (b,a,c) (c,a,b) (b,c,a) (c,b,a): 6 Anordn.) – Gebe es für (N-1) Elemente (N-1)! Permutation (p1,p2,...,pN-1), so gilt für N Elemente (N-tes Elemente = pN): 1: (pN,p1,p2,...,pN-1), 2:(p1,pN,p2,...,pN-1), 3:(p1,p2,pN,...,pN-1), N-1:(p1,p2,...,pN,pN-1), N:(p1,p2,...,pN-1,pN) – Daher ist die Anzahl der Permutationen N·(N-1)!=N!. Mathematische Induktion – Beispiel ● Pascalsches Dreieck: N N = N 1 k k 1 k 1 N N =1N = N 1 0 1 1 – Für k=0: – Gelte die Formel für k=m-1; für k=m gilt: N N m m1 = = = = = N N ⋅N −m m m m1 N ⋅1 N −m m1 m N ⋅ N −mm1 m m1 N ⋅ N 1 m m1 N 1 m1 Statistik ● Kennzahlen von – Mittelwert – k-tes Moment – Varianz – X ={ X i }i=1.. N N Zahlenfolgen 1 E [ X ]= ⋅∑ X i N i=1 Standardabweichung N 1 k k E [ X ]= ⋅∑ X i N i=1 N 1 2 V [ X ]= ⋅∑ E [ X ]− X i N i=1 [ X ]= V [ X ]. 2 – Berechnung der Varianz 2 V [ X ]=E [ X ]−E [ X ] . Statistik ● In der Statistik wird gezeigt, dass der Mittelwert einer Grundgesamtheit mit großer Wahrscheinlichkeit in dem Intervall liegt: E [ X ]± [ X ] – ● Je kleiner σ, desto enger ist dieses Intervall Praktisches Vorgehen: – Wiederhole Messung solange, bis [ X ] – Oder bis der Variationskoeffizient [ X ] CX= E[X ] Zufallszahlen ● Definition von Zufallszahlenfolgen – Sei eine Folge von Zahlen gegeben: {z k }k =1.. N , ∀ k : z k ∈[ 0,1 ⊂ℝ z1, z2, z3, ... , zN-1, zM. – Dann heißt diese Zahlenfolge eine Zufallszahlenfolge, wenn gilt: ● ● Die Werte zk sind gleichmäßig über [0,1) verteilt. zk und die p Werte {zk-p, zk-p+1, zk-p+2, ... ,zp-2, zp-1} sind unkorreliert. Zufallszahlen ● Definition von unkorreliert – Seien zwei Zahlenfolgen { y k }k =1.. N , {z k }k =1.. N gegeben. Dann wird 1 Cov y , z = N N E [ y ]− y k ⋅ E [ z ]−z k ∑ i=1 Kovarianz von {y} und {z} genannt. – Konvergiert die Kovarianz mit wachsendem N gegen null, so heißen {y} und {z} unkorreliert! 1 lim N ∞ N N E [ y ]− y k ⋅ E [ z ]−z k 0 ∑ i=1 Langsamstes Sortierverfahren ● Voraussetzungen – ● Methode – ● Keine unsinnigen Operationen Vertausche benachbarte 'Fehlstellungen', solange es solche gibt → Bubblesort. Ergebnis – 'Langsamstes' Sortierverfahren so schlecht wie Bubblesort, d.h. V = N −12 ● ● Vergleiche: Vertauschungen: Anzahl der Fehlstellungen Schnellstes Sortierverfahren ● Fehlstellungszahl zu Feld[i] – ● Methode – ● Index des endgültigen Platzes des Elements Feld[i] si = i + mi – ni Vertausche jedes Element auf 'seinen' Platz Aber – Wie berechnet man die Fehlstellungszahl? → O(N2) – Nicht praktikabel! Schnellstes Sortierverfahren ● ● Einschränkungen – Vergleiche nur jeweils zwei Elemente – Nutze bereits bekannte Information, z.B. sortierte Teilfolge Ergebnis – Füge in sortierte Teilfolge nach Binärteilungsprinzip ein mit Aufwand O(log N). ● ● log2(2) + log2(3) + log2(4) +…+ log2(N) = log2(N!) ≈ O (N·log2(N)), (Stirlingsche Formel)