Algorithmen und Datenstrukturen Überblick
Algorithmen und Datenstrukturen Überblick
Algorithmen und Datenstrukturen Überblick
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<strong>Algorithmen</strong> <strong>und</strong><br />
<strong>Datenstrukturen</strong><br />
Dipl. Inform. Andreas Wilkens<br />
aw@awilkens.com<br />
<strong>Überblick</strong><br />
Gr<strong>und</strong>lagen<br />
Definitionen<br />
Eigene Entwicklungen<br />
<strong>Datenstrukturen</strong><br />
Elementare Datentypen<br />
Abstrakte Datentypen<br />
Elementare <strong>Datenstrukturen</strong><br />
<strong>Algorithmen</strong><br />
Rekursion<br />
Suchalgorithmen<br />
Sortieralgorithmen<br />
2<br />
1
<strong>Algorithmen</strong> <strong>und</strong><br />
<strong>Datenstrukturen</strong><br />
Kapitel 1<br />
Gr<strong>und</strong>lagen<br />
<strong>Algorithmen</strong> <strong>und</strong><br />
<strong>Datenstrukturen</strong><br />
Für diese Begriffe gibt es keine<br />
allgemein akzeptierten Definitionen.<br />
Verschiedene Personen (bzw.<br />
Lehrbücher) benutzen in der Praxis<br />
durchaus unterschiedliche Definitionen.<br />
4<br />
2
Definition Algorithmus<br />
Allgemein<br />
Unter einem Algorithmus versteht man<br />
allgemein eine mehr oder weniger genau<br />
definierte Handlungsvorschrift zur Lösung<br />
eines Problems oder einer bestimmten Art<br />
von Problemen.<br />
(Auch ein Kochrezept ist demnach ein<br />
Algorithmus)<br />
Definition Algorithmus<br />
Formaler<br />
Ein Algorithmus ist eine endliche Folge von<br />
Anweisungen, die in einer Maschine<br />
repräsentiert <strong>und</strong> schrittweise ausgeführt<br />
werden können.<br />
(Maschine muss nicht zwangsläufig Computer<br />
bedeuten.)<br />
5<br />
6<br />
3
Definition Algorithmus<br />
Im Rahmen dieser Vorlesung<br />
Ein Algorithmus ist ein in einer<br />
Programmiersprache angegebenes<br />
Computerprogramm, oder ein Teil davon<br />
(Funktion, Methode), welches eine<br />
bestimmte Aufgabe erfüllt.<br />
Eigenschaften von<br />
<strong>Algorithmen</strong><br />
Korrektheit<br />
Effizienz<br />
(Terminierung)<br />
7<br />
8<br />
4
Korrektheit<br />
Wichtigste Eigenschaft!<br />
Zeige, dass der Algorithmus die<br />
gestellte Aufgabe korrekt löst.<br />
Problem:<br />
Korrektheit läßt sich nicht durch Testen<br />
beweisen (Dijkstra)<br />
Korrektheit<br />
Edsger W. Dijkstra<br />
1930-2002<br />
Zitat aus 1969:<br />
Program Testing can be used very effectively<br />
to show the presence of bugs, but never to<br />
show the absence.<br />
zu deutsch:<br />
Durch Testen zeigt man die Anwesenheit von<br />
Fehlern, aber nicht deren Abwesenheit.<br />
http://www.cs.utexas.edu/users/EWD/<br />
9<br />
10<br />
5
Korrektheit<br />
Korrektheitsbeweise von <strong>Algorithmen</strong><br />
verlangen großen wissenschaftlichen<br />
Aufwand <strong>und</strong> stellen hohe formale<br />
Anforderungen.<br />
In der Software-Technik werden Verfahren<br />
definiert, mit deren Hilfe zielgerichtet nach<br />
Programmierfehlern gefahndet werden kann.<br />
Diese Form des Testens zeigt einen Großteil<br />
der Fehler auf, jedoch niemals alle.<br />
( nicht Bestandteil dieser Vorlesung)<br />
Korrektheit<br />
Im Rahmen dieser Vorlesung werden<br />
wir die Korrektheit der behandelten<br />
<strong>Algorithmen</strong> voraussetzen <strong>und</strong><br />
insbesondere deren Implementierung<br />
genauer analysieren.<br />
11<br />
12<br />
6
Effizienz<br />
Wieviel Speicherplatz wird benötigt?<br />
Wieviel Rechenzeit wird benötigt?<br />
Effizienz<br />
Die Angabe von konkreten Werten für<br />
Speicherplatz <strong>und</strong> Rechenzeit ist immer<br />
vom zu Gr<strong>und</strong>e liegenden System<br />
abhängig (Hardware, Betriebssystem,<br />
Programmiersprache, Compiler,...)<br />
Diese Werte verlieren ihre Aussagekraft,<br />
sobald sich das System ändert<br />
(z.B. neue Hardware, etc.)<br />
13<br />
14<br />
7
Effizienz<br />
In dieser Vorlesung wird die Effizienz<br />
deshalb in der Regel anders betrachtet:<br />
Laufzeit/Speicherplatzbedarf in<br />
Abhängigkeit<br />
der Problemgröße<br />
besonders charakterisierender Parameter<br />
Effizienz<br />
Laufzeit/Speicherplatzbedarf in<br />
Abhängigkeit der Problemgröße<br />
Wie verändert sich die Laufzeit, wenn die<br />
Problemgröße wächst?<br />
Beispiel<br />
Ein Sortieralgorithmus benötigt die Zeit t, um<br />
eine Anzahl von N Datensätzen zu sortieren.<br />
Wie ändert sich die Zeit, wenn doppelt so viele<br />
Datensätze (2*N) zu sortieren sind?<br />
15<br />
16<br />
8
Effizienz<br />
Laufzeit/Speicherplatzbedarf in<br />
Abhängigkeit besonders<br />
charakterisierender Parameter<br />
Beispiele<br />
Bei arithmetischen <strong>Algorithmen</strong> interessiert<br />
beispielsweise die Anzahl der ausgeführten<br />
Additionen <strong>und</strong> Multiplikationen.<br />
Bei Sortieralgorithmen interessiert die Anzahl<br />
der durchgeführten Vergleiche zwischen zwei<br />
Datensätzen <strong>und</strong> die Anzahl der durchgeführten<br />
Datensatzbewegungen.<br />
17<br />
Terminierung<br />
Terminieren bedeutet, dass der<br />
Algorithmus in endlicher Zeit beendet<br />
wird, d.h. seine Aufgabe in endlicher<br />
Zeit erfüllt.<br />
Dies ist keine zwingende Eigenschaft,<br />
da es durchaus Beispiele für<br />
<strong>Algorithmen</strong> gibt, die niemals<br />
terminieren sollen.<br />
18<br />
9
Terminierung<br />
Im Rahmen der in dieser Vorlesung<br />
betrachteten <strong>Algorithmen</strong> ist eine<br />
Terminierung in endlicher Zeit jedoch<br />
oftmals erforderlich (<strong>und</strong> sinnvoll).<br />
Ein Problem,<br />
mehrere <strong>Algorithmen</strong><br />
Für ein Problem kann es mehrere<br />
<strong>Algorithmen</strong> geben, die dieses Problem<br />
lösen.<br />
Ziel<br />
Finde den Algorithmus, der das Problem<br />
am besten löst.<br />
Finde den effizientesten Algorithmus.<br />
19<br />
20<br />
10
Effizientester Algorithmus<br />
benötigt möglichst wenig<br />
Speicherplatz<br />
Rechenzeit<br />
Effizientester Algorithmus<br />
Später sehen wir z.B.<br />
verschiedene Suchalgorithmen<br />
verschiedene Sortieralgorithmen<br />
Alle Such- bzw. Sortieralgorithmen lösen<br />
dasselbe Problem, sind aber<br />
unterschiedlich effizient.<br />
21<br />
22<br />
11
Effizientester Algorithmus<br />
Beispiel<br />
Programmierwettbewerb zum c‘t-Puzzle<br />
Aufgabe in c‘t 07/2003:<br />
Schreiben Sie ein Programm, das das c't-<br />
Puzzle löst!<br />
http://www.heise.de/ct/03/07/230/default.shtml<br />
c‘t Puzzle<br />
12 Einzelteile ergeben<br />
richtig zusammengesetzt<br />
einen Quader mit Aufdruck<br />
des Logos<br />
Gesucht ist der schnellste Algorithmus, der alle<br />
möglichen Lösungen zum Zusammensetzen<br />
des Puzzles ermittelt.<br />
23<br />
24<br />
12
c‘t Puzzle<br />
84 c‘t-Leser haben sich damals an dem<br />
Wettbewerb beteiligt <strong>und</strong> eine Lösung<br />
eingeschickt.<br />
schnellster Algorithmus benötigt 83 Sek.<br />
langsamster: mehrere St<strong>und</strong>en<br />
c‘t Puzzle<br />
Nach Wettbewerbsschluß wurde noch ein<br />
verbesserter Algorithmus entwickelt, der<br />
nur ca. 45 Sek<strong>und</strong>en benötigte.<br />
Insgesamt gibt es 409 963 verschiedene<br />
Möglichkeiten die 12 Teile zum Quader<br />
zusammen zu setzen (wenn man den<br />
Logo-Aufdruck ignoriert).<br />
Beschreibung mehrerer Lösungen in<br />
c‘t 14/2003<br />
25<br />
26<br />
13
Definition Datenstruktur<br />
Eine Datenstruktur ist eine<br />
Organisationsform für eine Menge von<br />
Daten.<br />
Einfluß der Datenstruktur<br />
Eine Datenstruktur hat erheblichen<br />
Einfluß auf die Effizienz, mit der sich<br />
bestimmte Operationen für die Daten<br />
ausführen lassen.<br />
Diese „Operationen“ werden von<br />
<strong>Algorithmen</strong> ausgeführt.<br />
Die gewählte Datenstruktur hat damit<br />
Einfluß auf die Effizienz des Algorithmus.<br />
27<br />
28<br />
14
Beispiel Datenstruktur<br />
Telefonbuch<br />
Wie ist die Datenstruktur eines<br />
Telefonbuchs aufgebaut?<br />
Welcher Algorithmus arbeitet mit dieser<br />
Datenstruktur besonders gut zusammen?<br />
(Was ist die Aufgabe dieses Algorithmus?)<br />
Wofür eignet sich diese Datenstruktur<br />
nicht?<br />
Definition<br />
Elementarer Datentyp<br />
Unter einem elementaren Datentypen<br />
versteht man die Datentypen, die direkt<br />
von der zu Gr<strong>und</strong>e liegenden<br />
Programmierprache zur Verfügung<br />
gestellt werden.<br />
29<br />
30<br />
15
Elementare Datentypen<br />
Java<br />
boolean<br />
char<br />
byte<br />
short<br />
int<br />
long<br />
float<br />
double<br />
Benutzerdefinierte<br />
<strong>Datenstrukturen</strong><br />
C++<br />
bool<br />
char<br />
short<br />
int<br />
long<br />
float<br />
double<br />
werden vom Programmierer selbst<br />
erstellt<br />
können elementare Datentypen<br />
<strong>und</strong>/oder andere <strong>Datenstrukturen</strong><br />
enthalten<br />
31<br />
32<br />
16
Benutzerdefinierte<br />
<strong>Datenstrukturen</strong><br />
Ein struct in C:<br />
struct Person {<br />
};<br />
char* firstName;<br />
char* lastName;<br />
int age;<br />
Benutzerdefinierte<br />
<strong>Datenstrukturen</strong><br />
Anwendung<br />
void main() {<br />
Person p;<br />
}<br />
p.firstName = „Hans";<br />
p.lastName = „Mustermann";<br />
p.age = 49;<br />
33<br />
34<br />
17
Benutzerdefinierte<br />
<strong>Datenstrukturen</strong><br />
siehe<br />
Person0.cpp<br />
sehr einfaches Beispielprogramm<br />
programmiertechnisch schlecht gelöst<br />
Daten <strong>und</strong> Operationen<br />
Zu Daten werden oftmals auch Operationen<br />
definiert, die auf diesen Daten möglich sind.<br />
siehe<br />
Person1.cpp<br />
sehr einfaches Beispielprogramm<br />
programmiertechnisch etwas besser<br />
35<br />
36<br />
18
Daten <strong>und</strong> Operationen<br />
Wenn nur noch die Operationen wichtig<br />
sein sollen <strong>und</strong> der interne Aufbau der<br />
Daten verborgen wird, so führt dies zu<br />
einem sogenannten abstrakten<br />
Datentypen.<br />
Abstrakter Datentyp<br />
Unter einem Abstrakten Datentypen<br />
versteht man eine Menge von Daten,<br />
auf die nur über definierte Operationen<br />
zugegriffen werden kann, bzw. die nur<br />
über definierte Operationen manipuliert<br />
werden können.<br />
37<br />
38<br />
19
Abstrakter Datentyp <strong>und</strong> OOP<br />
In der objektorientierten<br />
Programmierung wird das Prinzip des<br />
abstrakten Datentyps unterstützt.<br />
Eine Klasse enthält Daten (Attribute) <strong>und</strong><br />
Operationen (Methoden).<br />
Die Attribute werden i.d.R. als private<br />
deklariert, so dass ein direkter Zugriff<br />
darauf von außen nicht möglich ist.<br />
Zugriff dann nur über Methoden.<br />
Abstrakter Datentyp <strong>und</strong> OOP<br />
siehe<br />
Person2.h<br />
Person2.cpp<br />
sehr einfaches Beispielprogramm<br />
objektorientiert<br />
39<br />
40<br />
20
Elementare <strong>Datenstrukturen</strong><br />
Array<br />
Linked List<br />
Stack<br />
Queue<br />
Tree<br />
Werden im dritten Kapitel genauer betrachtet...<br />
41<br />
21