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