LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2) LS 2 / Informatik Organisatorisches Vorlesung DAP2 Dienstag 12-14 c.t. Donnerstag 14-16 c.t. Zu meiner Person Christian Sohler Fachgebiet: Komplexitätstheorie und effiziente Algorithmen Lehrstuhl 2, Informatik 2 LS 2 / Informatik Organisatorisches Übungen Montag: 14-16, 16-18 Dienstag: 10-12, 14-16, 16-18 Mittwoch: 12-14, 14-16, 16-18 Donnerstag: 12-14, 16-18 Zum Teil mehrere parallele Gruppen Anmeldung über AsSESS Beginn der Anmeldung: Dienstag im Laufe des Tages Anmeldeschluss: Donnerstag, 18 Uhr Änderungen der Übungsgruppe: Bis Montag 10 Uhr 3 LS 2 / Informatik Organisatorisches Übungen Präsenzübungen/ Heimübungen abwechselnd Abgabe Heimübung: Freitag 10 Uhr Briefkästen im Pav.6 Zulassung zur Klausur (Studienleistung Übung; Teil 1): - Teilnahme an den Übungen - 50% der Übungspunkte Max. 3 Personen pro Übungsblatt 4 LS 2 / Informatik Organisatorisches Übungen Praktikum Für Studierende des Bachelorstudiengangs verpflichtend Bachelor Elektrotechnik/Informationstechnik und Informations- und Kommunikationstechnik hat eigenes Praktikum Termine: Mittwoch 12-14, 14-16, 16-18 Donnerstag 8-10, 10-12, 12-14 Freitag 8-10, 10-12 Anmeldung über AsSESS (ab Dienstag; Anmeldeschluss Do. 18 Uhr; Änderungen bis Montag 10 Uhr) 5 LS 2 / Informatik Organisatorisches Übungen Praktikum Heimübungen, Präsenzübungen Zulassung zur Klausur (Studienleistung Praktikum): 8 von insgesamt 14 Punkten bei den 7 Präsenzaufgaben 7 von insgesamt 12 Punkten bei den 6 Heimaufgaben Anwesenheit bei den Übungen Sonstiges Schüler -> Tobias Marschall Poolräume können außerhalb der Veranstaltungszeiten immer genutzt werden Weitere Informationen auf der Webseite http://ls11-www.cs.uni-dortmund.de/teaching/dap2praktikum 6 LS 2 / Informatik Organisatorisches Tests 1. Test: 18. Mai 2. Test: mal schauen Einer der beiden Test muss mit 50% der Punkte bestanden werden (Studienleistung Übung; Teil 2) 7 LS 2 / Informatik Organisatorisches Bei Fragen Meine Sprechzeiten: Mo 14-15 Uhr oder nach der Vorlesung Organisatorische Fragen an Vorlesung: Melanie Schmidt ([email protected]) Christiane Lammersen ([email protected]) Praktikum: Tobias Marshall Außerdem INPUD Forum ([email protected]) 8 LS 2 / Informatik Organisatorisches Klausurtermine 10.8. 17-21 Uhr 21.9. 17-21 Uhr Weitere Infos Vorlesungsseite http://ls2-www.cs.tu-dortmund.de/lehre/sommer2010/dap2/ Oder von der Startseite des LS 2 -> Teaching -> DAP2 9 LS 2 / Informatik Einige Hinweise/Regeln Klausur Eine Korrelation mit den Übungsaufgaben ist zu erwarten Laptops Sind in der Vorlesung nicht zugelassen 10 LS 2 / Informatik Literatur Skripte Kein Vorlesungsskript Skripte der vergangenen Jahre Bücher Cormen, Leisserson, Rivest: Introduction to Algorithms, MIT Press Kleinberg, Tardos: Algorithm Design, Addison Wesley WWW Kurs „Introduction to Algorithms“ am MIT. Online Material (Folien, Video und Audio Files!) http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-ComputerScience/6-046JFall-2005/CourseHome/ 11 LS 2 / Informatik Was ist ein Algorithmus? Informale Definition Ein Algorithmus ist eine eindeutige Handlungsvorschrift zur Lösung von Instanzen eines Problems in endlich vielen Schritten. Bemerkung Es gibt viele Beschreibungen desselben Algorithmus Algorithmus ist unabhängig von der Programmiersprache!!! Die Definition wird im nächsten Semester formalisiert 12 LS 2 / Informatik Was ist ein Algorithmus? Beispiel Problem: Maximumsuche Instanz: Menge A={a1 ,…,an } von n Zahlen (als Feld A gegeben) Ausgabe: Index i der größten Zahl in A Algorithmus-Max-Search(Array A) 1. max 1 2. for j 2 to length(A) do 3. if A[j] > A[max] then max j 4. return max 13 LS 2 / Informatik Was ist eine Datenstruktur? Informale Definition Eine Datenstruktur ist eine Anordnung von Daten, die die Ausführung von Operationen (z.B. Suchen, Einfügen, Löschen) unterstützt. Einfache Beispiele Feld sortiertes Feld Liste 14 LS 2 / Informatik Lernziele Bewertung von Algorithmen und Datenstrukturen - Laufzeitanalyse - Speicherbedarf - Korrektheitsbeweise Kenntnis grundlegender Algorithmen und Datenstrukturen - Sortieren - Wörterbücher - Graphalgorithmen Kenntnis grundlegender Entwurfsmethoden - Teile und Herrsche - gierige Algorithmen - dynamische Programmierung 15 LS 2 / Informatik Motivation Beispiele für algorithmische Probleme Internetsuchmaschinen Berechnung von Bahnverbindungen Optimierung von Unternehmensabläufen Datenkompression Computer Spiele Datenanalyse Alle diese Bereiche sind (immer noch) Stoff aktueller Forschung im Bereich Datenstrukturen und Algorithmen 16 LS 2 / Informatik Motivation Problembeschreibung Ein m x n- Gitter heißt c-färbbar, wenn man seine Knoten mit c Farben so färben kann, dass kein am Gitter orientiertes achsenparalleles Rechteck alle Eckknoten in derselben Farbe hat Aufgabe: Finde eine 4-Färbung für ein 17x17 Gitter (289$ Problem) Beispiel: (4x4 Gitter) http://blog.computationalcomplexity.org/2009/11/17x17-challenge-worth28900-this-is-not.html 17 LS 2 / Informatik Motivation Problembeschreibung Ein m x n- Gitter heißt c-färbbar, wenn man seine Knoten mit c Farben so färben kann, dass kein am Gitter orientiertes achsenparalleles Rechteck alle Eckknoten in derselben Farbe hat Aufgabe: Finde eine 4-Färbung für ein 17x17 Gitter (289$ Problem) Beispiel: (4x4 Gitter) Die vier unterlegten Knoten dürfen z.B. nicht alle dieselbe Farbe haben http://blog.computationalcomplexity.org/2009/11/17x17-challenge-worth28900-this-is-not.html 18 LS 2 / Informatik Motivation Problembeschreibung Ein m x n- Gitter heißt c-färbbar, wenn man seine Knoten mit c Farben so färben kann, dass kein am Gitter orientiertes achsenparalleles Rechteck alle Eckknoten in derselben Farbe hat Aufgabe: Finde eine 4-Färbung für ein 17x17 Gitter (289$ Problem) Beispiel: (4x4 Gitter) http://blog.computationalcomplexity.org/2009/11/17x17-challenge-worth28900-this-is-not.html 4x4 Gitter ist 4-färbbar! Geht es besser? 19 LS 2 / Informatik Motivation Problembeschreibung Ein m x n- Gitter heißt c-färbbar, wenn man seine Knoten mit c Farben so färben kann, dass kein am Gitter orientiertes achsenparalleles Rechteck alle Eckknoten in derselben Farbe hat Aufgabe: Finde eine 4-Färbung für ein 17x17 Gitter (289$ Problem) Beispiel: (4x4 Gitter) http://blog.computationalcomplexity.org/2009/11/17x17-challenge-worth28900-this-is-not.html Ja! 4x4 Gitter ist 2färbbar! 20 LS 2 / Informatik Motivation 17x17 Problem Es ist z.Z. nicht möglich, das 17x17 Problem mit einem Rechner zu lösen Warum ist dieses Problem so schwer zu lösen? Es gibt sehr viele Färbungen! Fragen/Aufgaben Können wir die Laufzeit eines Algorithmus vorhersagen? Können wir bessere Algorithmen finden? 21 LS 2 / Informatik Algorithmenentwurf Anforderungen Korrektheit Effizienz (Laufzeit, Speicherplatz) Entwurf umfasst 1. 2. 3. Beschreibung des Algorithmus/der Datenstruktur Korrektheitsbeweis Analyse von Laufzeit und Speicherplatz 22 LS 2 / Informatik Algorithmenentwurf Warum mathematische Korrektheitsbeweise? Fehler können fatale Auswirkungen haben (Steuerungssoftware in Flugzeugen, Autos, AKWs) Fehler können selten auftreten („Austesten“ funktioniert nicht) Der teuerste algorithmische Fehler? Pentium bug (> $400 Mio.) Enormer Image Schaden Trat relativ selten auf 23 LS 2 / Informatik Algorithmenentwurf Warum Laufzeit/Speicherplatz optimieren? Riesige Datenmengen durch Vernetzung (Internet) Datenmengen wachsen schneller als Rechenleistung und Speicher Physikalische Grenzen Schlechte Algorithmen versagen häufig bereits bei kleinen und mittleren Eingabegrößen 24 LS 2 / Informatik 1. Teil der Vorlesung – Grundlagen der Algorithmenanalyse Inhalt Wie beschreibt man einen Algorithmus? Wie beweist man die Korrektheit eines Algorithmus? Rechenmodell Laufzeitanalyse 25 LS 2 / Informatik Pseudocode Beschreibungssprache ähnlich wie C, Java, Pascal, etc… Hauptunterschied: Wir benutzen immer die klarste und präziseste Beschreibung Manchmal kann auch ein vollständiger Satz die beste Beschreibung sein Wir ignorieren Software Engineering Aspekte wie - Modularität - Fehlerbehandlung 26 LS 2 / Informatik Sortieren Problem: Sortieren Eingabe: Folge von n Zahlen (a1 ,…,an ) Ausgabe: Permutation (a‘1 ,…,a‘n ) von (a1 ,…, a n ), so dass a‘1 a‘2 … a‘n Beispiel: Eingabe: 15, 7, 3, 18, 8, 4 Ausgabe: 3, 4, 7, 8, 15, 18 27 LS 2 / Informatik Insertion Sort InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibung des Algorithmus in Pseudocode (kein C, Java, etc.) 28 LS 2 / Informatik Insertion Sort InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibung des Algorithmus in Pseudocode (kein C, Java, etc.) Pseudocode • Schleifen (for, while, repeat) 29 LS 2 / Informatik Insertion Sort InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibung des Algorithmus in Pseudocode (kein C, Java, etc.) Pseudocode • Schleifen (for, while, repeat) 30 LS 2 / Informatik Insertion Sort InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibung des Algorithmus in Pseudocode (kein C, Java, etc.) Pseudocode • Zuweisungen durch 31 LS 2 / Informatik Insertion Sort InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibung des Algorithmus in Pseudocode (kein C, Java, etc.) Pseudocode • Variablen (z.B. i, j, key) sind lokal definiert 32 LS 2 / Informatik Insertion Sort InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibung des Algorithmus in Pseudocode (kein C, Java, etc.) Pseudocode • Keine Typdeklaration, wenn Typ klar aus dem Kontext 33 LS 2 / Informatik Insertion Sort InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibung des Algorithmus in Pseudocode (kein C, Java, etc.) Pseudocode • Zugriff auf Feldelemente mit [.] 34 LS 2 / Informatik Insertion Sort InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibung des Algorithmus in Pseudocode (kein C, Java, etc.) Pseudocode • • • Verbunddaten sind typischerweise als Objekte organisiert Ein Objekt besteht aus Attributen oder Ausprägungen Beispiel: Feld wird als Objekt mit Attribut Länge betrachtet 35 LS 2 / Informatik Insertion Sort InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibung des Algorithmus in Pseudocode (kein C, Java, etc.) Pseudocode • • Beispiel: Objekt ist Graph G mit Knotenmenge V Auf die Ausprägung V von Graph G wird mit V[G] zugegriffen 36 LS 2 / Informatik Insertion Sort InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibung des Algorithmus in Pseudocode (kein C, Java, etc.) Pseudocode • Objekte werden als Zeiger referenziert, d.h. für alle Ausprägungen f eines Objektes x bewirkt y x das gilt: f[y] = f[x]. 37 LS 2 / Informatik Insertion Sort InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibung des Algorithmus in Pseudocode (kein C, Java, etc.) Pseudocode • Blockstruktur durch Einrücken 38 LS 2 / Informatik Insertion Sort InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibung des Algorithmus in Pseudocode (kein C, Java, etc.) Pseudocode • Bedingte Verzweigungen (if then else) 39 LS 2 / Informatik Insertion Sort InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibung des Algorithmus in Pseudocode (kein C, Java, etc.) Pseudocode • • • Prozeduren „call-by-value“ ; jede aufgerufene Prozedur erhält neue Kopie der übergebenen Variable Die lokalen Änderungen sind nicht global sichtbar Bei Objekten wird nur der Zeiger kopiert (lokale Änderungen am Objekt global sichtbar) 40 LS 2 / Informatik Insertion Sort InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibung des Algorithmus in Pseudocode (kein C, Java, etc.) Pseudocode • Rückgabe von Parametern durch return 41 LS 2 / Informatik Insertion Sort InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibung des Algorithmus in Pseudocode (kein C, Java, etc.) Pseudocode Kommentare durch 42 LS 2 / Informatik Insertion Sort InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beispiel 8 15 3 14 7 6 18 19 43 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key 8 15 1 j 3 14 7 6 18 19 n 44 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key key 8 15 1 j 3 14 7 6 18 19 n 45 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key key 8 15 i j 3 14 7 6 18 19 n 46 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key key 8 15 i j 3 14 7 6 18 19 n 47 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key key 8 15 i j 3 14 7 6 18 19 n 48 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key 8 1 15 3 j 14 7 6 18 19 n 49 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key key 8 1 15 3 j 14 7 6 18 19 n 50 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key key=3 8 15 3 1 i j 14 7 6 18 19 n 51 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key key=3 8 15 3 1 i j 14 7 6 18 19 n 52 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key key=3 8 15 15 1 i j 14 7 6 18 19 n 53 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key key=3 8 i 15 15 j 14 7 6 18 19 n 54 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key key=3 8 i 15 15 j 14 7 6 18 19 n 55 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key key=3 8 i 8 15 j 14 7 6 18 19 n 56 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key key=3 8 i 1 8 15 j 14 7 6 18 19 n 57 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key key=3 8 i 1 8 15 j 14 7 6 18 19 n 58 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key key=3 3 i 1 8 15 j 14 7 6 18 19 n 59 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Sortiert 3 1 8 15 14 j 7 6 18 19 n 60 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Sortiert 3 1 8 key 15 14 j 7 6 18 19 n 61 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Sortiert 3 1 8 key=14 15 14 j 7 6 18 19 n 62 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Sortiert 3 1 8 verschiebe alle Elemente aus A[1…j-1], die größer als key sind eine Stelle nach rechts key=14 15 14 j-1 j 7 6 18 19 n 63 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Sortiert 3 1 8 verschiebe alle Elemente aus A[1…j-1], die größer als key sind eine Stelle nach rechts key=14 15 14 j-1 j 7 6 18 19 n 64 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key verschiebe alle Elemente aus A[1…j-1], die größer als key sind eine Stelle nach rechts key=14 3 8 15 15 1 i j-1 j 7 6 18 19 n 65 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key verschiebe alle Elemente aus A[1…j-1], die größer als key sind eine Stelle nach rechts key=14 3 8 15 15 1 i i+1 j 7 6 18 19 n 66 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key verschiebe alle Elemente aus A[1…j-1], die größer als key sind eine Stelle nach rechts Speichere key in Lücke key=14 3 8 14 15 1 i i+1 j 7 6 18 19 n 67 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key verschiebe alle Elemente aus A[1…j-1], die größer als key sind eine Stelle nach rechts Speichere key in Lücke Sortiert 3 1 8 14 15 7 j 6 18 19 n 68 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Sortiert 3 1 8 14 verschiebe alle Elemente aus A[1…j-1], die größer als key sind eine Stelle nach rechts Speichere key in Lücke key=7 15 7 j 6 18 19 n 69 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Sortiert 3 1 8 14 verschiebe alle Elemente aus A[1…j-1], die größer als key sind eine Stelle nach rechts Speichere key in Lücke key=7 15 7 j 6 18 19 n 70 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key verschiebe alle Elemente aus A[1…j-1], die größer als key sind eine Stelle nach rechts Speichere key in Lücke key=7 3 1 8 8 14 15 j 6 18 19 n 71 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key verschiebe alle Elemente aus A[1…j-1], die größer als key sind eine Stelle nach rechts Speichere key in Lücke key=7 3 1 8 8 14 15 j 6 18 19 n 72 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key verschiebe alle Elemente aus A[1…j-1], die größer als key sind eine Stelle nach rechts Speichere key in Lücke key=7 3 1 7 8 14 15 j 6 18 19 n 73 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key verschiebe alle Elemente aus A[1…j-1], die größer als key sind eine Stelle nach rechts Speichere key in Lücke Sortiert 3 1 7 8 14 15 6 j 18 19 n 74 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Sortiert 3 1 7 8 verschiebe alle Elemente aus A[1…j-1], die größer als key sind eine Stelle nach rechts Speichere key in Lücke key=6 14 15 6 j 18 19 n 75 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Sortiert 3 1 7 8 verschiebe alle Elemente aus A[1…j-1], die größer als key sind eine Stelle nach rechts Speichere key in Lücke key=6 14 15 6 j 18 19 n 76 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key verschiebe alle Elemente aus A[1…j-1], die größer als key sind eine Stelle nach rechts Speichere key in Lücke key=6 3 1 7 7 8 14 15 j 18 19 n 77 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key verschiebe alle Elemente aus A[1…j-1], die größer als key sind eine Stelle nach rechts Speichere key in Lücke key=6 3 1 7 7 8 14 15 j 18 19 n 78 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key verschiebe alle Elemente aus A[1…j-1], die größer als key sind eine Stelle nach rechts Speichere key in Lücke key=6 3 1 6 7 8 14 15 j 18 19 n 79 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key verschiebe alle Elemente aus A[1…j-1], die größer als key sind eine Stelle nach rechts Speichere key in Lücke Sortiert 3 1 6 7 8 14 15 18 19 j n 80 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key 3 1 6 7 8 14 verschiebe alle Elemente aus A[1…j-1], die größer als key sind eine Stelle nach rechts Speichere key in Lücke 15 18 19 j n 81 LS 2 / Informatik Insertion Sort Eingabegröße n length[A] = n InsertionSort(Array A) 1. for j 2 to length[A] do 2. key A[j] 3. i j-1 4. while i>0 and A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key verschiebe alle Elemente aus A[1…j-1], die größer als key sind eine Stelle nach rechts Speichere key in Lücke Sortiert 3 1 6 7 8 14 15 18 19 n 82 LS 2 / Informatik InsertionSort Wir haben beobachtet, dass Algorithmus InsertionSort korrekt sortiert Wie können wir zeigen, dass dies für jede Eingabe stimmt? -> Korrektheitsbeweise 83 LS 2 / Informatik Zusammenfassung Es gibt schwierige algorithmische Probleme, die bzgl. Laufzeit und Speicherbedarf optimierte Algorithmen benötigen Korrektheitsanalyse von Algorithmen ist notwendig Wir beschreiben Algorithmen in Pseudocode 84