INSERTION-SORT: Ja, Es wird immer das erste, kleinste Element an die neue Liste angehängt.

Ähnliche Dokumente
Informatik II, SS 2018

QuickSort ist ein Sortieralgorithmus, der auf der Idee des Teile & Beherrsche beruht, und das gegebene Array an Ort und Stelle (in place) sortiert

Algorithmen und Datenstrukturen

Übung Algorithmen und Datenstrukturen

9. Rekursion. 1 falls n 1 n (n 1)!, andernfalls. Experiment: Die Türme von Hanoi. Links Mitte Rechts. Mathematische Rekursion

Übung Algorithmen und Datenstrukturen

14. Sortieren II Heapsort. Heapsort. [Max-]Heap 7. Heapsort, Quicksort, Mergesort. Binärer Baum mit folgenden Eigenschaften

Sortieralgorithmen. Selection Sort

Grundlagen: Algorithmen und Datenstrukturen

Übung: Algorithmen und Datenstrukturen SS 2007

Kap. 3: Sortieren (3)

Build-Max-Heap. Build-Max-HeappAq. Satz Nach Ablauf von Build-Max-Heap ist A ein Heap. Build-Max-Heap hat Laufzeit Opnq.

Lösungsvorschläge zur Hauptklausur 1661 Datenstrukturen I

Abschnitt: Algorithmendesign und Laufzeitanalyse

Das Suchproblem 4. Suchen Das Auswahlproblem Suche in Array

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

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

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

Das Suchproblem 4. Suchen Das Auswahlproblem Suche in Array

Übung Algorithmen und Datenstrukturen

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

Heapsort, Quicksort, Mergesort. 8. Sortieren II

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

Übung Algorithmen I

Algorithmen und Datenstrukturen

Heapsort. 1. Erstelle aus dem gegebenen Array einen Max-Heap (DownHeap) 2. Tausche erstes und letztes Element des Arrays

Technische Universität München SoSe 2018 Fakultät für Informatik, I Mai 2018 Dr. Stefanie Demirci

Ü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:

Prof. Dr. Margarita Esponda

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

Algorithmen und Datenstrukturen 1-3. Seminar -

Heapsort, Quicksort, Mergesort. 8. Sortieren II

INFORMATIK FÜR BIOLOGEN

6 Algorithmen und Datenstrukturen

Formaler. Gegeben: Elementfolge s = e 1,...,e n. s ist Permutation von s e 1 e n für eine lineare Ordnung ` '

Sortieren & Co. KIT Institut für Theoretische Informatik

Interne Sortierverfahren

Informatik II, SS 2016

Praktikum Algorithmische Anwendungen WS 2006/07 Sortieren in linearer Laufzeit

Datenstrukturen und Algorithmen Beispiellösung zu Heimübungsblatt 7. Abbildung 1: Das Array A als Baum (vgl. Foliensatz 16, Folie 3)

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

Kapitel 10. Komplexität von Algorithmen und Sortieralgorithmen

A7.1 Untere Schranke. Algorithmen und Datenstrukturen. A7.1 Untere Schranke. Algorithmen und Datenstrukturen. A7.2 Quicksort. A7.

6 Quicksort. die mittlere Laufzeit Θ(n log n) beträgt und. die in der asymptotischen Notation verborgenen Konstanten sehr klein sind.

Suchen und Sortieren Sortieren. Heaps

Informatik II, SS 2014

Algorithmen und Datenstrukturen

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)

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Technische Universität München

Algorithmen und Datenstrukturen

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

Tutoraufgabe 1 (Sortieralgorithmus):

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

Algorithmen I - Tutorium 28 Nr. 2

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

JAVA - Suchen - Sortieren

Suchen und Sortieren Sortieren. Mergesort

Algorithmen und Datenstrukturen 2. Stefan Florian Palkovits, BSc Juni 2016

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

3. Suchen. Das Suchproblem. Suche in Array. Lineare Suche. 1 n. i = n Gegeben Menge von Datensätzen.

Übung zu Algorithmen I 31. Mai 2017

Auswählen nach Rang (Selektion)

Algorithmen und Datenstrukturen

1. Teilklausur. Name:... Vorname:... Matrikel-Nummer:...

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

Median und i-kleinste Elemente

3.2. Divide-and-Conquer-Methoden

Präfix-Summe. Das Schweizer Offiziersmesser der Parallelen Algorithmen. Parallele Rechenmodelle Präfix-Summe Brents Lemma Anwendungen

Kap. 3ff: Untere Laufzeitschranke und Lineare Verfahren

Motivation Überblick

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

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

Asymptotische Laufzeitanalyse: Beispiel

Kapitel 6 Elementare Sortieralgorithmen

Grundlagen: Algorithmen und Datenstrukturen

7. Übung zu Algorithmen I 1. Juni 2016

Informatik II, SS 2014

Heapsort. Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen / 50

Proseminar Effiziente Algorithmen

Algorithmen als systematische Vorgehensweisen zur Lösung eines formal definierten Problems

Kap. 2: Abstrakte Datentypen Kap. 3: Sortieren

Java. public D find(k k) { Listnode K, D n = findnode(k); if(n == null) return null; return n.data; Java

Kapitel 8 Fortgeschrittene Sortieralgorithmen

Vorlesung Datenstrukturen

Informatik II, SS 2016

Kap. 3 Sortieren. 7. VO DAP2 SS Mai Vorlesung am Do 7.5. entfällt wegen FVV um 14 Uhr HeapSort ff 3.1.

Algorithmen als systematische Vorgehensweisen zur Lösung eines formal definierten Problems

Die Schnittstelle Comparable

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

Algorithmentheorie Randomisierung. Robert Elsässer

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

Übung Algorithmen und Datenstrukturen

Kap. 3: Sortieren. Überblick. Unser Sortierproblem. Motivation. Laufzeitmessung. Warum soll ich hier bleiben? Sortierverfahren sind WICHTIG!!!

Kap. 3: Sortieren. 4. VO DAP2 SS April 2009

Grundzüge DS & Alg (WS14/15) Lösungsvorschlag zu Aufgabenblatt 3. Aufgabe 1. (a) nicht-heap (b) Heap 25. (c) Beinahe-Heap 9.

Informatik II Sortieren

Informatik II Sortieren

Transkript:

Aufgabe 1 INSERTION-SORT: Ja, Es wird immer das erste, kleinste Element an die neue Liste angehängt. QUICK-SORT: Hängt davon ab ob PARTITION stabil ist. MERGE-SORT: Ja, Splitten, sowie Mergen ist stabil. HEAP-SORT: Nein. (Beachte HEAPIFY!). Aufgabe 2 a) Die Idee ist folge: Wir speichern alle Elemente e mit e x in einem externen Speicher. Alle Elemente e < x werden im Array komprimiert. Zum Schluss werden alle grösseren Elemente hinten in das Array kopiert. Etwas formaler als Pseudo-Code: 1 Input : Array A[ ], l i n k e Grenze i, r e c h t e Grenze j, Pivotelement x 2 Output : Array A[ ], das wie in der Aufgabenstellung s o r t i e r t i s t 3 4 readpointer = i ; 5 w r i t e P o i n t e r = i ; // a l l e s l i n k s vom w r i t e P o i n t e r i s t 6 // k l e i n e r a l s x 7 //EXT: e x t e r n e r Speicher 8 9 while ( readpointer <= j ) 10 i f (A[ readpointer ] > x ) 11 EXT. addlast (A[ readpointer ] ) // Element s i c h e r n 12 13 else 14 A[ w r i t e P o i n t e r ] = A[ readpointer ] ; // komprimieren 15 w r i t e P o i n t e r++; 16 17 readpointer++; 18 19 p = w r i t e P o i n t e r ; 20 // copy back 21 for ( int i = 0 ; i < EXT. length ; i++) 22 A[ w r i t e P o i n t e r ] = EXT[ i ] ; 1

23 w r i t e P o i n t e r ++; 24 25 return p ; b) Wir arbeiten rekursiv. Zunächst wird das Array genau in der Mitte m geteilt und rekursiv partitioniert mit dem Pivot x. Nun hat es die folge Form: A[l... p 1... m (m+1)... p 2... r]. l und r sind die linke und rechte Grenze fürs Partitionieren, p 1, p 2 sind die rekursiv errechneten Stellen der Pivotelemente und m ist die Mitte. Es gilt also l i p 1 : A[i] < x p 1 < i m : A[i] x m < i p 2 : A[i] < x p 2 < i r : A[i] x. Wir müssen nun nur noch die Teile von p 1 bis m und von m bis p 2, nennen wir sie B und C, vertauschen. Dafür rotieren wir sie zuerst selbst und bekommen B R, C R. Danach rotieren wir die Sequenz insgesamt und bekommen (B R, C R ) R, was dasselbe ist wie C B. Dies ist stabil. Nehmen wir induktiv an, dass der rekursive Aufruf stabil ist. Dann ist auch das Zusammenfügen stabil. Laufzeit: man kann ein Array mit n Elementen einfach in O(n) rotieren. Also ist die Laufzeit: f(n) = c n + 2f(n/2). und f(1) = O(1), so f(n) = O(n log n). Man kann kompliziertere Lösungen mit besserer Laufzeit in der Literatur 1 finden. Aufgabe 3 (a) Die Idee des Algorithmus SortLastPosition ist es, Listen von Elementen in X zu finden, für die die ersten k-1 Elemente x des Tupels x gleich sind. Hat man eine Menge von Tupeln mit gleichem Anfang (x k,..., x 2 ) gefunden, kann auf diese Menge ein CountingSort-Algorithmus ausgeführt werden. Dadurch werden die Teilmengen mit gleichem x sortiert. Diese sortierten Teillisten müssen dann nur noch konkateniert werden um die vollständig sortierte Menge X zu erhalten. SortLastPosition macht sich dabei zu nutze, dass das Array X bereits bezüglich x vorsortiert ist. Es müssen nur direkt nebeneinander liege Elemente verglichen werden. Sollten zwei Elemente X[i] und X[i+1] nicht den gleichen Anfang x haben, wird mit cp os (der Position, an der als nächstes ein Element einsortiert werden muss) überprüft ob direkt das kleinere Element in unser Resultat-Array B geschrieben werden kann. Ist cp os kleiner als i, waren die Elemente X [cp os] bis X [i] gleich und wir sortieren mit Sort den Array X[cP os...i] an die Position B[cP os...i]. cp os kann nun auf die Position i + 1 aktualisiert werden. 1 Jyrki Katajainen, Tomi Pasanen: Stable Minimum Space Partitioning in Linear Time (1992) 2

1: procedure SortLastPosition(X, b, k) 2: n = size (X) 3: cp os = 1 4: B = new Array[1...n] 5: for i = 1 to n 1 do 6: if not isequal (X[i], X[i + 1], k) then 7: if cp os == i then 8: B[cP os] = X[i] 9: cp os = i + 1 10: else 11: Sort (B[cP os...i], X[cP os...i], b, k) 12: cp os = i + 1 13: if cp os == n then 14: B[cP os] = X[n] 15: else 16: Sort (B[cP os...n], X[cP os...n], b, k) return B 1: procedure isequal(x, y, k) 2: for i = 1 to k 1 do 3: if x i y i then return false return true 1: procedure Sort(B[a...e], X[a...e], b, k) 2: C = new Array[0...b 1] 3: for i = 0 to b 1 do 4: C[i] = a 5: for i = a to e do 6: C[X[i] k ] = C[X[i] k ] + 1 7: for i = 1 to b 1 do 8: C[i] = C[i] + C[i 1] 9: for i = e to a do 10: B[C[X[i] k ]] = X[i] 11: C[X[i] k ] = C[X[i] k ] 1 Die Laufzeit des Algorithmus hängt davon ab, wie viele gleiche x es in X gibt und an welcher Stelle sich die einzelnen x unterscheiden. Im schlechtesten Fall werden in isequal k 1 3

Vergleiche ausgeführt und dies für alle n 1 Paare in X. Der Sortieralgorithmus braucht für einen Array X mit Länge c O(c + b) Zeit. Wenn wir uns mit c gleich großen Teilen von n annähern erhalten wir O(n/c(c + b)) = O(nb). Insgesamt wird damit eine Laufzeit von O((k 1) (n 1) + O(nb) = O((k + b)n) erreicht. (b) Durch die Zusatzinformation können wir uns die Vergleiche mit isequal sparen, indem wir einfach den Wert in E ablesen. Um herauszufinden, ob ein Element in die Liste mit gleichem x gehört, wird nur noch konstante Zeit benötigt. Dadurch erreicht man eine Laufzeit von O(nb). 1: procedure SortLastPosition(X, b, k) 2: n = size (X) 3: cp os = 1 4: B = new Array[1...n] 5: for i = 1 to n 1 do 6: if E[i] == 0 then 7: if cp os == i then 8: B[cP os] = X[i] 9: cp os = i + 1 10: else 11: Sort (B[cP os...i], X[cP os...i], b, k) 12: cp os = i + 1 13: if cp os == n then 14: B[cP os] = X[n] 15: else 16: Sort (B[cP os...n], X[cP os...n], b, k) return B 4

Aufgabe 4 Gesucht: Aus einem Feld von n Büchern, bzw deren Gewicht wollen wir die k leichtesten Bücher finden, deren Summe 50 ist, k aber maximal. Algorithm Data: A[1... n] Result: k lightest books with sum 50 k = getlightest(a, 1, n, 50); return A[1... k]; Function getlightest(a, i, j, sum) if i > j then return j; k = median(a); m = partition(a, i, j, k); for l = i to m 1 do s = s + A[l]; if s sum then if s + A[m] sum then return getlightest(a, m + 1, j, sum s A[m])); else return m 1; else return getlightest(a, i, m 1, sum); median(a), partition(a, i, j, k) und die for-schleife benötigen O(n) Zeit. Dann wird der Algorithmus rekursiv auf einer der beiden Hälften des Feldes aufgerufen. Sei L die Anzahl an Iterationen: T (n) = b n + T (n/2) = L b n (1/2) l l=0 b n (1/2) l = b n 2 l=0 Folglich benötigt der Algorithmus O(n) Zeit. 5