Willkommen zur Vorlesung Algorithmen und Datenstrukturen
Zum Dozenten ●
Mein Name: Andreas Berndt
●
Diplom-Informatiker (TU Darmstadt)
●
●
Derzeit Software-Entwickler für WebApplikationen Derzeitige Sprachen: Java, PHP, Ruby
Organisatorisches ●
Übung 1: Mittwochs, 8:15 - 9:45 Uhr
●
Vorlesung: Mittwochs, 10:00 – 11:30 Uhr
●
Übung 2: Mittwochs, 11:45 – 13:15 Uhr
●
●
Beide Übungen in Gebäude 1, Raum 131, Vorlesung in Geb. 1, Raum 401 Web-Seite:http://www.informatik.fb2.fhfrankfurt.de/~aberndt/algorithmen
Lehrübersicht ●
Algorithmen: –
●
Beschreibungsformen von Algorithmen –
●
●
Definition eines Algorithmus und Anforderungen an ihn, semantische Korrektheit (natürliche Sprache, Pseudocode, Struktogramm, Datenflussdiagramm, Programmablaufplan)
Komplexitätsbetrachtungen, Berechenbarkeit: –
Platz- und Zeitkomplexität, asymptotische Notationen,
–
Komplexitätsmaße (worst case, average case), P-NPProblematik
Typen algorithmischer Vorgehensweisen –
(Rekursion, Greedy, Divide and Conquer, Backtracking ...)
Lehrübersicht ●
●
Datenstrukturen: –
elementare Datenstrukturen
–
lineare Standardstrukturen (Felder, Listen, Stapel, Warteschlangen)
–
Bäume
–
Mengen
–
Graphen
Algorithmen zu den Grundproblemen der Informatik: –
Sortieren
–
Hashing
–
Suchen
Der Algorithmus Grundlegendes
Der Algorithmus - Grundlegendes "Ein Algorithmus ist eine eindeutige, endliche Beschreibung eines allgemeinen, endlichen Verfahrens zur schrittweisen Ermittlung gesuchter Größen aus gegebenen Größen. Die Beschreibung erfolgt in einem Formalismus mit Hilfe von anderen Algorithmen und, letztlich, elementaren Algorithmen. Ein Algorithmus muß ausführbar sein." (Def. aus Balzert 99, S. 469/470)
Der Algorithmus - Grundlegendes ●
●
Beispiele für Algorithmen aus dem täglichen Leben... –
IKEA-Anleitung
–
Kochrezept
–
Spielregeln, z.B. Monopoly
–
Bedienungsanleitung
... und aus dem Schulwissen –
Primzahltestverfahren
–
Ermittlung des ggT
–
Bestimmung eines Schaltjahres
Der Algorithmus - Grundlegendes ●
Eigenschaften –
Determiniertheit: gleiche Startbedingungen führen zu gleichen Endergebnissen
–
Determinismus: zu jedem Zeitpunkt ist der nächste Schritt eindeutig definiert
–
Finitheit: statisch, endlicher Quelltext, dynamisch, begrenzt viel genutzter Speicher
–
Terminiertheit: Abbruch nach einer endlichen Anzahl von Schritten (keine Endlosschleife)
Der Algorithmus - Grundlegendes ●
Beispiele –
Determiniertheit ● ●
–
Ja: Algorithmus zur ggT-Berechnung Nein: Fraktalgeneratoren, z.B. Mandelbrotbäume, oder „Game of Life“-Algorithmen
Determinismus: ● ●
Ja: Sortierung nach Bubblesort Nein: Sortierung nach Quicksort mit zufälligem Pivot-Element,
Der Algorithmus - Grundlegendes ●
Beispiele –
Finitheit ●
●
–
Statisch: Jeder nicht sich selbst modifizierende Algorithmus Dynamisch: KI-Algorithmen, die sich selbst modifizieren (lernen, Bsp: Creatures)
Terminiertheit: ●
●
Ja: Alle Algorithmen, die nach endlicher Zeit abbrechen Nein: Endlosschleifen, gewollt bei z.B. Betriebssystemen, Spielen, allgemein bei Benutzer-interaktiven Algorithmen
Der Algorithmus - Grundlegendes ●
Analyse –
Eine der Hauptaufgaben der Informatik
–
Meist theoretisch ohne echte Programmiersprache
–
Abschätzung von Laufzeit und Platzverbrauch (Komplexitätstheorie)
–
Analyse der Terminierung (Berechenbarkeitstheorie)
Datenstrukturen Grundlegendes
Datenstrukturen - Grundlegendes ●
●
●
●
Mathematisches Objekt zur Speicherung von Daten Daten werden auf eine bestimmte Art und Weise verknüpft Dadurch bestimmte Zugriffsarten (z.B. durch Algorithmen) ermöglicht Datenstruktur definiert sich also aus beinhalteten Daten und Zugriffs- / Modifikationsoperationen
Datenstrukturen - Grundlegendes ●
●
Datenstrukturen bauen auf elementaren Datentypen auf Elementare Datentypen: –
Ganzzahlen (Z, N)
–
Festkommazahlen (Dezimalzahlen)
–
Gleitkommazahlen
–
Zeichen
–
Wahrheitswerte
Datenstrukturen - Grundlegendes ●
●
Elementare Datentypen in JAVA –
Ganzzahlen: INTEGER, LONG
–
Festkommazahlen: DECIMAL
–
Gleitkommazahlen: FLOAT
–
Zeichen: CHAR
–
Wahrheitswerte: BOOLEAN
Größe und Genauigkeit der el. Datentypen ist abhängig von System (z.B. 32 / 64 Bit) und Implementation in der jeweiligen Programmiersprache
Datenstrukturen - Grundlegendes ●
El. Datentypen können zu zusammengesetzten Datentypen kombiniert werden –
Feld (Array), je nach Sprache meist vom gleichen Datentyp
–
Zeichenkette (String), Aneinanderreihung von Zeichen, fest oder dynamisch
–
Verbund (Struct), Kombination verschiedener Datentypen unter einem Namen
Datenstrukturen - Grundlegendes ●
Abstrakter Datentyp (ADT) –
Oberbegriff aller Datenstrukturen
–
Erweitert die zusammengesetzten Datentypen um Operationen, die nur auf dem ADT arbeiten
–
Diese Operationen ermgöglichen z.B. seriellen oder wahlfreien Zugriff, Sortierung, Löschen, Einfügen ... abhängig von den im ADT verwendeten Datentypen
–
ADT ist auch die Grundlage für OjektOrientierung
Datenstrukturen - Grundlegendes ●
Beispiele für ADTs –
Liste ●
●
● ●
Einfach verkettet, Eintrag hält Verweis auf einen Nachfolger Doppelt verkettet, Eintrag hält Verweise auf Nachfolger und Vorgänger Erstes Element heisst Listenkopf Operationen – – – –
Suchen Einfügen Sortieren Löschen
Datenstrukturen - Grundlegendes ●
Beispiele für ADTs –
Bäume ● ●
Spezielle Graphen (mehr dazu später) Viele Spezialisierungen – – –
● ●
Binärbäume Balancierte Bäume AVL-Bäume
Haben eine „Wurzel“, der erste Eintrag im Baum Spezielle Version des BSP-Trees ermöglichte das Spiel „Doom“
Datenstrukturen – Die Realität unter der Abstraktion
Datenstrukturen – Die Realität unter der Abstraktion ●
●
●
●
Darstellung von Strukturen und Analyse der darauf laufenden Algorithmen läuft meist therotisch Datenstrukturen werden dabei abstrahiert dargestellt Alle modernen Programmiersprachen übernehmen die Übersetzung in die „Realität“ Dadurch werden Fehler verringert
Datenstrukturen – Die Realität unter der Abstraktion ●
Beispiel: Ein 10-Stelliger 16 Bit Speicher Stelle
Zahl
0
0100 0100 1001 0001
1
1001 1001 0110 1001
2
0010 1001 0010 1000
3
0000 0000 0000 0000
4
1111 1111 1111 1111
5
0101 1010 0101 1010
6
0000 1111 0000 1111
7
1111 0000 1111 0000
8
1010 1010 1010 1010
9
0001 0001 0001 0001
Datenstrukturen – Die Realität unter der Abstraktion ● ●
●
●
Die „Stelle“ = der Index des Speichers Wird natürlich auch als binär codierte Zahl dargestellt und kann somit selbst als Zahl im Speicher stehen Das System muss wissen, wie eine Zahl an einer Speicherstelle zu interpretieren ist Eine Zahl im Speicher, die als Adresse einer anderen Speicherstelle interpretiert wird, heisst Zeiger
Datenstrukturen – Die Realität unter der Abstraktion ●
●
Prinzipell gibt es für jede Zahl im Speicher einen Zeiger, nämlich eben die Speicherstelle Kombiniert man die Zeiger mit anderen Datentypen, so ergeben sich Datenstrukturen Datentyp Integer
struct list_node { int data; struct list_node *next; };
Zeiger auf anderen list_node
Stelle
Zahl
0
0100 0100 1001 0001
Integer data
1
0000 0000 0000 0010
Zeiger * next
2
0010 1001 0010 1000
Integer data
3
0000 0000 0000 0100
Zeiger * next
4
1111 1111 1111 1111
Integer data
5
0000 0000 0000 0110
Zeiger * next
6
0000 1111 0000 1111
Integer data
7
0000 0000 0000 1000
Zeiger * next
8
1010 1010 1010 1010
Integer data
9
0001 0001 0001 0001
Zeiger * next