do - TU Dortmund, Informatik 2

Werbung
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
Herunterladen