Ziele. Kapitel 10: Komplexität von Algorithmen und Sortierverfahren. Beispiel: Lineare Suche eines Elements in einem Array (1)

Ähnliche Dokumente
Kapitel 10. Komplexität von Algorithmen und Sortieralgorithmen

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Komplexität von Algorithmen

Programmieren und Problemlösen

Grundlegende Sortieralgorithmen

Reihungen. Prof. Dr. Christian Böhm. In Zusammenarbeit mit Gefei Zhang. WS 07/08

Grundlegende Sortieralgorithmen

(08 - Einfache Sortierverfahren)

Kapitel 2. Weitere Beispiele Effizienter Algorithmen

Reihungen. Martin Wirsing. in Zusammenarbeit mit Michael Barth, Fabian Birzele und Gefei Zhang

Grundlegende Sortieralgorithmen

Einführung in die Programmierung für NF. Arrays

Einführung in die Informatik Algorithmen und Datenstrukturen. Thema 17 Sortieren

Algorithmen und Datenstrukturen

Komplexität von Algorithmen OOPM, Ralf Lämmel

7. Sortieren Lernziele. 7. Sortieren

8 Komplexitätstheorie

Algorithmen und Datenstrukturen 1 Kapitel 5

Algorithmen und Datenstrukturen (für ET/IT)

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

Elementare Sortierverfahren

Abschnitt 7: Komplexität von imperativen Programmen

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

Übung Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

A3.1 Sortieralgorithmen

Suchen und Sortieren

UE Algorithmen und Datenstrukturen 1 UE Praktische Informatik 1. Übung 5. Asymptotische Laufzeitkomplexität Definition Regeln Beispiele

Abgabe: (vor der Vorlesung) Aufgabe 2.1 (P) O-Notation Beweisen Sie die folgenden Aussagen für positive Funktionen f und g:

Interne Sortierverfahren

Algorithmen und Datenstrukturen (für ET/IT)

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

Ordnen Sie die folgenden Funktionen nach ihrer asymptotischer Komplexität in aufsteigender Reihenfolge: i=1 4i + n = 4 n. i=1 i + 3n = 4 ( n(n+1)

Tutoraufgabe 1 (Sortieralgorithmus):

Präsenzübung Datenstrukturen und Algorithmen SS 2014

AlgoDat Fragen zu Vorlesung und Klausur

Ü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

Asymptotik und Laufzeitanalyse

Datenstrukturen und Algorithmen (SS 2013)

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Suchverfahren Autor: Stefan Edelkamp / Sven Schuierer

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

Informatik I Komplexität von Algorithmen

Komplexität von Algorithmen:

Programmiertechnik II

Vorlesung Datenstrukturen

Grundlagen: Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

Komplexität von Algorithmen

Zunächst ein paar einfache "Rechen"-Regeln: Lemma, Teil 1: Für beliebige Funktionen f und g gilt:

Sortieren II / HeapSort Heaps

2. Grundlagen. Beschreibung von Algorithmen durch Pseudocode. Korrektheit von Algorithmen durch Invarianten.

Übung: Algorithmen und Datenstrukturen SS 2007

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

Einführung in die Informatik I Kapitel II.3: Sortieren

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

Übung Algorithmen und Datenstrukturen

JAVA - Suchen - Sortieren

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

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

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

Abschnitt 19: Sortierverfahren

Algorithmen & Komplexität

Algorithmen & Komplexität

Einfache Sortierverfahren in Java, 1. Version

3.2. Divide-and-Conquer-Methoden

Algorithmen und Datenstrukturen

Informatik II. Woche 15, Giuseppe Accaputo

Komplexität von Algorithmen

Grundlagen der Programmierung

A6.1 Logarithmus. Algorithmen und Datenstrukturen. Algorithmen und Datenstrukturen. A6.1 Logarithmus. A6.2 Landau-Notation. A6.

Einführung in die Programmierung

Algorithmen und Datenstrukturen 1

Algorithmen und Datenstrukturen 1 VL Übungstest WS November 2008

Übersicht Datenstrukturen und Algorithmen. Literatur. Algorithmus: Wikipedia Definition. Vorlesung 1: Einführung. Prof. Dr.

Algorithmen und Datenstrukturen

Sortieralgorithmen. Selection Sort

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

Algorithmen und Datenstrukturen

Datenstrukturen und Algorithmen (SS 2013) Prof. Dr. Leif Kobbelt Thomas Ströder, Fabian Emmes, Sven Middelberg, Michael Kremer

Einführung in die Informatik 2

Informatik II, SS 2016

Algorithmen und Datenstrukturen

Informatik II Sortieren

Informatik II Sortieren

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

3.2. Korrektheit und Komplexität am Beispiel: Sortieren Sortieren ist eine wichtige Basis-Operation für komplexe Algorithmen

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

7. Übung zu Algorithmen I 1. Juni 2016

Informatik II, SS 2016

Übung zur Vorlesung Berechenbarkeit und Komplexität

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

Programmiertechnik II

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

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Suchen. Lineare Suche. Such-Algorithmen. Sommersemester Dr.

Transkript:

Einführung in die Informatik: Programmierung und Softwareentwicklung Wintersemester 2018/19 Ziele Kapitel 10: Komplexität von Algorithmen und Sortierverfahren Prof. Dr. David Sabel Lehr- und Forschungseinheit für Theoretische Informatik Institut für Informatik, LMU München Komplexität bezüglich Laufzeit und Speicherplatzbedarf Bestimmen der Komplexitäten von Algorithmen Asymptotische Notation und Komplexitätsklassen Sortieralgorithmen: Insertion Sort, Bubble Sort und Selection Sort (Quicksort wird in Kap. 11 behandelt) Komplexität von Sortieralgorithmen WS 2018/19 Stand der Folien: 19. Dezember 2018 Die Inhalte dieser Folien basieren mit freundlicher Genehmigung tlw. auf Folien von Prof. Dr. Rolf Hennicker aus dem WS 2017/18 und auf Folien von PD Dr. Ulrich Schöpp aus dem WS 2010/11 D. Sabel 10 Komplexität WS 2018/19 2/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren Beispiel: Lineare Suche eines Elements in einem Array (1) static boolean linsearch(int[] a, int e){ for (int i = 0; i < a.length; i++){ if (a[i] == e){return true; return false; X Durchschnitt von 100 Messungen in Millisekunden 10.000.000 2.82 20.000.000 5.47 40.000.000 10.93 80.000.000 21.71 160.000.000 43.89 320.000.000 92.64 640.000.000 194.48 1.280.000.000 412.15 Tabelle: Zeitmessung der Suche X in einem Array der Größe X gefüllt von 1 bis X. Beachte: Solche Messungen sind rechnerabhängig abhängig davon, ob andere Programme zeitgleich laufen ungeeignet, um die Komplexität genau und ein für alle Mal zu bestimmen geeignet, um einen Eindruck für die mögliche Komplexität zu gewinnen Komplexität von Algorithmen Wir unterscheiden den Zeitbedarf und den Speicherplatzbedarf eines Algorithmus. Beides hängt ab von den verwendeten Datenstrukturen, den verwendeten algorithmischen Konzepten (z.b. Schleifen), der verwendeten Rechenanlage zur Ausführungszeit (davon abstrahieren wir im Folgenden). D. Sabel 10 Komplexität WS 2018/19 3/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren D. Sabel 10 Komplexität WS 2018/19 4/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren

Zeit- und Speicherplatzbedarf Beispiel: Lineare Suche eines Elements in einem Array (2) Der Zeitbedarf eines Algorithmus errechnet sich aus dem Zeitaufwand für die Auswertung von Ausdrücken, einschl. Durchführung von Operationen, die Ausführung von Anweisungen, organisatorischen Berechnungen (davon abstrahieren wir im Folgenden). Der Speicherplatzbedarf eines Algorithmus errechnet sich aus dem benötigten Speicher für lokale Variable (einschließlich formaler Parameter) Objekte (einschließlich Arrays) und deren Attribute, organisatorische Daten (davon abstrahieren wir im Folgenden). static boolean linsearch(int[] a, int e){ for (int i = 0 ; i < a.length ; i= i+1 i = i+1 i++ ){ if ( a[i] == e){ return true ; return false; Beispiele: int a = {30, 7, 1, 15, 20, 13, 28, 25 boolean b1 = linsearch(a,30); // Zeit? boolean b2 = linsearch(a,7); // Zeit? boolean b3 = linsearch(a,23); // Zeit? D. Sabel 10 Komplexität WS 2018/19 5/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren D. Sabel 10 Komplexität WS 2018/19 6/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren Beispiel: Lineare Suche eines Elements in einem Array (3) static boolean linsearch(int[] a, int e){ for (int i = 0 ; i < a.length ; i = i + 1 i++ ){ if ( a[i] == e){return true; return false ; Sei n = a.length und e bereits eine Zahl. Wir schätzen den maximalen Zeitbedarf des Aufrufs linsearch(a,e) ab 1 für Zuweisung i = 0 pro Schleifendurchlauf (n mal): Für i < a.length: 1 Zugriff + 1 Vergleich Für i++: 1 Operation (i+1) + 1 Zuweisung i =... Für a[i] == e: 1 Arrayzugriff + 1 Vergleich letzter Test i < a.length: 1 Arrayzugriff + 1 Vergleich Aufruf return false: 1 Return Ergibt: 1 + n (1 + 1 + 1 + 1 + 1 + 1) + 2 + 1 = 6 n + 4 D. Sabel 10 Komplexität WS 2018/19 7/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren Beispiel: Lineare Suche eines Elements (2) static boolean linsearch ( int [] a, int e){ for ( int i = 0; i < a. length ; i ++) { if (a[i] == e){ return true ; return false ; Speicherplatzbedarf n+1 (für a mit length) 1 für e 1 für i 1 für Ergebnis Speicherplatzbedarf gesamt = n +4 Speicherplatzbedarf zusätzlich zur Eingabe: 2 Speicherplatzbedarf für verschiedene Aufrufe von linsearch: int [] a = {30, 7, 1, 15, 20, 13, 28, 25; boolean b1 = linsearch (a, 30) ; // Speicherplaetze : 12 boolean b2 = linsearch (a, 23) ; // Speicherplaetze : 12 D. Sabel 10 Komplexität WS 2018/19 8/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren

Komplexitätsanalyse Der Zeitbedarf und der Speicherplatzbedarf einer Methode hängt i.a. ab von der aktuellen Eingabe. Gegeben sei eine Methode static type1 m(type2 x) {body Notation: T m (e) = Zeitbedarf des Methodenaufrufs m(e) S m (e) = Speicherplatzbedarf des Methodenaufrufs m(e) Meist ist man am Skalierungsverhalten eines Algorithmus interessiert: Wie hängen Zeit- und Speicherplatzbedarf von der Größe n der Eingabe e ab (z.b. von der Länge eines Arrays)? Der Algorithmus zum Suchen eines Elements in einem Array hat für Arrays gleicher Länge unterschiedliche Kosten bzgl. der Zeit. Um solche Unterschiede abschätzen zu können, unterscheidet man die Komplexität im schlechtesten, mittleren und besten Fall (engl. worst case, average case, best case complexity). Komplexitätsarten Zeitkomplexität im schlechtesten Fall (worst case): T w m (n) = max{t m (e) Größe von e ist n mittleren Fall (average case): T a m (n) = Durchschnitt von {T m (e) Größe von e ist n besten Fall (best case): T b m (n) = min{t m (e) Größe von e ist n Speicherplatzkomplexität im schlechtesten Fall (worst case): S w m (n) = max{s m (e) Größe von e ist n mittleren Fall (average case): S a m (n) = Durchschnitt von {S m (e) Größe von e ist n besten Fall (best case): S b m(n) = min{s m (e) Größe von e ist n D. Sabel 10 Komplexität WS 2018/19 9/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren D. Sabel 10 Komplexität WS 2018/19 10/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren Beispiel: Lineare Suche, Platzbedarf static boolean linsearch(int[] a, int e){ for (int i=0; i < a.length; i++) { if (a[i] == e) {return true; return false; Als Größenmaß für die Eingabe a, e wählen wir die Länge n des Arrays a. (Für das Skalierungsverhalten ist die Größe von e hier nicht relevant) Speicherplatzbedarf insgesamt: S w linsearch(n) = S a linsearch(n) = S b linsearch(n) = n + 4 Normalerweise rechnet man den Platz, den die Eingabe belegt, selbst nicht dazu (denn der Methodenaufruf erzeugt diesen Platz nicht) Wir betrachten den zusätzlichen Speicherplatzbedarf: S w linsearch(n) = S a linsearch(n) = S b linsearch(n) = 2 D. Sabel 10 Komplexität WS 2018/19 11/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren Beispiel: Lineare Suche, Zeitbedarf static boolean linsearch(int[] a, int e){ for (int i=0; i < a.length; i++) { if (a[i] == e) {return true; return false; Schlechtester Fall: T w linsearch(n) = 6n + 4 Bester Fall: T b linsearch(n) = 6 Durchschnittlicher Fall: Wir nehmen an, dass das Element nach 1 bis n Schleifendurchläufen gefunden wird, und dass jeder dieser Fälle gleichwahrscheinlich ist. Laufzeit bei j Schleifendurchläufen: 6 j (für die Schleifendurchläufe) + 2 (für i = 0; und return true) - 2 (für letzten Schleifendurchlauf erfolgt kein i++) T a linsearch(n) = n j=1 6 j n (n + 1)n = 6 1 2 n = 3n + 3 D. Sabel 10 Komplexität WS 2018/19 12/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren

Größenordnung der Komplexität: Die O-Notation Eine exakte Beschreibung des Zeit- und Speicherplatzbedarfs wird schnell zu kompliziert, um praktikabel zu sein. Die Komplexität der Funktionen T w (n), T a (n), T b (n), S w (n), S a (n) und S b (n) wird häufig nur bis auf konstante Faktoren untersucht. Sei f : IN IN eine Funktion. Wir definieren O(f(n)) als die Klasse aller Funktionen, die nicht wesentlich schneller wachsen als f(n): Definition (O(f(n))) Eine Funktion g(n) ist in O(f(n)), falls es Zahlen c > 0 und n 0 gibt, so dass 0 g(n) c f(n) für alle n > n 0. D.h. die Funktion g(n) wächst höchstens so schnell wie f(n), abgesehen von einer linearen Skalierung von f(n). D. Sabel 10 Komplexität WS 2018/19 13/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren O-Notation: Beispiele Definition (O(f(n))) Eine Funktion g(n) ist in O(f(n)), falls es Zahlen c > 0 und n 0 gibt, so dass 0 g(n) c f(n) für alle n > n 0. Beispiele T w linsearch(n) ist in O(n), denn T w linsearch(n) = 6n + 4 und c = 7 und n 0 = 3 erfüllen die Definition: 0 TlinSearch(n) w = 6n + 4 6n + n = {{ 7 n =c n SlinSearch(n) w ist in O(1), denn für alle n > 3 {{ =n 0 S w linsearch(n) = 2 und c = 2 und n 0 = 1 erfüllen die Definition: 0 S w linsearch(n) = 2 2 1 {{ =c 1 für alle n > 1 {{ =n 0 D. Sabel 10 Komplexität WS 2018/19 14/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren O-Notation: Beispiele (2) Rechnen mit der O-Notation Definition (O(f(n))) Eine Funktion g(n) ist in O(f(n)), falls es Zahlen c > 0 und n 0 gibt, so dass 0 g(n) c f(n) für alle n > n 0. Beispiele g(n) = n 2 + 10n + 20 ist in O(n 2 ), denn mit c = 31 und n 0 = 1 : 0 n 2 + 10n + 20 n 2 + 10n 2 + 20n 2 = 31 n 2 {{ =c n g(n) = n 3 ist nicht in O(n 2 ): für alle n > 1 {{ =n 0 Es gibt kein c und n 0, die die Definition erfüllen, denn aus 0 n 3 c n 2 folgt n c und es gibt immer ein n, dass das verletzt! 1 Wenn g(n) in O(f(n)) ist, dann gilt für jede Konstante c g(n) + c in O(f(n)) und c g(n) ist in O(f(n)) 2 Wenn g 1 (n) und g 2 (n) jeweils in O(f(n)) sind, dann gilt auch: g 1 (n) + g 2 (n) ist in O(f(n)) 3 Sei g 1 (n) in O(f 1 (n)) und g 2 (n)ino(f 2 (n)). Dann gilt: h(n) = g 1 (n) + g 2 (n) ist in O(f 1 (n) + f 2 (n)) k(n) = g 1 (n) g 2 (n) ist in O(f 1 (n) f 2 (n)) 4 Sei f(n) in O(g(n)) und g(n) in O(h(n)). Dann ist f(n) in O(h(n)). 5 Sei g(n) = p k n k + p k 1 n k 1 +... + p 0 ein Polynom von Grad k. Dann ist g(n) in O(n k ) D. Sabel 10 Komplexität WS 2018/19 15/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren D. Sabel 10 Komplexität WS 2018/19 16/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren

Komplexitätsklassen Vergleich häufig auftretender Zeitkomplexitäten Man nennt eine Funktion f konstant falls f(n) O(1) logarithmisch falls f(n) O(log n) linear falls f(n) O(n) log-linear falls f(n) O(n log n) quadratisch falls f(n) O(n 2 ) kubisch falls f(n) O(n 3 ) polynomiell falls f(n) O(n k ) für ein k 0 exponentiell falls f(n) O(k n ) für ein k 2 Beachte: O(1) O(log n) O(n) O(n 2 ) O(n k ) O(k n ) für alle k 2 f(n) Bezeichnung f(10) f(100) f(1.000) f(10.000) 1 konstant 1sec 1sec 1sec 1sec log 2 n logarithmisch 3sec 7sec 10sec 13sec n linear 10sec 100sec 17min 2,8hours n log 2 n log-linear 33sec 11min 2,8hours 1,5 days n 2 quadratisch 100sec 2,7hours 11,5days 3,2years n 3 kubisch 17min 11,5days 31,7years 31.710years 2 n exponentiell 17min > als Alter des Universums unter der Annahme: 1 Operation kostet 1sec D. Sabel 10 Komplexität WS 2018/19 17/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren D. Sabel 10 Komplexität WS 2018/19 18/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren Exponentielle und polynomielle Komplexität Problem des Handelsreisenden (Traveling-Salesman-Problem) Gegeben sei ein Graph mit n Städten und den jeweiligen Entfernungen zwischen den Städten. Finde eine kürzeste Tour, so dass jede Stadt einmal besucht wird. S 1 7 10 2 S 3 S 2 12 8 18 17 2 S 7 3 5 6 S 4 7 2 4 S 5 S 6 Für dieses Problem sind nur deterministische Algorithmen mit exponentieller Zeitkomplexität bekannt. Bemerkungen zu TSP Für das Traveling-Salesman-Problem gibt es einen nichtdeterministischen polynomiellen (NP) Algorithmus ( man darf die richtige Lösung raten ) Das Traveling-Salesman-Problem ist NP-vollständig: Falls es einen polynomiellen Algorithmus zu seiner Lösung gibt, so hat jeder nichtdeterministisch-polynomielle Algorithmus eine polynomielle Lösung. Die Frage, ob ein NP-vollständiges Problem (und damit alle) in polynomieller Zeit (P) gelöst werden kann, ist eine der bekanntesten ungelösten Fragen der theoretischen Informatik P = NP Das P = NP ist eines der sieben sogenannten Millenium-Probleme D. Sabel 10 Komplexität WS 2018/19 19/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren D. Sabel 10 Komplexität WS 2018/19 20/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren

Binäre Suche in einem geordneten Array Sei a ein geordnetes Array mit den Grenzen j und k, d.h. a[i] < a[i+1] für i = j,..., k; also z.b.: a: 3 7 13 15 20 25 28 29 j j + 1 k Algorithmus: Um den Wert e in a zu suchen, teile das Array in der Mitte und vergleicht e mit dem Element a[mid] in der Mitte Ist e < a[mid], dann suche weiter im linken Teil a[j]...a[mid-1]. Ist e = a[mid], dann hat man das Element gefunden. Ist e > a[mid], dann suche weiter im rechten Teil a[mid+1]...a[k]. Binäre Suche in Java static boolean binarysearch ( int [] a, int e) { int j = 0; // linke Grenze int k = a. length - 1; // rechte Grenze boolean found = false ; // wurde e schon gefunden? // solange e nicht gefunden und Array nicht leer while (! found && j <= k) { int mid = j + ( k - j) /2; // Mitte des Arrays bzw. links davon if ( e < a[ mid ]) { // e kleiner als das mittlere? k = mid - 1; // ja, mache mit linkem Teil weiter. else { if ( e > a[ mid ]){ // e groesser als das mittlere? j = mid + 1; // ja, mache mit rechtem Teil weiter. else { // Sonst : gefunden found = true ; return found ; D. Sabel 10 Komplexität WS 2018/19 21/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren D. Sabel 10 Komplexität WS 2018/19 22/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren Wie oft wird die while-schleife maximal durchlaufen? Beispiel: In einem Array der Größe 16 braucht man maximal 5 Durchläufe. Größe des betrachteten Arrays 16 Ein Array der Länge n mit 2 i n < 2 i+1 benötigt man im schlechtesten Fall i + 1 Schleifendurchläufe Sei log 2 (n) der ganzzahlige Anteil des Logarithmus zur Basis 2 Es gilt 2 log 2 (n) n < 2 log 2 (n)+1 Daher braucht man im schlechtesten Fall log 2 (n) + 1 Durchläufe. D. Sabel 10 Komplexität WS 2018/19 23/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren 8 4 2 1 2 4 2 3 2 2 2 1 2 0 Worst-Case-Komplexitäten der Suchalgorithmen Laufzeitkomplexitäten T w binarysearch(n) ist in O(log(n)) T w linsearch(n) ist in O(n) Speicherplatzkomplexitäten S w binarysearch(n) ist in O(1) S w linsearch(n) ist in O(1) logarithmisch linear konstant konstant Beachte: Bei der Speicherplatzkomplexität zählen wir die Größe der Eingabe nicht mit. D. Sabel 10 Komplexität WS 2018/19 24/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren

Sortieren eines Arrays durch Einfügen (Insertion Sort) Sei int[] a das zu sortierende Array. Idee: Für alle i ab 1 bis zum Ende des Arrays: Seien die Elemente in a[0],..., a[i-1] schon sortiert Nehme das Element a[i] an i-ter Position und füge es an der richtigen Stelle ein, sodass die Folge a[0],..., a[i] sortiert ist. Beachte: Für das Einfügen an der richtigen Stelle, muss Platz geschaffen werden: Verschiebe die Elemente dafür nach rechts. Insertion Sort: Beispiel Am Anfang: Der erste Element ist immer schon sortiert: 5 33 12 13 8 1 Nächster Schritt: Füge 33 in den sortierten Bereich ein 5 33 12 13 8 1 Füge 12 in den sortierten Bereich ein: 33 muss verschoben werden 5 33 13 8 1 5 33 13 8 1 5 12 33 13 8 1 Füge 13 in den sortierten Bereich ein: 33 muss verschoben werden 5 12 33 8 1 5 12 33 8 1 5 12 13 33 8 1 D. Sabel 10 Komplexität WS 2018/19 25/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren D. Sabel 10 Komplexität WS 2018/19 26/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren Insertion Sort: Beispiel (2) Insertion Sort: Beispiel (3) Füge 8 in den sortierten Bereich ein: 12,13,33 müssen verschoben werden 5 12 13 33 1 5 12 13 33 1 5 12 13 33 1 5 12 13 33 1 1 Füge 1 in den sortierten Bereich ein: 5,8,12,13,33 müssen verschoben werden 1 D. Sabel 10 Komplexität WS 2018/19 27/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren D. Sabel 10 Komplexität WS 2018/19 28/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren

Insertion Sort in Java Komplexitäten des Insertion Sort public static void insertionsort ( int [] a) { for ( int i = 1; i < a. length ; i ++) { int toinsert = a[ i]; // einzufuegendes Element int j = i; while ( j > 0 && a[j -1] > toinsert ) { a[ j] = a[j -1]; // schiebe a[j -1] um 1 nach rechts j - -; a[ j] = toinsert ; // einfuege Position gefunden Sei n die Länge des Arrays Zeitkomplexität: Die äußere for-schleife wird in jedem Fall n 1 mal durchlaufen. Im i-ten Schritt wird die while-schleife höchstens i mal durchlaufen, was durch n nach oben abschätzt werden kann. Folglich ist die Zeitkomplexität des Insertion Sort in jedem Fall quadratisch, also in O(n 2 ). Platzbedarf: Neben der Eingabe werden 3 zusätzliche Speicherplätze für die lokalen Variablen gebraucht. Daher ist die Speicherplatzkomplexität in der Eingabe n, konstant, d.h. in O(1). D. Sabel 10 Komplexität WS 2018/19 29/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren D. Sabel 10 Komplexität WS 2018/19 30/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren Insertion Sort: Best- und Worst-Case Der beste Fall tritt ein, wenn die Eingabe bereits sortiert ist: Die while-schleife wird in diesem Fall nie durchlaufen Die best-case Laufzeit von Insertion Sort ist in O(n) Der schlechteste Fall tritt ein, wenn die Eingabe absteigend sortiert ist: Dann muss die while-schleife jeweils i mal durchlaufen werden. Wie schon festgestellt, ist die worst-case Laufzeit in O(n 2 ) Sortieren eines Arrays durch Vertauschen (Bubble Sort) Idee: Vertausche benachbarte Elemente, wenn sie nicht wie gewünscht geordnet sind. In jedem Durchlauf des Feldes steigt das relativ größte Element wie eine Blase (bubble) im Wasser auf. Algorithmus: Sei outer ein Zeiger auf das letzte Element des Arrays. Solange outer nicht auf das erste Element zeigt: Sei inner ein Zeiger auf das erste Element der Arrays. Solange inner < outer : Vertausche Elemente an den Positionen inner und inner+1, wenn sie in falscher Reihenfolge stehen. Rücke mit inner eine Position vorwärts. Rücke mit outer eine Position rückwärts. D. Sabel 10 Komplexität WS 2018/19 31/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren D. Sabel 10 Komplexität WS 2018/19 32/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren

Bubble Sort: Beispiel Bubble Sort in Java 5 33 12 13 8 1 5 12 13 8 1 33 5 12 8 1 13 33 5 8 1 12 13 33 5 1 8 12 13 33 1 Nach dem ersten Durchlauf ist das größte Element an der richtige Stelle Nach dem zweiten Durchlauf sind die beiden größten Elemente an der richtigen Stelle In jedem Durchlauf werden höchstens n Vertauschungen durchgeführt static void bubblesort ( int [] a){ for ( int outer = a. length - 1; outer > 0; outer - -) { for ( int inner = 0; inner < outer ; inner ++) { if ( a[ inner ] > a[ inner + 1]) { // tausche a[ inner ] und a[ inner + 1] int temp = a[ inner ]; a[ inner ] = a[ inner + 1]; a[ inner + 1] = temp ; D. Sabel 10 Komplexität WS 2018/19 33/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren D. Sabel 10 Komplexität WS 2018/19 34/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren Komplexitäten des Bubble Sort Sei n die Länge des Arrays Zeitkomplexität: Die äußere for-schleife wird in jedem Fall n + 1 mal durchlaufen. Im i-ten Schritt wird die innere for-schleife n i mal durchlaufen, was durch n nach oben abschätzt werden kann. Folglich ist die Zeitkomplexität des Bubble Sort in jedem Fall quadratisch, also in O(n 2 ). Beachte: Das ist auch die best-case Laufzeit von Bubble Sort! Platzbedarf: Neben der Eingabe werden 3 zusätzliche Speicherplätze für die lokalen Variablen gebraucht. Daher ist die Speicherplatzkomplexität in der Eingabe n, konstant, d.h. in O(1). D. Sabel 10 Komplexität WS 2018/19 35/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren Bubble Sort, optimiert Wenn in einem Durchlauf keine Vertauschungen mehr passieren, dann ist das Feld bereits sortiert, und wir können aufhören: static void bubblesortopt ( int [] a){ for ( int outer = a. length - 1; outer > 0; outer - -) { boolean notswapped = true ; for ( int inner = 0; inner < outer ; inner ++) { if ( a[ inner ] > a[ inner + 1]) { // tausche a[ inner ] und a[ inner + 1] notswapped = false ; int temp = a[ inner ]; a[ inner ] = a[ inner + 1]; a[ inner + 1] = temp ; if notswapped { return ; Beachte: Die Best-Case-Laufzeit verbessert sich dadurch von O(n 2 ) auf O(n), die Wort-Case-Laufzeit bleibt bei O(n 2 ). D. Sabel 10 Komplexität WS 2018/19 36/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren

Sortieren durch Auswählen: Selection-Sort Selection Sort: Beispiel 5 33 12 13 8 1 Idee: Sortiere das Array von links nach rechts. Suche stets das minimale Element im unsortierten Teil des Arrays Das gefundene minimale Element wird gewählt und mit dem ersten Element des unsortierten Teils vertauscht. Die Länge des unsortierten Teils wird um eins kürzer. 1 33 12 13 8 5 1 5 12 13 8 33 1 5 8 13 12 33 1 1 D. Sabel 10 Komplexität WS 2018/19 37/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren D. Sabel 10 Komplexität WS 2018/19 38/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren Selection Sort in Java Komplexität des Selection Sort static void selectionsort ( int [] a) { for ( int i = 0; i < a. length - 1; i ++) { int minindex = selectminindex (a, i); int tmp = a[ i]; // vertauschen a[ i] = a[ minindex ]; a[ minindex ] = tmp ; static int selectminindex ( int [] a, int ab) { int minindex = ab; for ( int i = ab + 1; i < a. length ; i ++) { if ( a[ i] < a[ minindex ]) { minindex = i; return minindex ; Sei n die Länge des Arrays Zeitkomplexität: Es wird in jedem Fall n mal das Minimum gesucht und an die richtige Stelle getauscht. Für jede Minimumsuche in der j-ten Runde wird ein Array der Größe n j durchsucht. Die Laufzeit hierfür kann mit n nach oben abgeschätzt werden. Folglich ist die Zeitkomplexität des Selection Sort in jedem Fall quadratisch, also in O(n 2 ). Beachte: Das ist auch die Best-Case Laufzeit! Platzbedarf: Neben der Eingabe werden nur konstant viele Speicherplätze benötigt. Daher ist die Speicherplatzkomplexität in der Eingabe n, konstant, d.h. in O(1). D. Sabel 10 Komplexität WS 2018/19 39/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren D. Sabel 10 Komplexität WS 2018/19 40/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren

Komplexitäten der drei Sortierverfahren Zusammenfassung Laufzeit Worst-Case Best-Case Platz Insertion Sort O(n 2 ) O(n) O(1) Bubble Sort O(n 2 ) O(n 2 ) O(1) Bubble Sort mit Optimierung O(n 2 ) O(n) O(1) Selection Sort O(n 2 ) O(n 2 ) O(1) Lineare Suche in beliebigen Folgen Binäre Suche in geordneten Folgen Sortieren von Arrays: Insertion Sort, Bubble Sort und Selection Sort Komplexitätsanalyse und O-Notation Laufzeit- und Speicherplatzkomplexität D. Sabel 10 Komplexität WS 2018/19 41/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren D. Sabel 10 Komplexität WS 2018/19 42/42 Komplexität Lin. Suche O-Notation Bin. Suche Sortieren