Praktikum Algorithmische Anwendungen WS 2006/07 Sortieren in linearer Laufzeit

Ähnliche Dokumente
2 Sortieren durch Vergleichen Eingabefolge a 1, a 2,..., a n 2, 1, 3 Sortieralg. Für festes n ist ein vergleichsbasierter Sortieralg. charakterisiert

Sortieralgorithmen. Jan Pöschko. 18. Januar Problemstellung Definition Warum Sortieren?... 2

Heapsort / 1 A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8]

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)

Technische Universität München

Übung Algorithmen und Datenstrukturen

Alle bislang betrachteten Sortieralgorithmen hatten (worst-case) Laufzeit Ω(nlog(n)).

Kapitel 8 Fortgeschrittene Sortieralgorithmen

Aufgabe (Schreibtischtest, Algorithmenanalyse)

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

Untere Schranke für allgemeine Sortierverfahren

Adnan Kadric Kevin Kandler Seminararbeit Sommersemester 2017

2.2 Allgemeine (vergleichsbasierte) Sortierverfahren

Kapitel 2: Sortier- und Selektionsverfahren Gliederung

Algorithmen und Datenstrukturen Heapsort

Kapitel 6 Elementare Sortieralgorithmen

Tutoraufgabe 1 (Sortieralgorithmus):

lim log 2n n = > 0 Da es einen Limes gibt, gibt es auch einen Limes inferior, der gleich diesem Limes ist.

Übung: Algorithmen und Datenstrukturen SS 2007

7. Sortieren Lernziele. 7. Sortieren

Kapitel 2. Sortieren. Adressenverwaltung (lexikographisch) Treerlisten bei Suchanfragen (Relevanz) Verdeckung (z-koordinate) ...

NAME, VORNAME: Studiennummer: Matrikel:

Algorithmen und Datenstrukturen

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

Bucketsort. Korrektheit. Beispiel. Eingabe: Array A mit n Elementen im Bereich [0,1) Annahme: die Elemente sind in [0,1) gleichverteilt.

Vorlesung Informatik 2 Algorithmen und Datenstrukturen. (25 Sortieren vorsortierter Daten)

Datenstrukturen und Algorithmen

Klausur Algorithmen und Datenstrukturen SS August Arbeitszeit 90 min

Das Suchproblem. Gegeben Menge von Datensätzen. Beispiele Telefonverzeichnis, Wörterbuch, Symboltabelle

Algorithmen und Datenstrukturen

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

Algorithmen und Datenstrukturen 1

f 1 (n) = log(n) + n 2 n 5 f 2 (n) = n 3 + n 2 f 3 (n) = log(n 2 ) f 4 (n) = n n f 5 (n) = (log(n)) 2

Suchen und Sortieren Sortieren. Heaps

4. Sortieren 4.1 Vorbemerkungen

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

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

Gliederung. 5. Compiler. 6. Sortieren und Suchen. 7. Graphen

5. Übungsblatt zu Algorithmen I im SoSe 2016

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

7 Sortieren in linearer Zeit

Prof. Dr. Margarita Esponda

Übung Datenstrukturen. Sortieren

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

Algorithmen und Datenstrukturen

Programmiertechnik II

Algorithmen und Datenstrukturen SoSe 2008 in Trier. Henning Fernau Universität Trier

3. Übungsblatt zu Algorithmen I im SoSe 2017

Quicksort ist ein Divide-and-Conquer-Verfahren.

Übersicht. Einfache Verfahren MergeSort Untere Schranke QuickSort Selektieren Schnelleres Sortieren Externes Sortieren. 6 Sortieren.

Termine für Übungstests. Kap. 3 Sortieren HeapSort ff Priority Queues. Motivation. Überblick. Analyse SiftDown

Übersicht. Datenstrukturen und Algorithmen. Übersicht. Heaps. Vorlesung 8: Heapsort (K6) Joost-Pieter Katoen. 7. Mai 2015

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen (AuD) Prof. Dr. Claudia Eckert und Dr. Thomas Stibor

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

Algorithmen und Datenstrukturen 1

Asymptotische Laufzeitanalyse: Beispiel

7. Übung zu Algorithmen I 1. Juni 2016

Algorithmen und Datenstrukturen

Übungsklausur Algorithmen I

Algorithmen und Datenstrukturen

1. Musterlösung. Problem 1: Average-case-Laufzeit vs. Worst-case-Laufzeit

Algorithmen und Datenstrukturen

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

VL-06: Sortieren I. (Datenstrukturen und Algorithmen, SS 2017) Janosch Fuchs

Übungsblatt 1. f(n) = f(n) = O(g(n)) g(n) = O(f(n)) Zeigen oder widerlegen Sie: 3 n = Θ(2 n ) Aufgabe 1.2 Gegeben sei die folgende Funktion:

Algorithmen und Datenstrukturen Wintersemester 2004/ November T(n) = T(n a) + T(a) + n

Interne Sortierverfahren

Programmiertechnik II

Beispiellösung zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 5

1. Motivation / Grundlagen 2. Sortierverfahren 3. Elementare Datenstrukturen / Anwendungen 4. Bäume / Graphen 5. Hashing 6. Algorithmische Geometrie

Denition: Rang eines Elements e einer Folge s = Position von e in sort(s) (angefangen bei 1). Frage: warum ist r nicht notwendig eindeutig?

Komplexität von Algorithmen OOPM, Ralf Lämmel

Algorithmen und Datenstrukturen. Kapitel 3: Sortierverfahren. Skript zur Vorlesung. Algorithmen und Datenstrukturen

Tutoraufgabe 1 (Sortieren): Lösung: Datenstrukturen und Algorithmen SS14 Lösung - Übung 4

Entscheidungsbäume. Definition Entscheidungsbaum. Frage: Gibt es einen Sortieralgorithmus mit o(n log n) Vergleichen?

Suchen und Sortieren

Humboldt-Universität zu Berlin Berlin, den Institut für Informatik

Heap-Sort und andere Sortieralgorithmen

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Algorithmen I. Prof. Jörn Müller-Quade Institut für Theoretische Informatik Web:

Programmieren I. Kapitel 7. Sortieren und Suchen

Programmiertechnik II

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

Wiederholung. Bäume sind zyklenfrei. Rekursive Definition: Baum = Wurzelknoten + disjunkte Menge von Kindbäumen.

Sortieralgorithmen. Selection Sort

Algorithmen und Datenstrukturen

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

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

Informatik II: Algorithmen & Datenstrukturen. Blättern Sie nicht um bevor Sie dazu aufgefordert werden!

Algorithmen und Datenstrukturen VO 3.0 Vorlesungsprüfung 19. Oktober 2007

11.1 Grundlagen - Denitionen

2. Hausübung Algorithmen und Datenstrukturen

JAVA - Suchen - Sortieren

Algorithmen & Datenstrukturen Midterm Test 2

a) Fügen Sie die Zahlen 39, 38, 37 und 36 in folgenden (2, 3)-Baum ein:

Wiederholung. Datenstrukturen und. Bäume. Wiederholung. Suchen in linearen Feldern VO

Datenstrukturen Teil 2. Bäume. Definition. Definition. Definition. Bäume sind verallgemeinerte Listen. Sie sind weiter spezielle Graphen

Übungsklausur Algorithmen I

Transkript:

Praktikum Algorithmische Anwendungen WS 2006/07 Sortieren in linearer Laufzeit Team A blau Martin Herfurth 11043831 Markus Wagner 11043447 5. Februar 2007 1

1 Untere Schranke für Vergleichsbasierte Algorithmen Die betrachteten Sortieralgorithmen CountingSort, RadixSort und BucketSort sind in der Lage, eine Menge in linearer Zeit zu sortieren. Dafür benötigen sie allerdings einige Voraussetzungen, die hier nicht weiter erläutert werden. Ein vergleichsbasierter Sortieralgorithmus schat diese Aufgabe im worst-case (MergeSort, HeapSort) bzw. im averagecase (quicksort) bestenfalls in O(n log n). Dies gilt es zu beweisen. 1.1 Entscheidungsbaum Sei T Entscheidungsbaum für ein einen vergleichsbasierten Sortieralgorithmus A mit Eingabegröÿe n. In T werden in jedem Knoten die Vergleiche gespeichert, im linken Sohn liegt dann der nächste Vergleich für den Fall, dass der linke Wert kleiner oder gleich dem rechten ist und im rechten Sohn für den umgekehrten Fall. Die Blätter tragen die Permutationen, die nötig sind, um die Eingabemenge zu sortieren. T ist ein voller Binärbaum. Beispiel für einen Entscheidungsbaum für InsertSort mit n = 3 und der Eingabemenge (6, 8, 5): 1:2 2:3 <1,2,3> 1:3 <1,3,2> <3,1,2> 1:3 <2,1,3> 2:3 <2,3,1> <3,2,1> 1.2 Anzahl Vergleiche Jede Ausführung von A auf einer Eingabemenge gehört zu einem Pfad auf dem Entscheidungsbaum T. Das heisst, jede Sortierung gehört zu einem Blatt des Entscheidungsbaumes. Da die Blätter die Permutationen der Eingabemenge repräsentieren, gibt es mindestens n! Blätter. Eine untere Schranke für die Tiefe von T is gleichzeitig eine unterer Schranke für die Laufzeit jedes vergleichsbasierten Sortieralgorithmus im worst-case. Es genügt nun zu zeigen, dass für die Tiefe d des Baumes T mit l n! Blättern gilt: d = Ω(n log n). Wir wissen: n! l 2 d Mit: n n n! < i=0 n i ( n ) n i! = en n! > e log n! > n log n n log e 1 2 n log n für log n 2 log e gilt: d log n! = Ω(n log n) q.e.d. Seite: 2

2 Radixsort Radixsort ist ein einfaches und intuitives Sortierverfahren. Wie bei allen hier betrachteten Sortierverfahren setzte es eine gewisse Kenntnis über die Menge der möglichen Schlüssel voraus. Um mit Radixsort in linearer Zeit sortieren zu können muss man das Universum der möglichen Schlüssel kennen, es muss endlich sein und sich in Bereiche einteilen lassen. Sortiert werden hier natürliche Zahlen, die von denen die Basis verwendet wird. Daher auch der Name Radix (Wurzel, Basis). Das Verfahren besteht aus mehreren Partitionierungs- und Sammelphasen. In der Partitionierungsphasen wird jeweils nach einer Stelle der Zahlen sortiert und danach wird in der zugehörigen Sammelphase ein neues Feld erzeugt, in dem einfach die partitionierten Werte aufgereiht werden. Dies wird für jede Stelle wiederholt. Nach der letzten Sammelphase ist das komplette feld sortiert. Der Algorithmus arbeitet ortslos, das bedeutet, dass für das sortierte Ausgabefeld ein extra Feld benötigt wird. Eine weitere Eigenschaft ist die Stabilität des Verfahrens. Eine vorher vorhandene Sortierung wird bei gleichen Werten in der Partitionierungsphase erhalten. Dies ist auch nötig, da sonst bei jedem Schritt der vorangegangene Schritt wieder unwirksam würde. 2.1 Pseudocode radixsort(field A) 1 B = new Array[10] 2 for 0 <= i < d do 3 for 0 <= j < A.length do 4 B[value(i, A[j])]=A[j] 5 end 6 A=B; 7 end 8 return A; Die Funktion value(i, x) gibt die Zier der Zahl x an der Stelle i zurück. d ist konstant und bekannt (Anszahl der Ziern, der gröÿten Möglichen Zahl in A). 2.2 Beispiel Gegeben is das folgende Feld mit 10 Elementen aus der Menge [0;999]: 129 944 318 322 450 111 397 745 58 922 Im ersten Schritt werde die nach der letzten Stelle in das Hilfsfeld eingefügt (Partitioniert) und dann von vorne nach hinten wieder aufgesammelt: 0 1 2 3 4 5 6 7 8 9 450 111 322 944 745 397 318 129 922 58 450 111 322 922 944 745 397 318 58 129 Im zweiten Schritt dann nach der vorletzten Stelle: 0 1 2 3 4 5 6 7 8 9 111 322 944 450 397 318 922 745 58 129 111 318 322 922 129 944 745 450 58 397 Im dritten und letzten Schritt werden die Elemente dann nach der ersten Stelle sortiert: Seite: 3

0 1 2 3 4 5 6 7 8 9 111 318 450 58 745 922 129 322 944 397 58 111 129 318 322 397 450 745 922 944 2.3 Performance Der Algorithmus durchläuft für jede mögliche Zier (Zeilen 2-7) einmal das gesamte Eingabefeld (Zeilen 3-5). Das Einfügen jedes Wertes in die Partitionierungstabelle geschieht in konstanter Zeit, da hier direkt in die Stelle der Tabelle geschrieben wird. Das heisst, die Laufzeit bei d Ziern und einer Eingabegröÿe von n beträgt: O(d n). Da d gegenüber n als konstant angesehen werden kann, gilt: O(n). 3 Bucketsort Bucketsort ist eine Variante von Radixsort. Hier werden leere Eimer (Buckets) initialisiert, in die dann die zu sortierende Folge einsortiert wird. Hierbei gibt es zwei Varianten, zum einen kann man für jeden möglichen Schlüssel im Universum einen Bucket erzeugen, dann hat man direkt nach einem Durchlaufen des Eingabefeldes, die Elemente sortiert. Alternativ kann man auch für verschiedene Bereiche des Universums Buckets erzeugen. Dann muss aber immer noch innerhalb eines Buckets sortiert werden. Dafür kann man dann rekursiv den Algorithmus erneut aufrufen, oder aber einen anderen Algorithmus verwenden, der innerhalb der Buckets sortiert. Im folgenden Betrachten wir die einfache Variante, also dass für jeden Schlüssel ein eigener Bucket existiert. Somit wird das Eingabefeld einfach durchlaufen und die Werte werden an den enstprechenden Stellen im Hilfsfeld gespeichert. Falls die Schlüssel nicht natürliche Zahlen sind, so benötigt man noch eine bijektive Abbildung der Schlüssel auf die natürlichen Zahlen. 3.1 Pseudocode bucketsort(field A) 1 B = new Array[m] //m ist die Gröÿe des Universums 2 for 0 <= i < A.length do 3 B[A[i]]=A[i] 4 end 5 k = 0 6 for 0 <= j < B.length do 7 if B[j]!= 0 do 8 A[k] = B[j] 9 k = k+1 10 end 11 end 3.2 Beispiel Folgendes Eingabefeld soll sortiert werden: 10 11 109 205 77 344 129 76 4 129 Das Universum sind die natürlichen Zahlen im Bereich [0;999], also gibt es ein Hilfsarray mit 1000 Stellen. An die entsprechenden Positionen werden die Werte kopiert: 0 1 2 3 4... 10 11... 76 77... 109... 129... 205... 344... 999 4 10 11 76 77 109 129 205 344 129 Seite: 4

Danach werden die Werte einfach wieder aufgereiht: 4 10 11 76 77 109 129 129 205 344 3.3 Performance Es gibt 2 Schleifen. Zunächst wird durch das Eingabefeld iteriert (Zeilen 2-4) und die Werte werden in das Hilfsfeld gespeichert. Danach wird das Hilfsfeld in den Zeilen 6-10 ausgelesen und die gefundenen Werte werden in das Ausgabefeld kopiert. Die erste Schleife hat n Durchläufe, die zweite m. Damit ergibt sich eine Laufzeit von O(n + m). 4 Countingsort Countingsort verfolgt den Ansatz für jeden Wert i des Eingabefeldes A die Anzahl der Werte j A zu nden, für die gilt: j i. Dafür wird zunächst ein Hilfsfeld mit der Länge k des Universums erzeugt. In diesem Feld werden dann für alle Werte aus dem Eingabefeld die Positionen um 1 inkrementiert. Damit hat man für jeden Schlüssel die Häugkeit im Eingabefeld. Nun addiert man von links beginnend die Werte auf: i n = n 1 m=0 i m. Nun wird das Eingabefeld von rechts durchlaufen und im Hilfsfeld überprüft, wiviele Werte kleiner oder gleich dem aktuellen Schlüssel sind. An diese Stelle wird der Wert dann im Ausgabefeld gespeichert und im Hilfsfeld der zugehörige Wert um 1 dekrementiert. 4.1 Pseudocode countingsort(a) 1 for 0 < i <= k do 2 C[i] = 0 3 end 4 for 0 < j <= length(a) do 5 C[A[j]] = C[A[j]] + 1 6 end 7 for 2 <= i <= k do 8 C[i] = C[i] + C[i-1] 9 end 10 for length(a) >= j >= 1 do 11 B[C[A[j]]] = A[j] 12 C[A[j]] = C[A[j]] - 1 13 end 14 return B 4.2 Beispiel Es werden neben dem Eingabefeld A noch ein Hilfsfeld C (mit 0 initialisiert) und das Ausgabefeld B benötigt: A: 3 6 3 4 1 2 7 10 11 12 13 11 11 4 3 9 18 3 7 1 B: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Dann werden die Felder in C nach und nach inkrementiert: 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Seite: 5

... 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 2 1 4 2 0 1 2 0 1 1 3 1 1 0 0 0 0 1 Danach werden die Werte aufaddiert:... 2 3 4 2 0 1 2 0 1 1 3 1 1 0 0 0 0 1 2 3 7 2 0 1 2 0 1 1 3 1 1 0 0 0 0 1 2 3 7 9 0 1 2 0 1 1 3 1 1 0 0 0 0 1 2 3 7 9 9 10 12 12 13 14 17 18 19 19 19 19 19 20 Nun wird das Eingabefeld A von rechts ausgelesen und die Werte werden Anhand der in C vorhandenen Zahlen in die entsprechende Stelle in das Ausgabefeld geschrieben. Die Werte in C werden dann immer dekrementiert: 1 3 7 9 9 10 12 12 13 14 17 18 19 19 19 19 19 20 B: 1 1 3 7 9 9 10 11 12 13 14 17 18 19 19 19 19 19 20 B: 1 7 1 3 6 9 9 10 11 12 13 14 17 18 19 19 19 19 19 20 B: 1 3 7... 0 2 3 7 9 9 10 12 12 13 14 17 18 19 19 19 19 19 B: 1 1 2 3 3 3 3 4 4 6 6 7 9 10 11 11 11 12 13 18 Fertig. 4.3 Performance Die erste (Zeilen 1-3) und dritte (Zeilen 7-9) Schleife laufen jeweils k-mal ab. Die zweite (Zeilen 4-6) und vierte (Zeilen 10-13) Schleife jeweils n-mal. Somit ergibt sich eine Komplexität von O(k + n). Seite: 6

5 Fazit Die vorgestellten Algorithmen haben zwar lineare Laufzeit. Allerdings hängt ihre eektive Laufzeit immer von der Gröÿe des Universums ab. Daher lohnen sich Ausführungen auf Mengen mit potenziell vielen veschiedenen Schlüsseln hier nicht. Aber gerade, wenn die Anzahl der Schlüssel höher ist, als die Gröÿe des Universums erreicht man sehr gute Ergebnisse. Hier gibt es dann viele Schlüssel, die doppelt vorkommen. Da eben auch alle vorgestellten Algorithmen stabil sind, geht eine Vorsortierung unter diesen gleichen Schlüsseln nicht verloren. 6 Quellen 1. http://www.wikipedia.de (Stand: 04.02.2007) 2. http://www.sortieralgorithmen.de (Stand: 04.02.2007) 3. Karl Heinz Niggl; 8. Vorlesung: Algorithmen und Datenstrukturen; TU Ilmenau 4. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest and Cliord Stein; Introduction to Algorithms Seite: 7