Algorithmen und Datenstrukturen I

Ähnliche Dokumente
Gliederung. Algorithmen und Datenstrukturen I. Listen in Haskell: Listen in Haskell: Listen in Haskell. Datentyp Liste Strings Listenkomprehension

Gliederung. Algorithmen und Datenstrukturen II. Prioritätsgesteuerte Suche. Entwurfstechniken für Algorithmen. Entwurfstechniken für Algorithmen

Was bisher geschah Funktionale Programmierung in Haskell: Algebraische Datentypen Pattern Matching Polymorphie Typklassen Rekursive Datentypen:

ALP I. Funktionale Programmierung

Programmierparadigmen

Gliederung. Algorithmen und Datenstrukturen I. Eine wichtige Frage. Algorithmus. Materialien zur Vorlesung. Begriffsbestimmung EUKLID Primzahltest

Grundlagen der Programmierung 2. Sortierverfahren

Funktionale Programmierung mit Haskell

Informatik-Seminar Thema 6: Bäume

Algorithmen und Datenstrukturen

JAVA - Suchen - Sortieren

Sortierverfahren für Felder (Listen)

Algorithmen und Datenstrukturen 1

Programmieren I. Kapitel 7. Sortieren und Suchen

Prof. Dr. Margarita Esponda

7. Sortieren Lernziele. 7. Sortieren

Pro Informatik 2009: Objektorientierte Programmierung Tag 18. Marco Block-Berlitz, Miao Wang Freie Universität Berlin, Institut für Informatik

Algorithmen und Datenstrukturen II

Agenda. 1 Einleitung. 2 Binäre Bäume. 3 Binäre Suchbäume. 4 Rose Trees. 5 Zusammenfassung & Ausblick. Haskell Bäume. Einleitung.

Algorithmen I. Tutorium 1-3. Sitzung. Dennis Felsing

11. Elementare Datenstrukturen

8. Sortieren II. 8.1 Heapsort. Heapsort. [Max-]Heap 6. Heapsort, Quicksort, Mergesort. Binärer Baum mit folgenden Eigenschaften

Listen. 3.1 Vordefinierte Listenfunktionen

Bemerkung: Heapsort. Begriffsklärung: (zu Bäumen) Begriffsklärung: (zu Bäumen) (2) Heapsort verfeinert die Idee des Sortierens durch Auswahl:

Algorithmen und Datenstrukturen Tafelübung 14. Jens Wetzl 8. Februar 2012

Vom Leichtesten zum Schwersten Sortieralgorithmen

Kurs 1663 Datenstrukturen" Musterlösungen zur Klausur vom Seite 1. Musterlösungen zur Hauptklausur Kurs 1663 Datenstrukturen 15.

Vorlesung Datenstrukturen

Programmieren in Haskell. Abstrakte Datentypen

Klausur Algorithmen und Datenstrukturen SS August Arbeitszeit 90 min

4.1 Bäume, Datenstrukturen und Algorithmen. Zunächst führen wir Graphen ein. Die einfachste Vorstellung ist, dass ein Graph gegeben ist als

Übung Algorithmen I

Robert Sedgewick. Algorithmen in Java. Teil 1-4 Grundlagen Datenstrukturen Sortieren Suchen. Java-Beratung durch Michael Schidlowsky

Vorlesung Datenstrukturen

Inhaltsverzeichnis. Teil 1 Grundlagen 23

UE Algorithmen und Datenstrukturen 1 UE Praktische Informatik 1. Übung 9. Sortieren

Inhaltsverzeichnis. Teil 1 Grundlagen 21. Teil 2 Datenstrukturen 85

Name:... Vorname:... Matrikel-Nr.:... Unterschrift:...

Robert Sedgewick. Algorithmen in Java. »il 1-4 Grundlagen Datenstrykturen Sortleren Suchen. java-beratung durch Michael Schidlowsky

Programmieren in Haskell Programmiermethodik

NAME, VORNAME: Studiennummer: Matrikel:

Datenstrukturen und Algorithmen 2. Klausur SS 2001

Übersicht. Datenstrukturen und Algorithmen. Übersicht. Divide-and-Conquer. Vorlesung 9: Quicksort (K7)

Unendliche Listen und Bäume

Priority Queues and Heapsort

Vorlesung Datenstrukturen

Tutoraufgabe 1 (Sortieralgorithmus):

Sortieren durch Einfügen (Insertion Sort) fügt die restlichen Elemente nach und nach in die bereits sortierte Liste der abgearbeiteten Zahlen.

Übung: Algorithmen und Datenstrukturen SS 2007

2 Sortieren. Beispiel: Es seien n = 8 und a = i : a i : ϕ(i) : a ϕ(i) :

Algorithmen und Datenstrukturen SS09. Foliensatz 15. Michael Brinkmeier. Technische Universität Ilmenau Institut für Theoretische Informatik

8. A & D - Heapsort. Werden sehen, wie wir durch geschicktes Organsieren von Daten effiziente Algorithmen entwerfen können.

Definition Ein Heap (priority queue) ist eine abstrakte Datenstruktur mit folgenden Kennzeichen:

Informatik II, SS 2014

4. Sortieren 4.1 Vorbemerkungen

Kapitel 6 Elementare Sortieralgorithmen

Wiederholung ADT Menge Ziel: Verwaltung (Finden, Einfügen, Entfernen) einer Menge von Elementen

Algorithmen. Sortieren 6/1

Mathematik AG. Geschickt gesucht ist halb gefunden: Suchen und Sortieren mit Mathe

Sortieralgorithmen. Direkte Sortierverfahren & Shellsort, Quicksort, Heapsort. Vorlesung Algorithmen und Datenstrukturen 2 im SS 2004

Counting - Sort [ [ ] [ [ ] 1. SS 2008 Datenstrukturen und Algorithmen Sortieren in linearer Zeit

Algorithmen und Datenstrukturen

Grundlagen der Programmierung

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Einfache Sortierverfahren Autor: Stefan Edelkamp

Vorlesung Datenstrukturen

Sortieren durch Mischen (Mergesort; John von Neumann 1945)

Klausur Programmierung WS 2002/03

Algorithmen und Datenstrukturen 1

Algorithmen und Datenstrukturen 1 Kapitel 5

Was bisher geschah ADT Menge mit Operationen: Suche nach einem Element Einfügen eines Elementes Löschen eines Elementes Realisierung durch

1. Einfach verkettete Liste unsortiert 2. Einfach verkettete Liste sortiert 3. Doppelt verkettete Liste sortiert

Übung Algorithmen und Datenstrukturen

Konvexe Hülle. Abbildung: [Wikipedia]: Nicht-konvexe Menge (links), konvexe Menge (rechts) KIT Institut für Theoretische Informatik 510

Pro Informatik 2009: Objektorientierte Programmierung Tag 17. Marco Block-Berlitz, Miao Wang Freie Universität Berlin, Institut für Informatik

Algorithmen und Datenstrukturen Heapsort

Programmiertechnik II

Die Korrektheit von Mergesort

Datenstrukturen & Algorithmen

Algorithmen und Datenstrukturen

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen 1-3. Seminar -

TECHNISCHE UNIVERSITÄT MÜNCHEN. Abgabe: (vor der Vorlesung)

WS 2011/2012. Robert Giegerich Dezember 2013

8.1.3 Operation Build-Max-Heap Operation zur Konstruktion eines Heaps Eingabe: Feld A[1..n], n = länge(a) BUILD-MAX-HEAP (A)

Heap-Sort und andere Sortieralgorithmen

Parallele Algorithmen

Transkript:

Algorithmen und Datenstrukturen I Sortierverfahren D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg Winter 2009/10, 18. Januar 2010, c 2009/10 D.Rösner D. Rösner AuD I 2009/10... 1

Gliederung 1 Sortieren Selection sort Quicksort Insertion sort Merge sort Selection sort Insertion sort Mergesort Heapsort Tree sort D. Rösner AuD I 2009/10... 2

Sortieren Sortieren von Daten anhand von sog. Schlüsseln ist eine immmer wiederkehrende Aufgabe siehe z.b. folgende Meldung vom Nov. 2008: Google stellt neuen Sortier-Rekord auf Ein Petabyte in sechs Stunden sortiert Quelle: http://www.computerzeitung.de/articles/ein_petabyte_in_sechs_stunden_sortiert: /2008049/31753729_ha_CZ.html?thes= D. Rösner AuD I 2009/10... 4

Sortieren Sortieraufgabe für die im folgenden behandelten Algorithmen: eine Liste von Schlüsseln soll gemäss einem Vergleichsoperator in aufsteigender Reihenfolge angeordnet werden m.a.w.: in Haskell müssen die Schlüssel zur Klasse Ord gehören Signatur: sort :: (Ord a) => [a] -> [a] D. Rösner AuD I 2009/10... 5

Sortieren durch Sortieren durch (engl. comparison-based sorting): nacheinander werden jeweils zwei Werte miteinander verglichen und ihre relative Position ggf. verändert grundsätzliches Prinzip der Algorithmen: zerlege die ursprüngliche Liste L in zwei Listen L1 und L2, sortiere diese rekursiv, dann füge die Resultate zusammen. vgl. [RL99], Ch. 6 D. Rösner AuD I 2009/10... 7

Sortieren durch Unterschiede zwischen Sortieralgorithmen betreffen den Aufwand für das Zerlegen der Liste (hard vs. easy split), die Grössenverhältnisse von L1 und L2 (singleton vs. equal size lists), den Aufwand für das Zusammenfügen der Listen L1 und L2 (hard vs. easy join) es gibt (leider) keine Algorithmen, bei denen gleichzeitig easy split und easy join vorliegt vgl. [RL99], Ch. 6 D. Rösner AuD I 2009/10... 8

Sortieren durch Auswahl Grundidee von Selection sort : extrahiere aus der ursprünglichen Liste den Schlüssel mit dem minimalen Wert füge diesen in die erste Position einer Resultatliste wiederhole dieses Vorgehen solange, bis die ursprüngliche Liste leer ist vgl. [RL99], Ch. 6 D. Rösner AuD I 2009/10... 9

Sortieren durch Auswahl Beispiel direkte Implementierung: ssort :: (Ord a) => [a] -> [a] ssort [] = [] ssort xs = m : ssort (delete m xs) where m = minimum xs Analyse: Aufwand für Split:... Verhältnis der Teillisten:... Aufwand für Join:... vgl. [RL99], Fig. 6.2 D. Rösner AuD I 2009/10... 10

Quicksort Sortieren Grundidee von Quicksort : nimm erstes Listenelement als sog. Pivotelement zerlege den Rest so in zwei Teillisten, dass die eine die Elemente enthält, die kleiner oder gleich dem Pivot, und die andere diejenigen, die grösser als der Pivot sind sortiere die Teillisten rekursiv füge die sortieren Teillisten mit dem Pivot wieder zusammen vgl. [RL99], Ch. 6 D. Rösner AuD I 2009/10... 11

Quicksort Sortieren Beispiel direkte Implementierung: qsort :: (Ord a) => [a] -> [a] qsort [] = [] qsort (pivot:rest) = qsort lower ++ [pivot] ++ qsort upper where lower = [ x x <- rest, x <= pivot] upper = [ x x <- rest, x > pivot] Analyse: Aufwand für Split:... Verhältnis der Teillisten:... Aufwand für Join:... vgl. [RL99], Fig. 6.3 D. Rösner AuD I 2009/10... 12

Sortieren durch Einfügen Grundidee von Insertion sort : nimm erstes Listenelement füge es an die richtige Position in den rekursiv sortierten Rest der Liste ein Alltagsbeispiel: sukzessives Einfügen von Spielkarten in eine sortierte Kartenhand vgl. [RL99], Ch. 6 D. Rösner AuD I 2009/10... 13

Sortieren durch Einfügen Beispiel direkte Implementierung: insert :: (Ord a) => a -> [a] -> [a] insert x xs = takewhile (<= x) xs ++ [x] ++ dropwhile (<= x) xs isort :: (Ord a) => [a] -> [a] isort [] = [] isort (x:xs) = insert x (isort xs) Analyse: Aufwand für Split:... Verhältnis der Teillisten:... Aufwand für Join:... vgl. [RL99], Fig. 6.4 D. Rösner AuD I 2009/10... 14

Sortieren durch Zusammenfügen Grundidee von Mergesort : teile die ursprüngliche Liste in zwei Hälften sortiere diese rekursiv füge die sortierten Hälften wieder zusammen vgl. [RL99], Ch. 6 D. Rösner AuD I 2009/10... 15

Sortieren durch Zusammenfügen Beispiel direkte Implementierung: msort :: (Ord a) => [a] -> [a] msort [] = [] msort [x] = [x] msort l = merge (msort l1)(msort l2) where l1 = (take k l ) l2 = (drop k l) k = (length l) div 2 vgl. [RL99], Fig. 6.5 D. Rösner AuD I 2009/10... 16

Sortieren durch Zusammenfügen Beispiel Fortsetzung direkte Implementierung: Hilfsfunktion merge zum ordnungserhaltenden Zusammenfügen zweier bereits sortierter Listen merge :: (Ord a) => [a] -> [a] -> [a] merge [] b = b merge a [] = a merge a@(x:xs) b@(y:ys) (x<=y) = x : (merge xs b) otherwise = y : (merge a ys) vgl. [RL99], Fig. 6.5 D. Rösner AuD I 2009/10... 17

Sortieren durch Zusammenfügen Analyse: Aufwand für Split:... Verhältnis der Teillisten:... Aufwand für Join:... vgl. [RL99], Fig. 6.5 D. Rösner AuD I 2009/10... 18

Sortieren durch Auswählen Nachteil der direkten Implementierung: ssort :: (Ord a) => [a] -> [a] ssort [] = [] ssort xs = m : ssort (delete m xs) where m = minimum xs die ursprüngliche Liste wird zweimal traversiert: einmal zur Bestimmung des Minimums (mit minimum), dann erneut zur Entfernung (des ersten Vorkommens) des Minimums (mit delete) vgl. [RL99], Fig. 6.2 D. Rösner AuD I 2009/10... 20

Sortieren durch Auswählen Vorgehen: die folgende Variante vermeidet zweifaches Traversieren: die Bestimmung des Minimums und die Bestimmung der Restliste erfolgen gleichzeitig Hilfsfunktion split: split :: (Ord a) => [a] -> a -> [a] -> [a] split [] m r = m : (ssort r) split (x:xs) m r = if x < m then split xs x (m:r) else split xs m (x:r) damit: ssort [] = [] ssort (x:xs) = split xs x [] vgl. [RL99], 6.3.1 D. Rösner AuD I 2009/10... 21

Sortieren durch Einfügen implementiert als Zusammenspiel mit Hilfsfunktion insert, die ein Element an die richtige Stelle in einer sortierten Liste platziert insert x xs = takewhile (<= x) xs ++ [x] ++ dropwhile (<= x) xs isort [] = [] isort (x:xs) = insert x (isort xs) alternativ dargestellt: isort xs = foldr insert [] xs D. Rösner AuD I 2009/10... 22

Sortieren durch Einfügen Nachteil der obigen Implementierung von insert: die unabhängige Verwendung von takewhile und dropwhile führt zu zwei Listentraversierungen die folgende Variante, bei der das Ergebnis von insert akkumulierend gewonnen wird, vermeidet diesen Aufwand: insert key [] = [key] insert key l@(x:xs) key <= x = key : l otherwise = x : (insert key xs) isort xs = foldr insert [] xs D. Rösner AuD I 2009/10... 23

Sortieren durch Zusammenfügen aufgrund der rekursiven Definitionen (s.o.) zerlegt Mergesort eine Liste der Länge n zunächst in zwei Listen der Länge n/2, dann diese in vier Listen der Länge n/4, usw. bis n Listen der Länge 1 vorliegen. Erst dann beginnt das Zusammenfügen mit merge. vgl. [RL99], 6.3.4 D. Rösner AuD I 2009/10... 24

Sortieren durch Zusammenfügen Die Variante bottom-up mergesort startet mit n Listen der Länge 1, die dann rekursiv jeweils paarweise zusammengefügt werden. Für das Aufteilen werden dann auch nicht mehr take und drop benötigt. vgl. [RL99], 6.3.4 D. Rösner AuD I 2009/10... 25

Sortieren: bottom-up mergesort der Haskell-Code für bottom-up mergesort Hilfsfunktion split: aus Liste wird Liste mit einelementigen Listen mit den ursprünglichen Elementen split :: (Ord a) => [a] -> [[a]] split [] = [] split (x:xs) = [x] : split xs Variante mit map:... D. Rösner AuD I 2009/10... 26

Sortieren: bottom-up mergesort Haskell-Code für bottom-up mergesort (cont.) mergepairs :: (Ord a) => [[a]] -> [[a]] mergepairs [] = [] mergepairs x@[l] = x mergepairs (l1:l2:rest) = (merge l1 l2) : (mergepairs rest) D. Rösner AuD I 2009/10... 27

Sortieren: bottom-up mergesort der Haskell-Code für bottom-up mergesort (cont.) msort :: (Ord a) => [a] -> [a] msort l = ms (split l) where ms [r] = r ms l = ms (mergepairs l) D. Rösner AuD I 2009/10... 28

Baumbasierte Sortierverfahren verwenden Bäume zum optimierten Zugriff im folgenden betrachtet: Heapsort (vgl. [RL99], 6.4.1) Tree sort (vgl. [RL99], 6.4.2) D. Rösner AuD I 2009/10... 30

Heapsort Sortieren Vorgehen: die Elemente der unsortierten Ausgangsliste werden nacheinander in eine (als Heap implementierte) Prioritätswarteschlange eingefügt, dann wird solange, bis die Warteschlange leer, wiederholt das jeweils kleinste Element entnommen und in die (damit dann sortierte) Ergebnisliste eingefügt Heapsort kann als Optimierung von Selection sort angesehen werden, denn das jeweils kleinste Element ist mit konstantem Aufwand erreichbar D. Rösner AuD I 2009/10... 31

Heapsort Sortieren Haskell-Implementierung (vgl. [RL99], 6.4.1): Hilfsfunktion zum Aufbau der Prioritätswarteschlange mkpq :: (Ord a) => [a] -> PQueue a mkpq xs = foldr enpq emptypq xs hsort :: (Ord a) => [a] -> [a] hsort xs = hsort (mkpq xs) where hsort pq (pqempty pq) = [] otherwise = (frontpq pq):(hsort (depq pq)) D. Rösner AuD I 2009/10... 32

Tree sort Sortieren Vorgehen (vgl. [RL99], 6.4.2): aus einer unsortierten Liste wird ein binärer Suchbaum aufgebaut dieser liefert bei einer Inorder-Traversierung die Elemente dann in der korrekten Ordnung zurück D. Rösner AuD I 2009/10... 33

Tree sort Sortieren die Implementierung ist mit den bereits vorhandenen Sprachmitteln für binäre Suchbäume sehr einfach: tsort xs = (inorder. buildtree) xs Tree sort kann als Optimierung von Insertion sort angesehen werden denn im Mittel ist der Aufwand für das Einfügen eines Elements in einen binären Suchbaum nur O(log n) statt O(n) wie beim Einfügen in eine Liste D. Rösner AuD I 2009/10... 34

Literatur: I Sortieren Fethi Rabhi and Guy Lapalme. Algorithms A Functional Programming Approach. Pearson Education Ltd., Essex, 1999. 2nd edition, ISBN 0-201-59604-0. D. Rösner AuD I 2009/10... 35