Algorithmen und Datenstrukturen - Universität Kassel
Algorithmen und Datenstrukturen - Universität Kassel
Algorithmen und Datenstrukturen - Universität Kassel
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>Algorithmen</strong> <strong>und</strong> <strong>Datenstrukturen</strong><br />
Prof. Claudia Leopold<br />
FG Programmiersprachen/-methodik<br />
FB Elektrotechnik/Informatik<br />
<strong>Universität</strong> <strong>Kassel</strong><br />
leopold@uni-kassel.de<br />
Neubau WA, Zi. 0628, Sprechzeit: Di. 8.30 – 9.30 Uhr<br />
Webseite zur Vorlesung:<br />
http://www.se.e-technik.uni-kassel.de/se/index.php?id=528<br />
Inhalt (Entwurf)<br />
1) Einführung <strong>Algorithmen</strong><br />
¢Gr<strong>und</strong>begriffe, <strong>Algorithmen</strong>analyse<br />
2) Gr<strong>und</strong>legende <strong>Datenstrukturen</strong><br />
¢Gr<strong>und</strong>begriffe<br />
¢Listen, Stacks, Bäume<br />
3) Sortieren<br />
¢Mergesort, Quicksort, Heapsort<br />
¢untere Schranke<br />
4) Suchen<br />
¢Suchbäume, Prioritätswarteschlangen, Hashverfahren<br />
5) Graphalgorithmen<br />
¢Breiten- <strong>und</strong> Tiefensuche, kürzeste Wege<br />
AlgoDS - 1<br />
evtl. geometrische <strong>Algorithmen</strong>, heuristische <strong>Algorithmen</strong> (kombinatorische<br />
Optimierung)<br />
AlgoDS - 3<br />
Übungen<br />
14-tägiger Wechsel ’theoretische’ / praktische Übungen<br />
Beginn Woche vom 26.4.: theoretische Übungen in -1607<br />
Übungsaufgaben 14-tägig (meist Programmieraufgaben)<br />
Mo<br />
Di<br />
Mi<br />
Mi<br />
Do<br />
Do<br />
18 – 20<br />
18 – 20<br />
14 – 16<br />
16 – 18<br />
8 – 10<br />
12 – 14<br />
-1607 oder 1201<br />
-1607<br />
-1607 oder 1201<br />
-1607 oder 1201<br />
-1607 oder 1201<br />
-1607<br />
Leopold<br />
Leopold<br />
Knafla<br />
Knafla<br />
Knafla<br />
Knafla<br />
¡Betreuer praktische Übungen: Tobias Gunkel, Norman Thomas,<br />
Alexander Wirz<br />
voraussichtlich 14. September 10 Uhr<br />
¡ Klausur<br />
Literatur<br />
Thomas H. Cormen, Charles E. Leiserson: Introduction to<br />
Algorithms. MIT Press 2001.<br />
Thomas Ottmann, Peter Widmayer: <strong>Algorithmen</strong> <strong>und</strong><br />
<strong>Datenstrukturen</strong>. Spektrum Akademischer Verlag, 2002.<br />
Heinz-Peter Gumm, Manfred Sommer: Einführung in die<br />
Informatik. Oldenbourg Verlag, 2002, Kapitel 4.<br />
AlgoDS - 2<br />
Uwe Schöning: Algorithmik. Spektrum Akademischer Verlag, 2001.<br />
Robert Sedgewick: <strong>Algorithmen</strong> in C++. Addison-Wesley Longman,<br />
2002.<br />
oder andere<br />
AlgoDS - 4
1. <strong>Algorithmen</strong>begriff<br />
£Algorithmus = präzise formuliertes Verfahren zur<br />
schrittweisen Lösung eines Problems<br />
¡zulässig: Wahlmöglichkeiten, Parallelität<br />
¡Schritte müssen ausführbar sein<br />
¡Ausführung durch Mensch, Computer, mechanische Geräte u.a.<br />
¡Formulierung in natürlicher Sprache, Ablaufdiagramm,<br />
Programmiersprache u.a.<br />
Problem = Abbildung von Eingaben auf Ausgaben<br />
- z.B. Zucker, Mehl, Backpulver etc. -> Kuchen<br />
- Zahlen n, m -> ggT(n,m)<br />
¡Probleminstanz: konkrete Eingabe<br />
Programm = Formulierung eines Algorithmus in einer<br />
Programmiersprache<br />
Eigenschaften von <strong>Algorithmen</strong><br />
existieren unabhängig von Formulierung in Programmiersprache<br />
Beschreibung hat endliche Länge<br />
Ein Algorithmus heißt determiniert (deterministisch im Ergebnis) ,<br />
wenn er bei Mehrfachausführung mit gleichen Eingaben stets die<br />
gleiche Ausgabe liefert.<br />
Ein Algorithmus heißt deterministisch (deterministisch im Ablauf) ,<br />
wenn jeweils der nächste Schritt eindeutig bestimmt ist<br />
Ein Algorithmus heißt terminierend, wenn er zu jeder Eingabe<br />
nach endlich vielen Schritten ein Ergebnis liefert (anhält).<br />
Ein Algorithmus heißt sequentiell, wenn er die Schritte<br />
nacheinander ausführt.<br />
¦möglich: deterministisch <strong>und</strong> nicht determiniert (Schritt = Würfeln)<br />
¦möglich: nicht-deterministisch <strong>und</strong> determiniert (zwei Wege zu gleichem Ziel)<br />
AlgoDS - 5<br />
AlgoDS - 7<br />
Beispiel: Euklidischer Algorithmus<br />
Berechnung des größten gemeinsamen Teilers (ggT):<br />
Eingabe: a, b ¤<br />
Ausgabe: ggT(a, b)<br />
¥<br />
Algorithmus:<br />
Falls b=0, gib a aus<br />
Sonst wende Algorithmus auf (b, a mod b) an<br />
Programm (in C++):<br />
int ggT(int a, int b) {<br />
if (b==0) return a;<br />
else return ggT(b, a % b);<br />
}<br />
Bausteine von <strong>Algorithmen</strong><br />
Gr<strong>und</strong>operationen, z.B. Zuweisung, Addition, Aufruf bekannter<br />
Teilalgorithmen<br />
Kontrollstrukturen:<br />
- sequentielle Ausführung (Reihenfolge kausal bedingt oder willkürlich)<br />
- parallele Ausführung<br />
- bedingte Ausführung<br />
- wiederholte Ausführung<br />
- alternative Ausführung (willkürliche Auswahl)<br />
Eingaben, Ausgaben <strong>und</strong> Zwischenergebnisse werden in<br />
<strong>Datenstrukturen</strong> abgelegt<br />
AlgoDS - 6<br />
AlgoDS - 8
Korrektheit<br />
Test kann nur Anwesenheit, aber nicht Abwesenheit von Fehlern<br />
nachweisen<br />
Korrektheitsnachweis auf Programmebene: Verifikation über Vor-/<br />
Nachbedingungen<br />
Korrektheitsbeweis auf <strong>Algorithmen</strong>ebene am Beispiel ggT:<br />
Behauptung: ggT(a, b) = ggT(b, a mod b)<br />
Beweis: Zeigen { t | t teilt a <strong>und</strong> b } = { s | s teilt b <strong>und</strong> (a mod b) }:<br />
§) Sei a=xt <strong>und</strong> b=yt. Dann gibt es für r=(a mod b) ein z mit a=zb+r mit<br />
r
O-Notation<br />
Obere Schranke:<br />
O(g(n)) = { f(n) | c>0 n 0 >0 nn 0 : 0 <br />
f(n) c<br />
3n<br />
c f(n)<br />
(g(n))<br />
f(n) c<br />
Bsp. 3n 4 + 5n 3 + 7 log n = O(n 4 )<br />
denn: 3n 4 + 5n 3 + 7 log n <br />
Bedingung<br />
<br />
g(n) }<br />
4 + 5n 4 + 7n 4 = 15n 4 für n1<br />
gilt mit c = 15 <strong>und</strong> n 0 = 1<br />
Untere Schranke:<br />
(g(n)) = { f(n) | c>0 n0>0 nn0: 0 <br />
Genaue Schranke:<br />
(g(n)) = O(g(n)) <br />
Ergänzung:<br />
(g(n)) = { f(n) | c>0 n0>0 nn0: 0 <br />
g(n) <br />
<br />
}<br />
g(n) }<br />
2. <strong>Datenstrukturen</strong> – Begriff ADT<br />
Daten: Wahrheitswerte, Zahlen, Zeichenreihen, Bilder etc.<br />
- unterschiedlicher Speicherbedarf<br />
- unterschiedliche Operationen<br />
Typ<br />
unterschiedlicher<br />
AlgoDS - 13<br />
Abstrakter Datentyp (ADT): ein oder mehrere Mengen von Objekten<br />
<strong>und</strong> darauf definierte Operationen, z.B.:<br />
- natürliche Zahlen mit Addition, Subtraktion, Modulo<br />
- Menge aller Polynome mit Addition, Multiplikation<br />
- Mengen aller Knoten bzw. Kanten eines Graphen mit Einfügen/Löschen<br />
von Knoten/Kanten, Bestimmen kürzester Weg zwischen Knoten<br />
<strong>Algorithmen</strong> operieren über abstrakten Datentypen <strong>und</strong> nutzen deren<br />
Gr<strong>und</strong>operationen<br />
AlgoDS - 15<br />
Beispiel Euklidischer Algorithmus<br />
Betrachten Aufruffolge<br />
(a 0 , b 0 ) <br />
1 , b 1 ) <br />
(a(a mit a i+1 = b i <strong>und</strong> b i+1 = a i mod b i<br />
Beh.: b i > 2 b i+2<br />
k-1 , b k-1 ) (a k , b k ) = ggT(a 0 , b 0 )<br />
Beweis: Es gilt a i+1 = zb i+1 + b i+2 für ein z1. Außerdem gilt b i+2 2b . i i+1 i+2 i+2 <br />
b > 2 b > 4 b > 8 b > > <br />
0 2 4 6<br />
Für a, b < 2<br />
AlgoDS - 14<br />
n läßt sich zeigen: T(n) = O(n2 ) (Bitkomplexität)<br />
Für k ungerade (k gerade analog) folgt<br />
Es ergibt sich log b 0 > (k-1)/2, also k < 2 log b 0 + 1. Da der Aufwand pro<br />
Rekursionsstufe konstant ist, folgt T(a, b) = O(log b).<br />
Meist Angabe Komplexität in Abhängigkeit von Eingabegröße:<br />
b i b k-1 <br />
Begriff Datenstruktur<br />
Umsetzung ADT in Programmiersprache durch<br />
- elementaren Datentyp (boolean, int, float etc.) oder<br />
- Datenstruktur = Schema zur Abspeicherung der Daten eines<br />
ADT, das mit Mitteln einer<br />
Programmiersprache beschrieben wird<br />
für Operationen des ADT müssen <strong>Algorithmen</strong> angegeben werden<br />
Wahl der Datenstruktur richtet sich nach Art <strong>und</strong> Häufigkeit der<br />
auszuführenden Operationen<br />
wichtige <strong>Datenstrukturen</strong>: Arrays, Listen, Stacks, Bäume etc.<br />
- Beschränkung auf gr<strong>und</strong>legende Operationen für breiten Einsatz<br />
- häufig bereits in Programmiersprache oder Bibliotheken implementiert<br />
daneben existieren problemspezifische <strong>Datenstrukturen</strong><br />
AlgoDS - 16