Datestrukture ud Algorithme Christia Sohler FG Algorithme & Komplexität
Orgaisatorisches Vorlesug: Mo 11:15-12:45 Fr 11:15-12:45 Zetralübug: Mo 13:00 13:45 Begi: Heute (2. Teil der Vorlesug) Übuge: Begi: Heute (Präsezübuge)
Orgaisatorisches Heimübuge: Alle 2 Woche ei Übugsblatt 1. Blatt Diestag ach Oster Keie Bouspukte Klausur: Eie Korrelatio mit de Übugsaufgabe ist zu erwarte Es gab i der Vergageheit eie direkte Zusammehag zwische Übugsteilahme/abgabe ud gutem Abscheide bei Klausure
Orgaisatorisches Sprechzeite: Mi 13:00 14:00 (Raum F1.209; Fürsteallee) Im Aschluß a die Vorlesug bzw. Zetralübug Orgaisatorische Frage a Christiae Lammerse; basilisk@upb.de Marcel Ackerma; mra@upb.de Weitere Iformatioe Webseite der Vorlesug FG Algorithme ud Komplexität Lehre
Was ist ei Algorithmus? Defiitio 1: Ei Algorithmus ist eie eideutige Hadlugsvorschrift zur Lösug vo Istaze eies Problems i edlich viele Schritte. Bemerkug: Es gibt viele Beschreibuge des selbe Algorithmus Die Defiitio wird i EBfS formalisiert
Was ist ei Algorithmus? Beispiel: Problem: Maximumsuche Istaz: Mege A={a,,a } vo Zahle 1 Ausgabe: Idex i der größte Zahl i A Algorithmus-Max-Search(Array A) 1. max 1 2. for j 2 to legth(a) do 3. if A[j] > A[max] the max j 4. retur max
Was ist eie Datestruktur? Defiitio 2: Eie Datestruktur ist eie Aordug vo Date, die die Ausführug vo Operatioe (z.b. Suche, Eifüge, Lösche) uterstützt. Eifache Beispiele: Feld sortiertes Feld Liste
Wozu beötige wir Datestrukture ud Algorithme? Beispiele: Iteretsuchmaschie Berechug vo Bahverbiduge Optimierug vo Uterehmesabläufe Datekompressio Computer Spiele Dateaalyse Alle diese Bereiche sid (immer och) Stoff aktueller Forschug im Bereich Datestrukture ud Algorithme!
Softwareetwicklug (algorithmische Sichtweise) Problem Modellierug Etwicklug vo Algorithmus/Datestruktur Implemetierug
Algorithmeetwurf Aforderuge: Korrektheit Effiziez (Laufzeit, Speicherplatz) Etwurf: 1. Beschreibug des Algorithmus/der Datestruktur 2. Korrektheitsbeweis 3. Aalyse vo Laufzeit ud Speicherplatz
Algorithmeetwurf Warum mathematische Korrektheitsbeweise? Fehler köe fatale Auswirkuge habe (Steuerugssoftware i Flugzeuge, Autos, AKWs) Fehler köe selte auftrete ( Austeste fuktioiert icht) Der teuerste algorithmische Fehler? Petium bug (> $400 Mio.) Eormer Image Schade Trat relativ selte auf
Algorithmeetwurf Warum Laufzeit/Speicherplatz optimiere? Riesige Datemege durch Veretzug (Iteret) Datemege wachse scheller als Recheleistug ud Speicher Physikalische Greze Schlechte Algorithme versage häufig bereits bei kleie ud mittlere Eigabegröße
Ziele der Vorlesug Methodisches Wisse: Selbstädige Etwicklug vo Datestrukture ud Algorithme Aalyse ud Bewertug mit Hilfe mathematischer Methode Faktewisse: Etwurfsmethode Grudlegede Datestrukture ud Algorithme Korrektheitsbeweise ud Effiziezaalyse
Arbeitsmaterial Bücher: Corme, Leisserso, Rivest: Itroductio to Algorithms, MIT Press Kleiberg, Tardos: Algorithm Desig, Addiso Wesley WWW: Kurs Itroductio to Algorithms am MIT. Olie Material (Folie, Video ud Audio Files!) Lik auf der Webseite der Vorlesug
Sortiere Problem: Sortiere Eigabe: Folge vo Zahle (a,,a ) Ausgabe: Permutatio (a,,a ), so dass a a a Beispiel: Eigabe: 15, 7, 3, 18, 8, 4 Ausgabe: 3, 4, 7, 8, 15, 18 1 1 1 2
IsertioSort(Array A) 1. for j 2 to legth(a) do 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibug des Algorithmus i Pseudocode (kei C, Java, etc.)
IsertioSort(Array A) 1. for j 2 to legth(a) do 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibug des Algorithmus i Pseudocode (kei C, Java, etc.) Pseudocode: Schleife (for, while, repeat)
IsertioSort(Array A) 1. for j 2 to legth(a) do 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibug des Algorithmus i Pseudocode (kei C, Java, etc.) Pseudocode: Schleife (for, while, repeat)
IsertioSort(Array A) 1. for j 2 to legth(a) do 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibug des Algorithmus i Pseudocode (kei C, Java, etc.) Pseudocode: Zuweisuge durch
IsertioSort(Array A) 1. for j 2 to legth(a) do 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibug des Algorithmus i Pseudocode (kei C, Java, etc.) Pseudocode: Variable (z.b. i,j, key) lokal defiiert
IsertioSort(Array A) 1. for j 2 to legth(a) do 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibug des Algorithmus i Pseudocode (kei C, Java, etc.) Pseudocode: Keie Typdeklaratio, we klar aus Kotext
IsertioSort(Array A) 1. for j 2 to legth(a) do 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibug des Algorithmus i Pseudocode (kei C, Java, etc.) Pseudocode: Zugriff auf Feldelemete mit [.]
IsertioSort(Array A) 1. for j 2 to legth(a) do 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibug des Algorithmus i Pseudocode (kei C, Java, etc.) Pseudocode: Zusammegesetzte Date als Objekte Grudlegede Attribute vorhade (z.b. legth[a])
IsertioSort(Array A) 1. for j 2 to legth(a) do 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibug des Algorithmus i Pseudocode (kei C, Java, etc.) Pseudocode: Bei Objektzuweisuge wird ur die Referez auf das Objekt kopiert
IsertioSort(Array A) 1. for j 2 to legth(a) do 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibug des Algorithmus i Pseudocode (kei C, Java, etc.) Pseudocode: Blockstruktur durch Eirücke (keie Klammerug)
IsertioSort(Array A) 1. for j 2 to legth(a) do 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibug des Algorithmus i Pseudocode (kei C, Java, etc.) Pseudocode: Blockstruktur durch Eirücke (keie Klammerug)
IsertioSort(Array A) 1. for j 2 to legth(a) do 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibug des Algorithmus i Pseudocode (kei C, Java, etc.) Pseudocode: Bedigte Verzweigug (if-the-else)
IsertioSort(Array A) 1. for j 2 to legth(a) do 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibug des Algorithmus i Pseudocode (kei C, Java, etc.) Pseudocode: Parameter werde bei Prozeduraufruf kopiert (sid also ur lokal sichtbar)
IsertioSort(Array A) 1. for j 2 to legth(a) do 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibug des Algorithmus i Pseudocode (kei C, Java, etc.) Pseudocode: Rückgabe vo Parameter durch retur
IsertioSort(Array A) 1. for j 2 to legth(a) do 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key Beschreibug des Algorithmus i Pseudocode (kei C, Java, etc.) Pseudocode: Kommetare durch
IsertioSort(Array A) 1. for j 2 to legth(a) do 3. i j-1 4. while i>0 ad 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
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 4. while i>0 ad 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
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key 1 Beispiel: 8 15 3 14 7 6 18 19
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key 1 j Beispiel: 8 15 3 14 7 6 18 19
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key 1 j Beispiel: 8 15 3 14 7 6 18 19 key
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key i j Beispiel: 8 15 3 14 7 6 18 19 key
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key i j Beispiel: 8 15 3 14 7 6 18 19 key
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key i j Beispiel: 8 15 3 14 7 6 18 19 key
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key 1 j Beispiel: 8 15 3 14 7 6 18 19
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key 1 j Beispiel: 8 15 3 14 7 6 18 19 key
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key 1 i j Beispiel: 8 15 3 14 7 6 18 19 key=3
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key 1 i j Beispiel: 8 15 3 14 7 6 18 19 key=3
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key 1 i j Beispiel: 8 15 15 14 7 6 18 19 key=3
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key i Beispiel: 8 15 15 14 7 6 18 19 j key=3
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key i Beispiel: 8 15 15 14 7 6 18 19 j key=3
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key i Beispiel: 8 8 15 14 7 6 18 19 j key=3
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key i 1 j Beispiel: 8 8 15 14 7 6 18 19 key=3
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key i 1 j Beispiel: 8 8 15 14 7 6 18 19 key=3
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key 1 j Beispiel: 3 8 15 14 7 6 18 19 key=3
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key 1 j Beispiel: 3 8 15 14 7 6 18 19 Sortiert
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key 1 j Beispiel: 3 8 15 14 7 6 18 19 Sortiert key
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 4. while i>0 ad A[i]>key do 5. A[i+1] A[i] 6. i i-1 7. A[i+1] key 1 j Beispiel: 3 8 15 14 7 6 18 19 Sortiert key=14
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 verschiebe alle 4. while i>0 ad A[i]>key do A[1,..,j-1], die größer als 5. A[i+1] A[i] key sid eie Stelle 6. i i-1 ach rechts 7. A[i+1] key 1 j-1 j Beispiel: 3 8 15 14 7 6 18 19 Sortiert key=14
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 verschiebe alle 4. while i>0 ad A[i]>key do A[1,..,j-1], die größer als 5. A[i+1] A[i] key sid eie Stelle 6. i i-1 ach rechts 7. A[i+1] key 1 j-1 j Beispiel: 3 8 15 14 7 6 18 19 Sortiert key=14
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 verschiebe alle 4. while i>0 ad A[i]>key do A[1,..,j-1], die größer als 5. A[i+1] A[i] key sid eie Stelle 6. i i-1 ach rechts 7. A[i+1] key 1 i j-1 j Beispiel: 3 8 15 15 7 6 18 19 Sortiert key=14
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 verschiebe alle 4. while i>0 ad A[i]>key do A[1,..,j-1], die größer als 5. A[i+1] A[i] key sid eie Stelle 6. i i-1 ach rechts 7. A[i+1] key 1 i i+1 j Beispiel: 3 8 15 15 7 6 18 19 key=14
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 verschiebe alle 4. while i>0 ad A[i]>key do A[1,..,j-1], die größer als 5. A[i+1] A[i] key sid eie Stelle 6. i i-1 ach rechts 7. A[i+1] key Speichere key i Lücke 1 i i+1 j Beispiel: 3 8 15 15 7 6 18 19 key=14
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 verschiebe alle 4. while i>0 ad A[i]>key do A[1,..,j-1], die größer als 5. A[i+1] A[i] key sid eie Stelle 6. i i-1 ach rechts 7. A[i+1] key Speichere key i Lücke 1 i i+1 j Beispiel: 3 8 14 15 7 6 18 19 key=14
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 verschiebe alle 4. while i>0 ad A[i]>key do A[1,..,j-1], die größer als 5. A[i+1] A[i] key sid eie Stelle 6. i i-1 ach rechts 7. A[i+1] key Speichere key i Lücke 1 j Beispiel: 3 8 14 15 7 6 18 19 Sortiert
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 verschiebe alle 4. while i>0 ad A[i]>key do A[1,..,j-1], die größer als 5. A[i+1] A[i] key sid eie Stelle 6. i i-1 ach rechts 7. A[i+1] key Speichere key i Lücke 1 j Beispiel: 3 8 14 15 7 6 18 19 Sortiert key=7
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 verschiebe alle 4. while i>0 ad A[i]>key do A[1,..,j-1], die größer als 5. A[i+1] A[i] key sid eie Stelle 6. i i-1 ach rechts 7. A[i+1] key Speichere key i Lücke 1 j Beispiel: 3 8 14 15 7 6 18 19 Sortiert key=7
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 verschiebe alle 4. while i>0 ad A[i]>key do A[1,..,j-1], die größer als 5. A[i+1] A[i] key sid eie Stelle 6. i i-1 ach rechts 7. A[i+1] key Speichere key i Lücke 1 j Beispiel: 3 8 8 14 15 6 18 19 key=7
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 verschiebe alle 4. while i>0 ad A[i]>key do A[1,..,j-1], die größer als 5. A[i+1] A[i] key sid eie Stelle 6. i i-1 ach rechts 7. A[i+1] key Speichere key i Lücke 1 j Beispiel: 3 8 8 14 15 6 18 19 key=7
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 verschiebe alle 4. while i>0 ad A[i]>key do A[1,..,j-1], die größer als 5. A[i+1] A[i] key sid eie Stelle 6. i i-1 ach rechts 7. A[i+1] key Speichere key i Lücke 1 j Beispiel: 3 7 8 14 15 6 18 19 key=7
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 verschiebe alle 4. while i>0 ad A[i]>key do A[1,..,j-1], die größer als 5. A[i+1] A[i] key sid eie Stelle 6. i i-1 ach rechts 7. A[i+1] key Speichere key i Lücke 1 j Beispiel: 3 7 8 14 15 6 18 19 Sortiert
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 verschiebe alle 4. while i>0 ad A[i]>key do A[1,..,j-1], die größer als 5. A[i+1] A[i] key sid eie Stelle 6. i i-1 ach rechts 7. A[i+1] key Speichere key i Lücke 1 j Beispiel: 3 7 8 14 15 6 18 19 Sortiert key=6
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 verschiebe alle 4. while i>0 ad A[i]>key do A[1,..,j-1], die größer als 5. A[i+1] A[i] key sid eie Stelle 6. i i-1 ach rechts 7. A[i+1] key Speichere key i Lücke 1 j Beispiel: 3 7 8 14 15 6 18 19 key=6
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 verschiebe alle 4. while i>0 ad A[i]>key do A[1,..,j-1], die größer als 5. A[i+1] A[i] key sid eie Stelle 6. i i-1 ach rechts 7. A[i+1] key Speichere key i Lücke 1 j Beispiel: 3 7 7 8 14 15 18 19 key=6
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 verschiebe alle 4. while i>0 ad A[i]>key do A[1,..,j-1], die größer als 5. A[i+1] A[i] key sid eie Stelle 6. i i-1 ach rechts 7. A[i+1] key Speichere key i Lücke 1 j Beispiel: 3 7 7 8 14 15 18 19 key=6
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 verschiebe alle 4. while i>0 ad A[i]>key do A[1,..,j-1], die größer als 5. A[i+1] A[i] key sid eie Stelle 6. i i-1 ach rechts 7. A[i+1] key Speichere key i Lücke 1 j Beispiel: 3 6 7 8 14 15 18 19 key=6
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 verschiebe alle 4. while i>0 ad A[i]>key do A[1,..,j-1], die größer als 5. A[i+1] A[i] key sid eie Stelle 6. i i-1 ach rechts 7. A[i+1] key Speichere key i Lücke 1 j Beispiel: 3 6 7 8 14 15 18 19 Sortiert
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 verschiebe alle 4. while i>0 ad A[i]>key do A[1,..,j-1], die größer als 5. A[i+1] A[i] key sid eie Stelle 6. i i-1 ach rechts 7. A[i+1] key Speichere key i Lücke 1 j Beispiel: 3 6 7 8 14 15 18 19
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 verschiebe alle 4. while i>0 ad A[i]>key do A[1,..,j-1], die größer als 5. A[i+1] A[i] key sid eie Stelle 6. i i-1 ach rechts 7. A[i+1] key Speichere key i Lücke 1 Beispiel: 3 6 7 8 14 15 18 19 Sortiert
IsertioSort(Array A) Eigabegröße 1. for j 2 to legth(a) do (legth(a)=) 3. i j-1 verschiebe alle 4. while i>0 ad A[i]>key do A[1,..,j-1], die größer als 5. A[i+1] A[i] key sid eie Stelle 6. i i-1 ach rechts 7. A[i+1] key Speichere key i Lücke 1 Beispiel: 3 6 7 8 14 15 18 19 Sortiert
Korrektheit Schleife-Ivariate Eigeschaft, die am Afag ud Ede jedes Schleifedurchlaufs erfüllt ist Beispiel: Ivariate der for-schleife vo IsertioSort: Feld A[1,..,j-1] ist aufsteiged sortiert Korrektheitsbeweis: 1 j 3 8 15 14 7 6 18 19 sortiert Iduktio über die Azahl der Schleifedurchläufe
Korrektheit Satz 1 Isertiosort sortiert eie Folge vo Zahle aufsteiged. Beweis: Wir zeige, dass die Schleifeivariate erfüllt ist Da die Schleife mit j=+1 termiiert, folgt aus der Ivariate die Korrektheit des Algorithmus Iduktiosafag (j=2): A[1] ist sortiert Iduktiosaahme(I.A.): Ivariate gilt für j=n
Korrektheit Iduktiosschritt (N N+1): Betrachte Durchlauf mit j=n Isertiosort merkt sich A[N] i Variable key Sei 1 k N-1 der größte Idex mit A[k]>key oder k=n, falls ei solcher icht existiert Der Algorithmus verschiebt A[k,..,N-1] ach A[k+1,..,N] Da wird A[k] auf de Wert key gesetzt Daach gilt: (1) A[1] A[2] A[k-1] ach I.A. (2) A[k-1] A[k] A[k+1] ach Ablauf des Algorithmus (3) A[k+1] A[k+2] A[N] ach I.A. Aus (1)-(3) folgt die Behauptug für N+1
Laufzeit Laufzeit hägt ab vo Größe der Eigabe (Parameter ) Art der Eigabe (Isertiosort ist scheller auf sortierte Eigabe) Aalyse: Parametrisiere Laufzeit als Fuktio der Eigabegröße Fide obere Schrake (Garatie) a die Laufzeit
Laufzeit Worst-Case Aalyse Für jedes defiiere Laufzeit T() = Maximum über alle Eigabe der Größe Garatie für jede Eigabe Stadard Average-Case Aalyse Für jedes defiiere Laufzeit T() = Durchschitt über alle Eigabe der Größe Hägt vo Defiitio des Durchschitts ab (wie sid die Eigabe verteilt)
Laufzeit Laufzeit hägt auch ab vo Hardware (Prozessor, Cache, Pipeliig) Software (Betriebssystem, Programmiersprache, Compiler) Aalyse: Soll uabhägig vo Hard- ud Software gelte
Laufzeit Maschiemodell: Eie Pseudocode-Istruktio braucht eie Zeitschritt Wird eie Istruktio r-mal aufgerufe, werde r Zeitschritte beötigt Formales Modell: Radom Access Machies (RAM Modell) Idee: Igoriere recherabhägige Kostate Betrachte Wachstum vo T() für Asymptotische Aalyse
Laufzeit IsertioSort(Array A) Zeit: 1. for j 2 to legth(a) do -1 3. i j-1-1 4. while i>0 ad A[i]>key do -1 + Σ t 5. A[i+1] A[i] Σ t 6. i i-1 Σ t 7. A[i+1] key -1 5-4 + 3 Σ t t : Azahl Wiederholuge der while-schleife i Rude j j j j j j
Laufzeit Worst-Case Aalyse: t =j-1 für absteiged sortierte Eigabe (schlechtester Fall) Abstraktio vo multiplikative Kostate Θ-Notatio = = + = + = j j j j T 1 2 3 7 5 3 4 5 ) ( 2 14 13 ² 3 2 1) ( 3 7 5 + = + + = j
Θ-Notatio Zur Erierug: Θ(g(x)) = {f(x): es gibt pos. Kostate c,d ud N, so dass 0 c g() f() d g() für alle N} Idee der Θ-Notatio: Lasse Terme iedriger Ordug weg Igoriere multiplikative Kostate Beispiel: 3 3 17 + 150 ² - 3 + 1000 = Θ( )
Laufzeit Satz 2: IsertioSort hat eie Laufzeit vo Θ(²). Beweis: (3²+13-14) /2 = Θ(²) Ist das schell? I Ordug für kleie bis mittlere Eigabe Es gibt viel bessere Methode für große Eigabe
Zusammefassug Algorithmeetwurf Beschreibug Pseudocode Korrektheitsbeweis Techik: Schleifeivariate, Iduktio Laufzeitaalyse Recheruabhägig Worst-Case Aalyse Wachstum für Igoriere vo Kostate; Θ-Notatio