14.09.2013 Aufrufe

Algorithmen und Datenstrukturen - Universität Kassel

Algorithmen und Datenstrukturen - Universität Kassel

Algorithmen und Datenstrukturen - Universität Kassel

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!