20.09.2013 Aufrufe

Algorithmen und Datenstrukturen Überblick

Algorithmen und Datenstrukturen Überblick

Algorithmen und Datenstrukturen Überblick

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!