Algorithmen I

Algorithmen I
Dennis Hofheinz und Henning Meyerhenke
Übungen:
Christian Staudt und Christoph Striecks
Institut für theoretische Informatik
Web:
https://crypto.iti.kit.edu/algo-sose15
(Folien von Peter Sanders)
1
Organisatorisches
Vorlesungen:
Mo: 15:4517:15
Mi: 14:0014:45
Saalübung:
Mi: 14:4515:30
Tutorium: wöchentlich, ab nächster Woche
Einteilung mittels Webinscribe
https://webinscribe.ira.uka.de/
Übungsblätter: wöchentlich
Ausgabe Mittwoch nach der Vorlesung/Übung
Abgabe Freitag 12:45 Uhr (9 Tage nach Ausgabe)
2
Organisatorisches
Sprechstunde (DH): Donnerstag, 10.3011.30 Uhr
(jederzeit bei oener Tür oder nach Vereinbarung)
I Dennis Hofheinz, Raum 279
Sprechstunde (HM):
ab 18. Mai: Montag, 13.0014.00 Uhr
(oder nach Vereinbarung)
I Henning Meyerhenke, Raum 033
3
Organisatorisches
Mittsemesterklausur: zur Kontrolle
Abschlussklausur:
28.09.2015, 100% der Note
nächste Versuchsmöglichkeit: nach dem WS 15/16
4
Materialien
I Folien, Übungsblätter
I Diskussionsforum: Link siehe Homepage
I Buch:
K. Mehlhorn, P. Sanders
Algorithms and Data Structures The Basic Toolbox
vorl. Version der dt. Übersetzung online
I Taschenbuch der Algorithmen
Springer 2008 (Unterhaltung / Motivation)
5
Weitere Bücher
I Algorithmen - Eine Einführung von Thomas H. Cormen, Charles E.
Leiserson, Ronald L. Rivest, und Cliord Stein von Oldenbourg
I Algorithmen und Datenstrukturen von Thomas Ottmann und
Peter Widmayer von Spektrum Akademischer Verlag
I Algorithmen kurz gefasst von Uwe Schöning von Spektrum Akad.
Vlg., Hdg.
6
Algorithmus? Kann man das essen?
Pseudogriechische Verballhornung eines Namens,
der sich aus einer Landschaftsbezeichnung ableitet:
Al-Khwarizmi war persischer/usbekischer
Wissenschaftler (aus Khorasan) aber lebte in
Bagdad
≈ 780..840.
Machtzentrum des arabischen Kalifats
auf seinem Höhepunkt.
Er hat ein Rechenlehrbuch geschrieben.
Algorithmus wurde zum Synonym für Rechenvorschrift.
Unter einem Algorithmus versteht man eine genau denierte
Handlungsvorschrift zur Lösung eines Problems oder einer bestimmten
Art von Problemen in endlich vielen Schritten.
7
Algorithmik
Kerngebiet der (theoretischen) Informatik
mit direktem Anwendungsbezug
Algorithmik
effiziente
Soft− u. Hardware
Logik
korrekte
praktische
theoretische
Informatik
8
Datenstruktur
Ein Algorithmus bearbeitet Daten.
Wenn ein Teil dieser Daten eine (interessante) Struktur haben, nennen
wir das Datenstruktur.
Immer wiederkehrende Datenstrukturen und dazugehörige
Algorithmenteile
wichtige Grundwerkzeuge (Basic Toolbox)
5 17
2 3
2
3
7 11 13
5
7
11
13
19
17
19
00
9
Themenauswahl: Werkzeugkasten
Immer wieder benötigte
I Datenstrukturen
I Algorithmen
I Entwurfstechniken
I Analysetechniken
neue Algorithmen
Leistungsgarantien, objektiver
Algorithmenvergleich
Jeder Informatiker braucht das
Pichtvorlesung
10
Inhaltsübersicht
1. Amuse Geule
2. Einführung
Appetithäppchen
der Werkzeugkasten für den Werkzeugkasten
3. Folgen, Felder, Listen
4. Hashing
5. Sortieren
Mütter und Väter aller Datenstrukturen
Chaos als Ordnungsprinzip
Ezienz durch Ordnung
6. Prioritätslisten
immer die Übersicht behalten
7. Sortierte Liste
die eierlegende Wollmilchsau
8. Graphrepräsentation
9. Graphtraversierung
10. Kürzeste Wege
11. Minimale Spannbäume
12. Optimierung
Beziehungen im Gri haben
globalen Dingen auf der Spur
schnellstens zum Ziel
immer gut verbunden
noch mehr Entwurfsmethoden
11
Amuse Geule
Beispiel: Langzahl-Multiplikation
Schreibe Zahlen als Ziernfolgen
a = (an−1 . . . a0 ), ai ∈ 0..B − 1.
Wir zählen
(c 0 , s ):= ai +bj +c
Beispiel (B = 10): 9 + 9 + 1 = (1, 9)
Volladditionen:
(p 0 , p ):= ai ·bj
(B = 10): 9 · 9 = (8, 1)
Ziernmultiplikationen:
Beispiel
12
Addition
// carry / Überlauf
c =0 : Digit
for i := 0 to n − 1 do (c , si ):= ai + bi + c
sn := c
a
b
0 c
s
n
Satz: Addition von
n-Ziern-Zahlen
0
braucht
n
Ziern-Additionen.
13
Beispiel
// carry / Überlauf
c =0 : Digit
for i := 0 to n − 1 do (c , si ):= ai + bi + c
sn := c
4 5
6
a
7 8
2
b
1
1 0
1
2 3
c
8
s
14
Exkurs: Pseudocode
I Kein C/C++/Java
I Eher Pascal
Zuweisung:
+
Mathe
Menschenlesbarkeit vor Maschinenlesbarkeit
−
begin/end
Einrückung trägt Bedeutung
:=
Kommentar: //
Ausdrücke: volle Mathepower
{i ≥ 2 : ¬∃a, b ≥ 2 : i = ab}
c =0 : Digit
(c , si ):= ai + bi + c
Deklarationen:
Tupel:
Schleifen:
for , while , repeat . . . until ,. . .
uvam: Buch Abschnitt 2.3, hier: just in time und on demand
if
, Datentypen, Klassen, Speicherverwaltung
15
Exkurs vom Exkurs: Wieso nicht C++/Java-like?
I Klare Unterscheidung von Programmcode
I viele redundante
()[];
for ist sehr low level
== ist unschön während :=
I C
I
für Zuweisung klarer ist
I C Logik/Bitoperatoren sind kryptischer als
∧
etc.
I Wir verwendenen C++/Java-Notation wo dies sinnvoll ist
// + + −, − + = − =
I Mathenotation ist oft mächtiger
16
Ziernmultiplikation
Function
a : Array [0..n − 1] of
numberTimesDigit(
Digit,
b : Digit)
low(ab)
high(ab)
0
c
result
n
0
17
Beispiel
numberTimesDigit(256, 4)
8
0
4
0
2
2
high(ab)
1
0
0
c
1
0
2
4
low(ab)
result
18
Ziernmultiplikation
Function
a : Array [0..n − 1] of Digit, b : Digit)
: Array [0..n] of Digit
c =0 : Digit
// carry / Überlauf
(h0 , `):= a[0] · b
// Ziffernmultiplikation
result[0]:= `
for i := 1 to n − 1 do
// n − 1 Iterationen
(h, `):= a[i ] · b
// Ziffernmultiplikation
(c , result[i ]):= c + h0 + `
// Ziffernaddition
h0 := h
0
result[n ]:= c + h
// Ziffernaddition, kein Überlauf ?!
numberTimesDigit(
result
return
result
n − 1) = n
Analyse: 1 + (
Multiplikationen,
(n − 1) + 1 = n
Additionen
19
Schulmultiplikation
// Langzahl
p =0 : N
for j := 0 to n − 1 do
// Langzahladdition, Langzahl mal Ziffer, Schieben:
p := p + a · b[j ]·B j
2n−1
n
0
b
a
0
aB
2
aB
aBn−1
n−1
p
n
20
Schulmultiplikation Beispiel
// Langzahl
p =0 : N
for j := 0 to n − 1 do
// Langzahladdition, Langzahl mal Ziffer, Schieben:
p := p + a · b[j ]·B j
32*64
1
1
9
2
2
8 a
aB
2
0
4
8
b
4
6
p
21
Schulmultiplikation Analyse
p =0 : N
for j := 0 to n − 1 do
p := p
+
a · b [j ]
·B j
// n + j Ziffern (außer bei j = 0)
// n + 1 Ziffernadditionen (optimiert)
// je n Additionen/Multiplikationen
// schieben (keine Ziffernarithmetik)
Insgesamt:
n2 Multiplikationen
n2 + (n − 1)(n + 1) = 2n2 − 1 Additionen
2
2
3n − 1 ≤ 3n Ziernoperationen
22
Exkurs O-Kalkül, die Erste
O(f (n)) = {g (n) : ∃c > 0 : ∃n0 ∈ N+ : ∀n ≥ n0 : g (n) ≤ c · f (n)}
Idee: Konstante Faktoren (und Anfangsstück) ausblenden
+
Operationen zählen
+
Rechnungen vereinfachen
+
Interpretation vereinfachen
?
Laufzeit
welche Ops.?
Werfen wir zuviel Information weg
Beispiel: Schulmultiplikation braucht Zeit
?
O
n2
23
Ergebnisüberprüfung
später an Beispielen
24
Ein rekursiver Algorithmus
Function recMult(a, b)
assert a und b haben n Ziern, sei k = dn/2e
if n = 1 then return a · b
Schreibe
Schreibe
return
a als a1 · B k + a0
b als b1 · B k + b0
a b B 2k +
(recMult(a0 , b1 )+recMult(a1 , b0 )) · B k +
recMult(a0 , b0 )
recMult( 1 , 1 ) ·
25
Beispiel
10 01
·
19 84
=
10 · 19 · 10000+
(10 · 84 + 1 · 19) · 100+
1 · 84 =
1985984
26
Analyse
Function recMult(a, b)
assert a und b haben n Ziern, sei k = dn/2e
if n = 1 then return a · b
Schreibe
Schreibe
return
a als
b als
a1 · B k + a0
b · Bk + b
1
0
// T (n) Ops
// 1 Op
// 0 Ops
// 0 Ops
a b B 2k +
// T (n/2) + 2n Ops
(recMult(a0 , b1 )+recMult(a1 , b0 ))B k + // 2T (n/2) + 2n Ops
recMult(a0 , b0 )
// T (n/2) + 2n Ops
recMult( 1 , 1 ) ·
Also
T (n) ≤ 4T (n/2) + 6n
Übung: Wo kann man hier
≈ 2n
Ops sparen?
27
Analyse
(
T (n) ≤
−→
1
4·
if
T (dn/2e) + 6 · n
if
n = 1,
n ≥ 2.
(Master-Theorem, stay tuned)
log2 4
T (n) ∈ Θ n
⊆O
n2
Aufgabe:
Zeigen Sie durch vollständige Induktion, dass
T (n ) ≤ 7 n 2 − 6 n
, falls n eine Zweierpotenz
ist
28
Exkurs: Algorithmen-Entwurfsmuster
Im Buch: siehe auch Index!
Schleife: z. B. Addition
Unterprogramm: z. B. Ziernmultiplikation, Addition
Teile und Herrsche: (lat. divide et impera, engl. divide and conquer)
Aufteilen in eins oder mehrere, kleinere Teilprobleme,
oft rekursiv
Es kommen noch mehr: greedy, dynamische Programmierung,
Metaheuristiken, Randomisierung,. . .
29
Karatsuba-Ofman Multiplikation[1962]
Beobachtung:
(a1 + a0 )(b1 + b0 ) = a1 b1 + a0 b0 + a1 b0 + a0 b1
Function recMult(a, b)
assert a und b haben n = 2k
if n = 1 then return a · b
Ziern,
n
ist Zweierpotenz
a als a1 · B k + a0
k
Schreibe b als b1 · B + b0
c11 := recMult(a1 , b1 )
c00 := recMult(a0 , b0 )
Schreibe
return
c11 · B 2k +
(recMult((a1 + a0 ), (b1 + b0 )) − c11 − c00 )B k
+c00
30
Beispiel
10 01
·
19 84
=
10 · 19 · 10000+
((10 + 1) · (19 + 84) − 10 · 19 − 1 · 84) · 100+
1 · 84 =
1985984
31
Analyse
(
T (n) ≤
−→
1
3·
if
T (dn/2e) + 10 · n
if
n = 1,
n ≥ 2.
(Master-Theorem)
T (n) = Θ n
log2 3
≈Θ
n1.58
32