Inhalt der Vorlesung 1 Daten 2 Algorithmen 3 - BFH

Werbung
Inhalt der Vorlesung
Daten
Pierre Fierz
Einleitung
Datentypen
Abgeleitete Typen
1
Daten
2
Algorithmen
3
Sortieralgorithmen
4
Suchalgorithmen
5
Graphen
6
Verarbeitung von Strings
7
Typen von Algorithmen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
1.1
Literatur
Daten
Pierre Fierz
Einleitung
Datentypen
Abgeleitete Typen
• M.T. Goodrich and R. Tamassia. Algorithm Design. John
Wiley & Sons,Inc., New York, 2002. ISBN 0-471-38365-1.
• Aho, Hopcroft, and Ullman. The Design and Analysis of
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
Computer Algorithms. Addison Wesley, Reading,
Massachusetts, 1974. ISBN 0-201-00029-6.
• Robert Sedgewick. Algorithms in Java. Addison Wesley,
2002. ISBN 978-0-2013-6120-9.7
1.2
Bewertung
Daten
Pierre Fierz
Einleitung
Datentypen
Abgeleitete Typen
• Prüfung während des Semesters
Dauer:
90 Minuten
Hilfsmittel: Skript, Slides und eigene Notizen
Gewicht:
25%
• Schlussprüfung
Dauer:
150 Minuten
Hilfsmittel: Skript, Slides und eigene Notizen
Gewicht:
75%
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
1.3
Daten
Pierre Fierz
Chapter 1
Einleitung
Daten
Datentypen
Abgeleitete Typen
Lecture Algorithmen & Datenstrukturen
29.08.2011
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
Pierre Fierz
Berner Fachhochschule
Technik und Informatik
1.4
Contents
Daten
Pierre Fierz
Einleitung
1 Einleitung
Datentypen
Abgeleitete Typen
2 Datentypen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
3 Abgeleitete Typen
4 Weitere Datenstrukturen
5 Der Abstrakte Datentyp (ADT)
1.5
Outline
Daten
Pierre Fierz
Einleitung
1 Einleitung
Datentypen
Abgeleitete Typen
2 Datentypen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
3 Abgeleitete Typen
4 Weitere Datenstrukturen
5 Der Abstrakte Datentyp (ADT)
1.6
Einleitung
Daten
Pierre Fierz
• Der Digital-Computer wurde entwickelt, um komplexe und
aufwendige Berechnungen durchzuführen.
• Daher ist die Darstellung von Zahlen ideal.
• Berechnungen werden direkt von der Hardware
ausgeführt.
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• Bei vielen Applikationen steht aber das speichern von
Daten im Vordergrund.
• Wichtige Aufgabe der Informatik ist die Darstellung der
Daten
• Die Daten stellen eine Abstraktion der reallen Welt dar.
• Die Darstellung hängt von der Verwendung der Daten ab.
1.7
Daten
Einleitung 2
Pierre Fierz
Beispiel: Verschiedene Personendaten
Einleitung
Datentypen
• Als Beispiel vergleichen wir die Personaldaten in einer
Arbeitgeberkartei und in einer Arztkartei.
Aufbau der Arbeitgeberkartei
Name
Adresse
Funktion
Gehalt
Lohnentwicklung
usw.
Aufbau der Arztkartei
Name
Adresse
Grösse
Gewicht
Krankengeschichte
usw.
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• Unwichtige Daten werden weggelassen
• Das Objekt “Person” wird abstrahiert.
1.8
Daten
Einleitung 3
Pierre Fierz
• Bei der Abbildung der Welt in ein Datenmodell sind zwei
Aspekte wichtig:
Einleitung
Datentypen
Abgeleitete Typen
Abstraktion
• Wichtige Daten eines Objekts identifizieren
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• Für die Applikation unwesentliche Daten weglassen
• Abstraktion = Vereinfachung
Darstellung
• Wahl der Darstellung eines Objektes im Computer
• Schwierige Aufgabe.
• Hängt von den Operationen (Algorithmen), die auf dem
Objekt ausgeführt werden ab.
1.9
Einleitung 4
Daten
Pierre Fierz
• Wir wollen das Problem der Darstellung am Beispiel von
Zahlen betrachten
Einleitung
Beispiel: Technische Darstellung von Zahlen
Im technisch-wissenschaftlichen Bereich werden von Zahlen
folgende Eigenschaften verlangt:
• Das Rechnen ist die Hauptoperation und muss möglichst
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
effizient sein.
• Es werden sehr grosse und auch sehr kleine Zahlen
benötigt. (Bereich ca. 10−40 bis 1040 )
• Im allgemeinen genügt eine Genauigkeit von 10 bis 16
signifikante Stellen zur Berechnung und Ausgabe der
Resultate.
• Die Druckoperation ist viel seltener als die
Rechenoperationen.
Diese Überlegungen legt die floating point-Darstellung nahe,
die nachstehend erklärt ist.
1.10
Daten
Einleitung 5
Pierre Fierz
Beispiel: Technische Darstellung von Zahlen 2
Vorzeichen
Exponent
Mantisse
Einleitung
Datentypen
• Vorzeichen ist ein Bit 0 = positiv 1 = negativ
• Exponent (Basis 2) besteht aus 8 Bits (Zahl von 0 bis 255)
• Tatsächlicher Exponent E = Exponent − 127
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• Ist der Exponent 0, so ist die Zahl 0.
• Mantisse besteht aus 23 bits und stellt einen
normalisierten Dualbruch dar.
• Normalisiert bedeutet, dass die erste signifikante Stelle
vor dem Komma steht.
• Da die erste Stelle vor dem Komma immer 1 ist, wird sie in
der Darstellung weggelassen.
• Alles in einer Formel zusammengefasst:
zahl = Vorzeichen · (2(Exponent−127) · 1.Mantisse)
1.11
Daten
Einleitung 6
Pierre Fierz
Beispiel: Technische Darstellung von Zahlen 3
Einleitung
Datentypen
• Wir wollen dies noch an einem Zahlenbeispiel
veranschaulichen
Abgeleitete Typen
Weitere
Datenstrukturen
• Wir möchten die Dezimalzahl −0.1 darstellen.
Der Abstrakte
Datentyp (ADT)
• Das Vorzeichen ist also 1
• 0.1 dual ergibt 0.00011001100 . . .
• Normalisiert ergibt es 1.1001100 · 2−4
• Der Exponent ist also E = −4 + 127 = 123 binär
01111011
Vorzeichen
1
Exponent
01111011
Mantisse
10011001100110011001100
1.12
Einleitung 7
Daten
Pierre Fierz
• Wir wollen nun eine weitere Möglichkeit für die Darstellung
von Zahlen betrachten
Einleitung
Beispiel: Kommerzielle Darstellung von Zahlen
Datentypen
Abgeleitete Typen
Im kommerziellen Bereich werden Zahlen vor allem zur
Darstellung von Geldbeträgen verwendet.
• Mit den Zahlen wird wenig gerechnet (meistens
Additionen).
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• Die Zahlen werden sehr oft gedruckt.
• Der benötigte Bereich ist viel kleiner als im technischen
Bereich.
• Die Anzahl Stellen nach dem Komma kann fix vereinbart
werden (z.B. 4 Stellen).
• Die Zahlen müssen sowohl beim Rechnen wie auch in der
Ausgabe genau sein.
Diese Überlegungen legt die fix point-Darstellung nahe, die
nachfolgend erklärt ist.
1.13
Daten
Einleitung 8
Pierre Fierz
Beispiel: Kommerzielle Darstellung von Zahlen 2
Einleitung
Datentypen
n − m Vorkommastellen
m Nachkommastellen
Vorzeichen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• n und m sind vereinbarte Konstanten (z.B. 15 und 4)
• Der Dezimalpunkt steht somit immer an der gleichen Stelle
• Die Zahlen werden dezimal dargestellt je 4 Bit stellen eine
Dezimalstelle dar
• Das Vorzeichen ist durch die letzten 4 Bits gegeben
• Als Beispiel stellen wir die Zahl 35.7310 dar.
0000
| {z } . . . 0011
| {z } 0101
| {z } 0111
| {z } 0011
| {z } 0001
| {z } 0000
| {z } 0000
| {z }
0
3
5
7
3
1
0
+
1.14
Einleitung 9
Daten
Pierre Fierz
• Nun noch die Definition was wir unter Computer-Daten
verstehen wollen.
Definition
Computer-Daten sind Objekte mit den drei folgenden
Eigenschaften
1
2
3
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
Bezeichnung
Die Bezeichnung trägt den semantischen Teil (Bedeutung)
des Objektes (siehe auch Datentypen).
Wertemenge
Die Wertemenge legt alle möglichen Werte fest, die ein
Objekt dieses Types annehmen kann. Die Wertemenge
bestimmt somit die Syntax (Form) eines Objektes.
Speicherplatz
Der Speicherplatz lokalisiert das Objekt im Speicher und
identifiziert dieses eindeutig.
1.15
Einleitung 10
Daten
Pierre Fierz
Einleitung
Beispiel: Computer-Daten
Datentypen
Abgeleitete Typen
Datenobjekt: "Müller"
Bezeichnung: Familienname einer Person. Damit ist die
Bedeutung des angegebenen Objekts festgelegt.
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
Wertemenge: Alle Folgen von maximal n alphabetischen
Zeichen. Das erste Zeichen muss ein grosser
Buchstabe sein. Damit ist die Form des Objektes
festgelegt.
Speicherplatz: Eine Adresse im Speicher, wo die gegebene
Zeichenfolge beginnt. Dadurch ist das Objekt
eindeutig identifiziert.
1.16
Einleitung 11
Daten
Pierre Fierz
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Bemerkung: Syntax und Semantik
Der Abstrakte
Datentyp (ADT)
In der Informatik wird die Semantik durch den Datentyp eines
Objektes gegeben. Die Syntax (Wertemenge) ist im Prinzip
durch die Anzahl reservierter Bits im Speicher gegeben.
1.17
Outline
Daten
Pierre Fierz
Einleitung
1 Einleitung
Datentypen
Abgeleitete Typen
2 Datentypen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
3 Abgeleitete Typen
4 Weitere Datenstrukturen
5 Der Abstrakte Datentyp (ADT)
1.18
Definition: Datentyp
Daten
Pierre Fierz
• In der Mathematik werden Objekte nach wichtigen
Eigenschaften geordnet man unterscheidet
•
•
•
•
•
einzelne Werte
Mengen von Werten
Funktionen
Mengen von Funktionen
usw.
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• In der Informatik werden noch mehr Objekte
unterschieden wie
•
•
•
•
•
•
Zahlen
Funktionen,
Personaldaten,
Wetterdaten,
Rechnungen
u.s.w.
• Es ist noch wichtiger als in der Mathematik diese Objekte
zu ordnen
• Objekte werden in Datentypen unterteilt
1.19
Definition: Datentyp 2
Daten
Pierre Fierz
Einleitung
• Wir wollen nun den Begriff Datentyp definieren
Definition
Der Datentyp bestimmt eine Menge von Werten, welche die
Objekte dieses Typs annehmen können. Diese Menge
bezeichnet man als Wertemenge des Datentyps. Die Elemente
des Wertebereichs bezeichnet man auch als Konstanten des
Datentyps.
Der Datentyp bestimmt auch die Operatoren, welche auf die
Objekte der Wertemenge definiert sind und somit auf Objekte
dieses Typs angewandt werden können.
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
1.20
Definition: Datentyp 3
Daten
Pierre Fierz
• Einige Beispiele für Datentypen:
• Ganze Zahlen (int) mit den Operatoren
+, −, ∗, /, ≤, == usw.
• Zeichenketten (strings) mit den Operatoren substring,
concatenate usw.
• Es ist auch möglich einen Datentyp zu definieren, indem
alle möglichen Werte aufgezählt werden
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
Beispiel: Enum-Typ
In der Sprache Java etwa, können wir einen Farbentyp
folgendermassen deklarieren.
public Enum Farbe {ROT, BLAU, GELB, GRÜN};
• Mit dieser Definition ist auch der Vergleichsoperator
(equals) definiert.
1.21
Atomare Datentypen
Daten
Pierre Fierz
Einleitung
Datentypen
• Atomare Datentypen sind solche, die in einer
Programmiersprache schon definiert sind.
• Sie bilden die Basis des Typsystems der Sprache.
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• Durch Typkonstruktoren können aus den Atomaren Typen
weitere Typen erzeugt werden.
• Welche atomaren Typen zur Verfügung stehen, hängt von
der gewählten Programmiersprache ab.
• Im Folgenden stellen wir einige wichtige atomare
Datentypen vor.
1.22
Atomare Datentypen: Ganze Zahlen (INTEGER)
Daten
Pierre Fierz
Einleitung
Datentypen
• Der Datentyp INTEGER umfasst ein um die Zahl Null
symmetrisches Intervall der ganzen Zahlen.
• In diesem Intervall sind die Zahlen genau darstellbar.
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• Die Operationen umfassen die üblichen arithmetischen
Operationen +, −, ∗, / wobei / die ganzzahlige Division
bezeichnet.
• Die Operationen sind bezüglich INTEGER nicht
abgeschlossen (overflow).
1.23
Daten
Atomare Datentypen: reelle Zahlen (REAL)
Pierre Fierz
• Der Datentyp REAL ist ein endliches Modell der reellen
Zahlen R.
• Die Elemente dieses Typs werden auch Maschinenzahlen
M genannt.
• Jedes Element von REAL repräsentiert ein ganzes
(offenes) Intervall der reellen Zahlen.
• Dadurch wird die reelle Zahlenachse diskretisiert.
• Diese Tatsache hat für das Rechnen mit REAL Zahlen
wichtige Konsequenzen.
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
Die REALs auf der reellen Zahlenachse
−max
0
Overflowbereich
+max
Overflowbereich
Underflowbereich
• Das Intervall der reellen Zahlen, das durch die REAL-Zahl
0 repräsentiert wird, heisst Underflow-Bereich
1.24
Daten
Atomare Datentypen: Endliche Arithmetik
Pierre Fierz
• Wir haben schon gesehen, dass eine REAL-Zahl als
Einleitung
floatingpoint dargestellt werden
Datentypen
(Exponent−127)
Zahl = Vorzeichen · (2
· 1.Mantisse)
Abgeleitete Typen
Weitere
Datenstrukturen
• Diese Darstellung der reellen Zahlen nennt man auch eine
endliche binäre Arithmetik.
Der Abstrakte
Datentyp (ADT)
• Die Grösse der Mantisse bestimmt die maximale Anzahl
signifikanter Stellen einer Zahl.
• Ist diese Anzahl z.B. 10, so spricht man von einer
10-stelligen endlichen Arithmetik.
• Bei einer Operation wird mit einer Stelle mehr gerechnet
und anschliessend das Resultat auf die Grösse der
Mantisse gerundet.
• Menge der Zahlen einer endlichen Arithmetik wollen wir
mit M bezeichnen.
1.25
Atomare Datentypen: Eigenschaften einer endliche
Arithmetik
Daten
Pierre Fierz
• Die Wertemenge von M ist eine Untermenge der reellen
Einleitung
Zahlen.
M⊂R
• Jeder Zahl x ∈ R ist eindeutig ein x̃ ∈ M zugeordnet,
welches als Repräsentant von x bezeichnet wird.
• Jedes x̃ ∈ M repräsentiert alle Zahlen in einem Intervall
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
um x̃.
• Die reellen Zahlen 0 und 1 können in M exakt dargestellt
werden. Es gilt:
0 = 0̃ und 1 = 1̃
• Sind x, y ∈ M, dann ist das Resultat der Addition im
Allgemeinen nicht mehr in M.
• Das Resultat muss auf das nächstliegende Element in M
gerundet werden.
• Aus diesem Grund gelten nicht dieselben Gesetze wie in
einer gewöhnlichen Arithmetik.
1.26
Atomare Datentypen: Eigenschaften einer endliche
Arithmetik 2
• Das Assoziativgesetz der Addition gilt in einer endlichen
Arithmetik im allgemeinen nicht:
(x + y ) + z 6= x + (y + z)
Daten
Pierre Fierz
Einleitung
Datentypen
Abgeleitete Typen
Beispiel: Assotiativgesetz der Addition
Weitere
Datenstrukturen
Wir verwenden hier eine 4-Stellige dezimale endliche
Arithmetik.
Der Abstrakte
Datentyp (ADT)
x = 9.100 y = 3.0 · 10−4 z = 4.0 · 10−4
(x + y ) + z = (9.100 + 0.0003 +0.0004 = 9.100
|
{z
}
gerundet=9.100
|
{z
gerundet=9.100
}
x + (y + z) = 9.100 + (0.0003 + 0.0004) = 9.101
|
{z
}
gerundet=0.0007
|
{z
gerundet=9.101
}
1.27
Atomare Datentypen: Eigenschaften einer endliche
Arithmetik 3
• Das Distributivgesetz gilt in einer endlichen Arithmetik im
Allgemeinen nicht:
x · (y + z) 6= (x · y ) + (x · z)
Daten
Pierre Fierz
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Beispiel: Distributivgesetz
Der Abstrakte
Datentyp (ADT)
x = 2.000 y = 3.000 z = 3.000 · 10−4
x · (y + z) = 2.000 · (3.000 + 0.0003) = 6.000
|
{z
}
gerundet=3.000
|
{z
gerundet=6.000
}
(x · y ) + (x · z) = (2.000 · 3.000) + (2.000 · 0.0003) = 6.001
|
{z
} |
{z
}
gerundet=6.000
|
gerundet=0.0006
{z
gerundet=6.001
}
1.28
Atomare Datentypen: Absoluter und relativer Fehler
Daten
Pierre Fierz
• Bei Operationen mit Zahlen aus M wird das Resultat
gerundet.
Einleitung
• Dadurch entstehen Fehler im Resultat.
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Definition
Sei x̃ eine Approximation der Zahl x so definieren wir den
absoluten Fehler als
Der Abstrakte
Datentyp (ADT)
|x − x̃|
und den relativen Fehler als
|x − x̃|
|x|
• Für die Fehlerrechnung ist vor allem der relative Fehler
interessant
1.29
Atomare Datentypen: Numerische Auslöschung
• Numerische Auslöschung ist ein spezieller
Rundungsfehler.
• Entsteht wenn zwei fast gleich grosse Zahlen voneinander
subtrahiert werden.
Beispiel: Numerische Auslöschung
Daten
Pierre Fierz
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
• Wir betrachten die folgende Rechnung
Der Abstrakte
Datentyp (ADT)
1.2345 · 100 − 1.2344 · 100 = 1.0000 · 10−4
• Falls die Anfangsdaten verfälscht waren ist das exakte
Resultat aber 1.xxxx.
• Die Stellen xxxx sind dabei nicht bekannt
• Der absolute Fehler liegt im Bereich 10−5
• Der relative Fehler liegt im Bereich 10−5 /10−4 = 10−1
• Der relative Fehler der Anfangsdaten ist
10−5 /1.2 · 100 ≈ 10−5
• Der relative Fehler wird also um einen Faktor von 104
vergrössert.
1.30
Atomare Datentypen: Numerische Stabilität
Daten
Pierre Fierz
Einleitung
• Ein numerisch stabiler Algorithmus funktioniert auch in
einer endlichen Arithmetik “richtig”
• Unter “richtig” meint man dabei, dass die Rundungsfehler
den Ablauf nicht zu sehr stören.
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• Die folgende Definition von Stabilität stammt von
Wilkinson:
Definition
Bei stabilen Algorithmen ist das vom Computer berechnete
(durch Rundungsfehler verfälschte) Resultat, das exakte
Resultat von leicht geänderten Anfangsdaten.
1.31
Atomare Datentypen: Numerische Stabilität 2
Daten
Pierre Fierz
Beispiel: Quadratische Gleichung nicht stabil
• Wir betrachten Quadratische Gleichungen der Form
Einleitung
Datentypen
x 2 + px + q = 0
• Die übliche Formel zum Finden der beiden Lösungen
lautet
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
r
p 2
−p
±
−q
2
2
• Falls |p| |q| passiert bei der kleineren der beiden
Lösungen numerische Auslöschung.
x1,2 =
• Dann gilt nämlich
−p
≈
2
r
p 2
2
−q
und es werden fast gleich grosse Zahlen voneinader
subtrahiert.
1.32
Atomare Datentypen: Numerische Stabilität 3
Daten
Pierre Fierz
Beispiel: Quadratische Gleichung nicht stabil (Forts.)
• Wir berechnen nun das folgende numeriche Beispiel
2
8
x + 10 x + 1 = 0
• Mit einer 7-stelligen Arithmetik und der obigen Formel
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
erhalten wir die Lösungen:
x1 = −108 und x2 = 0
• Das sind aber die Lösungen der Gleichung
x 2 + 108 x = 0
• Der relative Fehler von x1 ist gering (≈ 10−9 )
• Die Lösung x2 ist hingegen schlicht falsch (Underflow).
• Dieser Algorithmus ist also nicht stabil.
1.33
Atomare Datentypen: Numerische Stabilität 4
Daten
Pierre Fierz
Beispiel: Quadratische Gleichung stabil
Einleitung
• Um quadratische Gleichungen immer stabil zu berechnen
kann man den folgenden Algorithmus verwenden.
• Falls eine Lösung der Gleichung bekannt ist, kann die
zweite Lösung mit der folgenden Formel berechnet
werden.
q
x2 =
x1
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• Wir verwenden diese Formel zur Berechnung der
betragsmässig kleineren Lösung
• Im Beispiel x 2 + 108 x + 1 = 0 erhalten wir
x1 = 10−8 , x2 =
1
1
= − 8 = −10−8
x1
10
• Dieser Algorithmus ist in jedem Fall numerisch stabil.
1.34
Atomare Datentypen: Schlecht konditionierte Probleme
Daten
Pierre Fierz
• Für schlecht konditionierte Probleme existieren keine
stabilen Algorithmen.
Definition
Ein Problem ist schlecht konditioniert (ill posed problem), wenn
die Lösung sich stark ändert, wenn man die Anfangsdaten
wenig stört.
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• In den Naturwissenschaften sind die Ausgangsdaten von
Berechnungen meistens Messdaten.
• Messdaten sind aber immer ungenau.
• Ist das zu lösende Problem schlecht konditioniert, so wird
das Resultat sehr häufig falsch sein.
1.35
Atomare Datentypen: Schlecht konditionierte Probleme 2
Daten
Pierre Fierz
Beispiel: Nullstellen von Polynomen
• Wir betrachten das Polynom
P(x) = (x − 1)3 = x 3 − 3x 2 + 3x − 1
• Dieses Polynom hat eine dreifache Nullstelle bei x1,2,3 = 1.
• Wir betrachten nun das folgende Polynom mit leicht
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
verfälschten Anfangsdaten
Q(x) = x 3 − 3.000001x 2 + 3x − 0.999999
• Die Nullstellen sind
x1 = 1, x2 ≈ 1.001414 und x3 ≈ 0.998586
• Die Koeffizienten von P wurden um 10−6 gestört, was die
Nullstellen um 10−3 veränderte.
• Die Störung wurde damit 1000 mal verstärkt.
• Das Polynom P ist also schlecht konditioniert
1.36
Atomare Datentypen: Logische Werte (BOOLEAN)
Daten
Pierre Fierz
Einleitung
Datentypen
• Der Datentyp BOOLEAN umfasst die beiden Werte TRUE
(wahr) und FALSE (falsch)
• Es existieren die folgenden Basisoperatoren
• Konjunktion AND (∧)
• Disjunktion OR (∨) und
• Negation NOT (¬)
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• Das Resultat eines Vergleichs ist ein BOOLEAN
• In Java is die folgende Zuweisung möglich
boolean Bool = (10 >= 8);
1.37
Atomare Datentypen: Logische Werte (BOOLEAN) 2
Daten
Pierre Fierz
Einleitung
Datentypen
Abgeleitete Typen
• Wahrheitstabellen für die boolschen Operatoren
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
A
true
true
false
false
AND
B
true
false
true
false
A∧B
true
false
false
false
A
true
true
false
false
OR
B
true
false
true
false
A∨B
true
true
true
false
NOT
A
¬A
true
false
false
true
1.38
Atomare Datentypen: Text (CHAR)
Daten
Pierre Fierz
Einleitung
• Der Datentyp CHAR bezeichnet eine Menge von
Schriftzeichen.
• Es existieren verschiedene Kodierungen wie EBCDIC,
ASCII oder Unicode
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• Auf der Menge existiert eine totale Ordnung.
• Bezüglich dieser Ordnung müssen die Teilmengen der
Buchstaben und der Ziffern je zusammenhängend und wie
üblich geordnet sein. Es gilt:
A < B < C ··· < Z
a < b < c ··· < z
0 < 1 < 2··· < 9
1.39
Atomare Datentypen: Text (CHAR) 2
• Die beiden bijektiven funktionen ord und char müssen zur
Verfügung stehen.
• Sei N die Anzahl Elemente im Zeichensatz so gilt:
ord : CHAR 7→ {0, 1, . . . , N − 1}
char : {0, 1, . . . , N − 1} 7→ CHAR
• Ferner gelten die folgenden Regeln
• ord(char (i)) = i ∀i ∈ [0 . . . N − 1]
Daten
Pierre Fierz
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• char (ord(x)) = x ∀x ∈ CHAR
Beispiel: Ausgeben von Zeichen in Java
// Alle Zeichen zwischen 0 und 255 ausgeben
for (int i = 0; i <= 255; i++) {
System.out.print(((char) i) + ",");
}
// Den Code von A ausgeben
System.out.println((int)’A’);
1.40
Outline
Daten
Pierre Fierz
Einleitung
1 Einleitung
Datentypen
Abgeleitete Typen
2 Datentypen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
3 Abgeleitete Typen
4 Weitere Datenstrukturen
5 Der Abstrakte Datentyp (ADT)
1.41
Mengenoperationen
Daten
Pierre Fierz
Einleitung
• Ein Datentyp besteht aus einer Menge und Operationen
Datentypen
• Durch Mengenoperationen können also aus bestehenden
Abgeleitete Typen
Datentypen neue gewonnen werden.
• Die wichtigsten Mengenoperationen sind
Weitere
Datenstrukturen
•
•
•
•
Der Abstrakte
Datentyp (ADT)
Die Teilmengenbildung
Das Kartesische Produkt
Bilden der Potenzmenge
Erzeugen von Funktionsräume
• Bei der Teilmengenbildung spricht man von
Unterbereichstypen (oder auch Subtypen)
• Bei den anderen Mengenoperationen von strukturierten
Typen
1.42
Unterbereichstypen
Daten
Pierre Fierz
• Ein Unterbereichstyp ist ein intervall eines ordinal Typ
(Integer, Char)
• Das heisst, die Wertemenge wird auf ein Intervall
beschränkt.
Einleitung
Datentypen
Abgeleitete Typen
• Die Definition erfolgt durch die Angabe der Grenzen des
Intervalls.
TYPE T = min..max (*Pascal Definition*)
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
Beispiel: Unterbereichstypen
TYPE Grossbuchstabe = A..Z
TYPE Ziffer = 0..9
TYPE Kleinezahl = -10..10
• Operatoren des Obertyps können auf den Subtyp
angewendet werden
1.43
Daten
Subtypen
Pierre Fierz
• Beim Unterbereichstyp wird ein Intervall des Obertyps
benutzt
• Eine Verallgemeinerung ist der Subtyp der aus einer
beliebigen Teilmenge des Obertyps besteht (set
comprehension)
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
Beispiel: Subtyp
• Der Obertyp sei alle schweizer Adressen CHAdr .
• Der Operator PLZ sei auf CHadr definiert und liefert als
Resultat die Postleitzahl des Ortes.
• Wir können nun den neuen Subtyp BEadr folgendermassen
definieren:
BEadr = {x ∈ CHadr | PLZ (x) ≥ 3000 ∧ PLZ (x) ≤ 3999}
1.44
Daten
Der Array
Pierre Fierz
• Der strukturierte Typ Array wird aus zwei gegebenen
Datentypen konstruiert:
• Der Grundtyp (GT ) ist ein beliebiger atomarer oder
abgeleiteter Datentyp
• Der Indextyp (ID) ist ein Unterbereichstyp von INTEGER.
• Arrays des Grundtyps GT und des Indextyps ID kann nun
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
folgendermassen definiert werden.
Arraygtid = GT |ID|
Beispiel: Array in Java
• Wir definieren einen Array mit Grundtyp double und dem
Indextyp 0..19
public double[] doubleArray = new double[20];
1.45
Daten
Der Array 2
Pierre Fierz
• Auf Arrays ist der Selektoroperator [] definiert.
• Mit diesem Operator kann auf ein beliebiges Element des
Arrays zugegriffen werden.
• Das i-te Element des Arrays A wird mit A[i] bezeichnet
und repräsentiert ein Objekt des Grundtyps des Arrays.
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• Ein Arrayelement kann gelesen oder geschieben werden.
Beispiel: Der Arrayselektor
double[] doubleArray = new double[20];
double x;
x = doubleArray[7] + 10.0;
doubleArray[3] = 27.0;
/* Lesen der 7. Komponente des
Arrays doubleArray */
/* Schreiben der 3. Komponente
des Arrays doubleArray */
1.46
Der Array 3
• Der Indextyp des Arrays ist eine Zahl
• Ein Index kann daher auch zur Laufzeit berechnet werden
(Achtung Fehler!)
• Diese Eigenschaft wird im nächsten Algorithmus
ausgenutzt.
Beispiel: Binäres Suchen
• Das binäre Suchen kann angewendet werden um in einem
Daten
Pierre Fierz
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
sortierten Array A ein Element x schnell zu finden.
• In einem Sortierten Array der Länge n gilt:
A[0] ≤ A[1] ≤ · · · ≤ A[n − 1]
• Der Algorithmus ist ganz Einfach:
• Vergleiche das mittlere Element am des Arrays mit x
1.47
Der Array 3
• Der Indextyp des Arrays ist eine Zahl
• Ein Index kann daher auch zur Laufzeit berechnet werden
(Achtung Fehler!)
• Diese Eigenschaft wird im nächsten Algorithmus
ausgenutzt.
Beispiel: Binäres Suchen
• Das binäre Suchen kann angewendet werden um in einem
Daten
Pierre Fierz
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
sortierten Array A ein Element x schnell zu finden.
• In einem Sortierten Array der Länge n gilt:
A[0] ≤ A[1] ≤ · · · ≤ A[n − 1]
• Der Algorithmus ist ganz Einfach:
• Vergleiche das mittlere Element am des Arrays mit x
• Gilt am = x dann ist die Suche erfolgreich beendet
1.47
Der Array 3
• Der Indextyp des Arrays ist eine Zahl
• Ein Index kann daher auch zur Laufzeit berechnet werden
(Achtung Fehler!)
• Diese Eigenschaft wird im nächsten Algorithmus
ausgenutzt.
Beispiel: Binäres Suchen
• Das binäre Suchen kann angewendet werden um in einem
Daten
Pierre Fierz
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
sortierten Array A ein Element x schnell zu finden.
• In einem Sortierten Array der Länge n gilt:
A[0] ≤ A[1] ≤ · · · ≤ A[n − 1]
• Der Algorithmus ist ganz Einfach:
• Vergleiche das mittlere Element am des Arrays mit x
• Gilt am = x dann ist die Suche erfolgreich beendet
• Gilt am > x dann suche das Element im linken Teil des
Arrays
1.47
Der Array 3
• Der Indextyp des Arrays ist eine Zahl
• Ein Index kann daher auch zur Laufzeit berechnet werden
(Achtung Fehler!)
• Diese Eigenschaft wird im nächsten Algorithmus
ausgenutzt.
Beispiel: Binäres Suchen
• Das binäre Suchen kann angewendet werden um in einem
Daten
Pierre Fierz
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
sortierten Array A ein Element x schnell zu finden.
• In einem Sortierten Array der Länge n gilt:
A[0] ≤ A[1] ≤ · · · ≤ A[n − 1]
• Der Algorithmus ist ganz Einfach:
• Vergleiche das mittlere Element am des Arrays mit x
• Gilt am = x dann ist die Suche erfolgreich beendet
• Gilt am > x dann suche das Element im linken Teil des
Arrays
• Gilt am < x dann suche das Element im rechten Teil des
Arrays
1.47
Der Array 4
Daten
Pierre Fierz
Beispiel: Binäres Suchen in Java
public static int binSearch(int[] a, int such) {
int left = 0;
int right = a.length - 1;
int mid = 0;
boolean found = false;
while (right >= left && !found) {
//Testen des mittleren Elementes
mid = (left + right) / 2;
if (a[mid] == such)
found = true;
else if (a[mid] < such)
//Das Element muss rechts der Mitte liegen.
left = mid + 1;
else
// Das Element muss links der Mitte liegen.
right = mid - 1;
}
return (found) ? mid : -1;
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
}
1.48
Der Array 4
Daten
Pierre Fierz
Beispiel: Binäres Suchen in Java
public static int binSearch(int[] a, int such) {
int left = 0;
int right = a.length - 1;
int mid = 0;
boolean found = false;
while (right >= left && !found) {
//Testen des mittleren Elementes
mid = (left + right) / 2;
if (a[mid] == such)
found = true;
else if (a[mid] < such)
//Das Element muss rechts der Mitte liegen.
left = mid + 1;
else
// Das Element muss links der Mitte liegen.
right = mid - 1;
}
return (found) ? mid : -1;
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
}
• Die maximale Anzahl Vergleiche im Algorithmus ist
log2 (a.length)
1.48
Allgemeine Struktur
Daten
Pierre Fierz
• Mit Hilfe des Kartesischen Produkts können wir neue
Datentypen definieren.
• Dabei fassen wir beliebige Datentypen zu einer Einheit
zusammen
NewType = DT1 × DT2 × DT3 × · · · × DTn
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• In der Sprache C kann ein solcher Typ folgendermassen
definiert werden:
typedef struct
{
DT1 Name_1;
DT2 Name_2;
DT3 Name_3;
.
.
DTn Name_n;
} MyStruct;
1.49
Allgemeine Struktur 2
• In der Sprache Java kann ein solcher Typ mit Hilfe einer
Klasse definiert werden.
public class MyStructure {
DT1 name_1;
DT2 name_2;
DT3 name_3;
.
.
DTn name_n;
};
• Die Datentypen DT1 . . . DTn können entweder atomare
oder abgeleitete Typen sein.
Daten
Pierre Fierz
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
Beispiel: Person
public class Person {
String
Name;
String
Vorname;
Calendar GeburtsDatum;
String
Beruf;
double
Gehalt;
};
1.50
Allgemeine Struktur 3
Daten
Pierre Fierz
• Bei Strukturen existiert der Selekoroperator ., der es
erlaubt auf einzelene Komponenten zuzugreifen.
Beispiel: Zugriff auf Komponenten
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
Person Hans = new Person();
Hans.Name = "Meier";
Hans.Gehalt = 4500.0;
Hans.GeburtsDatum.set(80, 11, 22);
System.out.println(Hans.Name);
1.51
Mengen von Objekten
• Mengen von Objekten desselben Typs bilden mit den
Mengenoperatoren auch einen Typ.
• Die Wertemenge des Mengentyps eines Typs DT ist dann
P(DT )
• In Java wird der Mengentyp durch die Library Klasse
HashSet zur Verfügung gestellt.
Beispiel: Mengen und Operationen
Daten
Pierre Fierz
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
public static void main(String[] args) {
HashSet<Integer> A = new HashSet<Integer>();
HashSet<Integer> B = new HashSet<Integer>();
if (A.contains(7)) {
// 7 ist Element von A?
...
}
if (A.containsAll(B)) { // B Teilmenge von A?
...
}
/* Die Mengenoperationen
* Das Resultat ist in A gespeichert
*/
A.addAll(B);
// A vereinigt mit B
A.retainAll(B); // A geschnitten mit B
A.removeAll(B); // A weg B
}
1.52
Daten
Funktionsräume
Pierre Fierz
• Mit den Datentypen DT1 und DT2 kann der Funktionsraum
Fraum = {f |f : DT1 → DT2 }
gebildet werden.
Einleitung
Datentypen
Abgeleitete Typen
Beispiel: Funktionsräume
• Das nächste Beispiel zeigt wie man in C++
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
Funktionstypen definieren kann.
#include <cmath>
#include <iostream>
typedef double (*realfunc)(double);
int main() {
realfunc fp;
realfunc fp1;
fp = &sin;
fp1 = &cos;
std::cout << fp(fp1(M_PI)) << std::endl;
}
1.53
Outline
Daten
Pierre Fierz
Einleitung
1 Einleitung
Datentypen
Abgeleitete Typen
2 Datentypen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
3 Abgeleitete Typen
4 Weitere Datenstrukturen
5 Der Abstrakte Datentyp (ADT)
1.54
Daten
Die lineare Liste
Pierre Fierz
• Eine lineare Liste besteht aus i-Tupel von Elementen
eines Grundtyps GT
Einleitung
Datentypen
• Im Gegensatz zum Array ist die Anzahl Elemente einer
Abgeleitete Typen
Weitere
Datenstrukturen
Liste variable.
• Formal kann eine Liste folgendermassen definiert werden:
ListeGT =
∞
[
Der Abstrakte
Datentyp (ADT)
GT i
i=0
• Da i = 0 zugelassen ist, kann eine Liste auch leer sein.
• Da Tupel geordnet sind kann man vom ersten, letzten und
n-ten Element der Liste sprechen.
• Wir können auch vom Vorgänger und Nachfolger eines
Elements sprechen.
1.55
Die lineare Liste 2
Daten
Pierre Fierz
Einleitung
Datentypen
• Für eine Liste sind die folgenden Operationen wichtig:
• Schreiben/Lesen des Wertes eines beliebigen Elements der
Liste.
• Einfügen eines Elements an einer beliebigen Stelle in der
Liste.
• Löschen eines beliebigen Elements der Liste.
• Traversieren der Liste
• Bestimmen der Länge der Liste.
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• Der Aufwand für die einzelnen Operationen hängt von der
Repräsentation der Liste ab.
1.56
Daten
Die lineare Liste 3
Pierre Fierz
• Sequentielle Repräsentation:
Einleitung
Alle Elemente der Liste werden in aufeinanderfolgenden
Speicherplätzen abgelegt.
Vorteil: Der Zugriff auf ein Element der Liste ist sehr
schnell, da dessen Adresse berechnet
werden kann.
Nachteil Das Einfügen oder Löschen eines Elements
der Liste ist langsam, da alle hinteren
Elemente geschoben werden müssen.
Anfang
Ende
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
Freier Speicher
1.57
Die lineare Liste 4
Daten
Pierre Fierz
• Verkettete Repräsentation:
Zu jedem Element der Liste wird zusätzlich die
(physische) Adresse seines Nachfolgers gespeichert.
Vorteil: Das Löschen und Einfügen eines Elements
der Liste ist schnell, da nur der Zeiger des
Vorgängers verändert werden muss.
Nachteil: Der Zugriff auf ein beliebiges Element ist
langsam, da alle Vorgängerelemente der
Liste gelesen werden müssen.
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
1.58
Daten
Stack und Queue
Pierre Fierz
• Aus einer Liste kann man neue Datentypen ableiten,
indem die Operationen eingeschränkt werden.
Einleitung
Datentypen
• Werden die Operationen Lesen, Einfügen und Löschen
nur an einem Ende der Liste erlaubt, erhält man den
Stack.
• Der Stack wird häufig als LiFo-Struktur bezeichnet (LiFo =
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
Last-in-First-out).
• Man braucht die Begriffe push und pop für das Einfügen
und Löschen eines Elements.
Sami
push(Sami)
Sami
pop()
Paul
Paul
Paul
Peter
Peter
Peter
Hans
Hans
Hans
Fritz
Fritz
Fritz
1.59
Daten
Stack und Queue 2
Pierre Fierz
Einleitung
• Eine Queue ist eine lineare Liste bei der
1 Die Operationen Lesen und Löschen nur am Anfang der
Liste erlaubt sind
2 Die Operation Einfügen nur am Ende der Liste erlaubt ist.
• Die Queue wird häufig als FiFo-Struktur bezeichnet (FiFo
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
= First-in-First-out).
write(Sami)
Paul
Peter
Hans
Fritz
Sami
Paul
Peter
Hans
Fritz
read()
Sami
Paul
Peter
Hans
Fritz
1.60
Der Baum
• Eine weitere wichtige Datenstruktur ist der Baum (engl.
tree)
• Der Baum ist dem Wesen nach eine zweidimensionale
Struktur.
Daten
Pierre Fierz
Einleitung
Datentypen
Abgeleitete Typen
Definition
Weitere
Datenstrukturen
Ein Baum ist entweder
1
die leere Menge (leerer Baum) oder
2
eine endliche, nichtleere Menge von Elementen, wovon
ein Element Wurzel (engl. root) genannt wird und die
restlichen Elemente in m ≥ 0 disjunkte Teilmengen
eingeteilt sind, wobei jede wieder ein Baum ist
(Unterbäume).
Der Abstrakte
Datentyp (ADT)
Wurzel
......
Unterbaum
1.61
Daten
Der Baum 2
Pierre Fierz
• Bäume werden als Graphen dargestellt
• Dabei wird die Wurzel durch m Kanten (engl. edges) mit
Einleitung
Datentypen
den Wurzeln der Unterbäume verbunden.
Abgeleitete Typen
Wurzel
Weitere
Datenstrukturen
A
Geschwister
1111
0000
0000
1111
0000
1111
Der Abstrakte
Datentyp (ADT)
Unterbaum
B
C
D
Hoehe
E
G
F
H
I
Innere Knoten
J
Blaetter
1.62
Der Baum 3
Daten
Pierre Fierz
• Wichtige Begriffe:
• Die Elemente des Baumes heissen Knoten (engl. nodes)
• Die Wurzel eines Baumes ist der Vorgänger die Wurzeln der
Unterbäume sind die Nachfolger (engl. predecessor and
successor).
• Knoten mit Nachfolger heissen innere Knoten (engl. internal
nodes).
• Knoten ohne Nachfolger heissen Blätter oder äussere
Knoten (engl. leaves or external nodes).
• Die direkten Nachfolger eines Knotens heissen Geschwister
(engl. siblings).
• Das Niveau (engl. level) eines Knotens ist folgendermassen
definiert:
level(root) := 0
level(x) := level(predecessor (x)) + 1
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• Die Tiefe (engl. depth) oder Höhe (engl. height) eines
Baumes b ist definiert als:
depth(b) := maxx∈b (level(x))
1.63
Der Baum 4
Daten
Pierre Fierz
Einleitung
Datentypen
• Wichtige Begriffe (fortsetzung):
• Der Grad (engl. degree) eines Knotens ist gleich der Anzahl
Nachfolger dieses Knotens.
• Der Grad eines Baubes b ist definiert als:
degree(b) := maxx∈b (degree(x))
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• Eine Menge von Bäumen heisst Wald (engl. forest).
• Ein geordneter Baum (engl. ordered tree) ist ein Baum, bei
dem die Reihenfolge der direkten Nachfolger eines Knotens
gegeben ist.
1.64
Der binäre Baum
Daten
Pierre Fierz
• Ein wichtiger Speziallfall von Bäumen sind die binären
Bäume.
Einleitung
Datentypen
Definition
1
Ein binärer Baum (engl. binary tree) ist ein geordneter
Baum mit Grad ≤ 2.
2
Ein streng binärer Baum (engl. strictly binary tree) ist ein
binärer Baum und alle inneren Knoten haben den Grad 2.
3
Ein vollständiger binärer Baum (engl. complete binary
tree) ist ein streng binärer Baum und alle Blätter haben
das gleiche Niveau.
4
Ein fast vollständiger binärer Baum (engl. allmost
complete binary tree) ist ein vollständiger binärer Baum
wobei ganz rechts auf der untersten Stufe des Baumes
Knoten fehlen dürfen.
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
1.65
Daten
Der binäre Baum 2
Pierre Fierz
Beispiel: Diverse binäre Bäume
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
1 Binaerer Baum
3 Vollstaendiger binaerer Baum
2 Streng binaerer Baum
4 Fast vollstaendiger binaerer Baum
1.66
Darstellung von binären Bäumen
Daten
Pierre Fierz
• Da der binäre Baum geordnet ist hat ein Knoten einen
linken und rechten Unterbaum.
• Die folgende Struktur stellt einen Knoten des binären
Baumes dar.
public class BinTreeNode<Element> {
private Element info;
private BinTreeNode<Element> left;
private BinTreeNode<Element> rigth;
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
...
}
• Der Baum selbst kann nun folgendermassen definiert
werden:
public class BinTree<Element> {
private BinTreeNode<Element> root;
...
}
1.67
Traversieren von binären Bäumen
Daten
Pierre Fierz
• Eine wichtige Operation für Bäume ist das Traversieren
des Baumes.
Einleitung
Datentypen
• Das heisst, besuchen aller Knoten und ausführen einer
Aktion (z.B. ausdrucken der Information)
• Da die Baumstruktur rekursiv definiert ist, liegt es natürlich
nahe, die Traversierung eines Baumes rekursiv zu
implementieren.
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• Wir wollen die drei folgenden Ansätze betrachten:
Preorder Traversierung
1
2
3
Behandle die Wurzel des Baumes
Traversiere den linken Unterbaum in
preorder
Traversiere den rechten Unterbaum in
preorder
1.68
Traversieren von binären Bäumen 2
Daten
Pierre Fierz
• Fortsetzung:
Einleitung
Postorder Traversierung
1
2
3
Traversiere den linken Unterbaum in
postorder
Traversiere den rechten Unterbaum in
postorder
Behandle die Wurzel des Baumes
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
Inorder Traversierung
1
2
3
Traversiere den linken Unterbaum in inorder
Behandle die Wurzel des Baumes
Traversiere den rechten Unterbaum in
inorder
1.69
Traversieren von binären Bäumen 3
• Der folgende Algorithmus implementiert die Traversierung
eines binären Baumes in inorder.
Algorithmus: Baumtraversierung
Daten
Pierre Fierz
Einleitung
Datentypen
public class BinTreeNode<Element> {
private Element info;
private BinTreeNode<Element> left;
private BinTreeNode<Element> right;
...
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
public void traverse() {
// Linker Unterbaum
if (this.left != null)
this.left.traverse();
// Ausgeben des Knotens
System.out.println(info);
// Rechter Unterbaum
if (this.right != null)
this.right.traverse();
}
...
}
1.70
Daten
Traversieren von binären Bäumen 4
Pierre Fierz
Beispiel: Arithmetische Ausdrücke
• Zu jedem arithmetischen Ausdruck gehört ein
Syntaxbaum.
• Die inneren Knoten repräsentieren die Operatoren
Einleitung
Datentypen
Abgeleitete Typen
• Die Blätter repräsentieren die Operanden.
Weitere
Datenstrukturen
• Der folgende Baum repräsentiert den Ausdruck
Der Abstrakte
Datentyp (ADT)
((a + b) · c − d/e) · 7
01
−
7
01
c
+
a
/
d
e
b
1.71
Traversieren von binären Bäumen 5
Daten
Pierre Fierz
Beispiel: Arithmetische Ausdrücke (forts.)
• Traversieren wir den Baum in Preorder, so erhalten wir die
folgende Reihenfolge für den Besuch der einzelnen
Knoten (Polnische Notation):
· − · + abc/d e7
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• Traversieren wir den Baum in Postorder, so erhalten wir
die folgende Reihenfolge für den Besuch der einzelnen
Knoten (Umgekehrte polnische Notation):
ab + c · d e/ − 7·
• Traversieren wir den Baum in Inorder, so erhalten wir die
folgende Reihenfolge für den Besuch der einzelnen
Knoten (Infix Notation ohne Klammern):
a + b · c − d /e · 7
1.72
Outline
Daten
Pierre Fierz
Einleitung
1 Einleitung
Datentypen
Abgeleitete Typen
2 Datentypen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
3 Abgeleitete Typen
4 Weitere Datenstrukturen
5 Der Abstrakte Datentyp (ADT)
1.73
Definition ADT
Daten
Pierre Fierz
Einleitung
• Der abstrakte Datentyp (abgekürzt ADT) ist eines der
wichtigsten Konzepte in der modernen Informatik.
• Objektorientierte Sprachen unterstützen das Konzept.
• Er dient dazu, Datentypen unabhängig von deren
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
Implementation zu definieren.
• Beispiele: Listen, Stacks, Queues usw.
• Aber auch konkrete Objekte der Welt wie Personen,
Motoren, Schrauben, Fahrzeuge usw.
• Zwei wichtige Prinzipien:
• Geheimnisprinzip
• Wiederverwendbarkeit
1.74
Definition ADT 2
Daten
Pierre Fierz
• Das Geheimnisprinzip kann folgendermassen formuliert
werden:
Einleitung
Datentypen
Definition
Dem Benutzer eines Datentyps (Moduls) werden nur die auf
diesem Datentyp erlaubten Operationen bekanntgegeben. Die
Implementation des Datentyps bleibt für den Benutzer
verborgen (abstrakt).
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• Die Anwendung dieses Prinzips bringt folgende Vorteile:
• Der Anwender kann den Datentyp nur im Sinne der
Definition verwenden.
• Die Implementation eines Datentyps kann jederzeit
verändert werden.
• Die Verantwortung zwischen dem Anwender und dem
Implementator des Datentyps sind durch die
Interface-Definitionen klar geregelt.
• Die Suche nach Fehlern wird dadurch erheblich vereinfacht.
1.75
Definition ADT 3
Daten
Pierre Fierz
• Das Prinzip der Wiederverwendbarkeit kann wie folgt
formuliert werden:
Einleitung
Datentypen
Abgeleitete Typen
Definition
Weitere
Datenstrukturen
Ein Datentyp soll in verschiedenen Applikationen
wiederverwendbar sein, wenn ähnliche Probleme gelöst
werden müssen.
Der Abstrakte
Datentyp (ADT)
• Die Anwendung dieses Prinzips verfolgt die folgenden
Ziele:
• Die Entwicklungszeit eines Systems soll veringert werden
• Software soll aus gut getesteten (bewiesenen)
Komponenten hergestellt werden können
• Bestehende Softwarekomponenten sollen einfach zwischen
Herstellern austauschbar sein.
1.76
Daten
Formale Spezifikation von ADTs
Pierre Fierz
• Die Wiederverwendbarkeit bedingt, dass die Funktionen
eines ADTs genau beschrieben werden.
• Das Geheimnisprinzip verlangt, dass die Spezifikation
nicht aufgrund der Implementation geschieht.
Einleitung
Datentypen
Abgeleitete Typen
• Eine Beschreibung, die auf der Implementation basiert,
führt oft zu einer Überspezifikation des Datentyps.
Beispiel: Spezifikation eines Stacks aufgrund der Implementation
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
Wir können den Datentyp Stack als Array mit einem
zusätzlichen Zeiger auf das aktuelle oberste Element des
Stacks implementieren (in C).
struct stack
{
int
stack_pointer;
DT
stack_element[MAX];
/* DT steht fuer irgend
einen Datentyp */
};
void push(stack st, DT x)
{
++st.stack_pointer;
st.stack_element[st.stack_pointer] = x;
}
1.77
Formale Spezifikation von ADTs 2
Daten
Pierre Fierz
• Die Beschreibung des Stacks durch seine Implementation
ist genau
• Der Datentyp Stack ist aber dadurch überspezifiziert
• Da der Benutzer weiss, dass der Stack als Array
impplementiert ist, kann er auf beliebige Element des
Stacks zugreifen.
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• Ein solcher Zugriff widerspricht aber der Idee des Stacks.
• Eine Spezifikation besteht aus einer Signatur und einer
Semantik, die Bedeutung und Interaktion der Operationen
festlegt.
• Im folgenden wollen wir die folgenden
Spezifikationsmethoden betrachten:
1
2
3
Mathematisch-axiomatische Methode
Mathematisch-algebraische Methode
Informelle Methode
1.78
Mathematisch-axiomatische Methode
Daten
Pierre Fierz
• Eine Mathematisch-axiomatische Spezifikation besteht
aus einer Signatur, Erzeuger und Axiomen.
• Die Signatur beschreibt die Operationen mit Ihrer
Wertigkeit und die Konstanten (0-Wertige Operation).
• Erzeuger sind Operationen, die aus gegebenen
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
Elementen des Typs neue erzeugen.
• Die Axiome sind in Preconditions und Equations aufgeteilt
und beschreiben die Semantik des Typs.
• Die Grundmenge der Objekte des Datentyps ist die Menge
aller aus den Operationen erzeugbaren Objekte.
• In der Mathematik wird ein solches System auch eine
Termalgebra genannt.
1.79
Mathematisch-axiomatische Methode 2
Daten
Pierre Fierz
Beispiel: Spezifikation des Stacks
TYPES
Stack
ELEMENT
BOOLEAN
// wird hier definiert
// beliebiger Datentyp (generischer Parameter)
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
FUNCTIONS
emptystack :
empty :
push :
pop :
top :
Einleitung
7→ Stack
Stack 7→ BOOLEAN
ELEMENT × Stack 7→ Stack
Stack ,→ Stack
Stack ,→ ELEMENT
Der Abstrakte
Datentyp (ADT)
PRECONDITIONS
∀s ∈ Stack :
pre pop(s) : ¬(empty (s))
pre top(s) : ¬(empty (s))
AXIOMS
∀e ∈ ELEMENT ∀s ∈ Stack :
empty (emptystack ) = TRUE
empty (push(e, s)) = FALSE
top(push(e, s)) = e
pop(push(e, s)) = s
push(top(s), pop(s)) = s falls ¬empty (s)
1.80
Mathematisch-axiomatische Methode 3
Daten
Pierre Fierz
Beispiel: Spezifikation der Queue
TYPES
Queue
ELEMENT
BOOLEAN
// wird hier definiert
// beliebiger Datentyp (generischer Parameter)
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
FUNCTIONS
emptyqueue :
empty :
enqueue :
dequeue :
head :
Einleitung
7→ Stack
Queue 7→ BOOLEAN
ELEMENT × Queue 7→ Queue
Queue ,→ Queue
Queue ,→ ELEMENT
Der Abstrakte
Datentyp (ADT)
PRECONDITIONS
∀q ∈ Queue :
pre dequeue(q) : ¬(empty (q))
pre head(q) : ¬(empty (q))
AXIOMS
∀e ∈ ELEMENT ∀q ∈ Queue :
empty (emptyqueue) = TRUE
empty (enqueue(e, q)) = FALSE
head(enqueue(e, q)) = e falls empty (q)
= head(q) falls ¬empty (q)
dequeue(enqueue(e, q)) = q falls empty (q)
= enqueue(e, dequeue(q)) falls ¬empty (q)
1.81
Mathematisch-algebraische Methode
Daten
Pierre Fierz
• Die algebraische Methode unterscheidet sich von der
axiomatischen nur in der Angabe der Semantik.
• Die inhaltliche Bedeutung der Operationen wird hierbei
durch mathematische Mittel, Matrizen, Vektoren, Folgen,
etc. definiert.
• Ein Repräsentant dieser Methode ist die Java Modelling
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
Language (JML)
• JML ist auf die Sprache Java zugeschnitten
• Die JML Anweisungen werden als Annotationen im Code
geschrieben.
• Der Formalismus von JML ist nicht mathematisch sondern
Java ähnlich.
• Zu JML existieren viele Tools zum testen oder beweisen
ob die Implementation der Spezifikation entspricht.
1.82
Mathematisch-algebraische Methode 2
Daten
Pierre Fierz
Beispiel: Stack algebraische Spezifikation
TYPES
Stack
ELEMENT
BOOLEAN
// wird hier definiert
// beliebiger Datentyp (generischer Parameter)
Einleitung
Datentypen
Abgeleitete Typen
FUNCTIONS
emptystack :
empty :
push :
pop :
top :
7→ Stack
Stack 7→ BOOLEAN
ELEMENT × Stack 7→ Stack
Stack ,→ Stack
Stack ,→ ELEMENT
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
SPECIFICATION
Sets
ELEMENT beliebiege Menge
S = {<>} ∪ {< x1 , . . . , xn > |xi ∈ ELEMENT ∧ n ∈ N1 }
Functions
emptystack =<>
empty (s) = (s ==<>)
push(e, s) =< e > falls s ==<>
=< x1 , . . . , xn , e > falls s ==< x1 , . . . , xn >
top(s) = ⊥ falls s ==<>
= xn falls s ==< x1 , . . . , xn >
pop(s) = ⊥ falls s ==<>
=< x1 , . . . , xn−1 > falls s ==< x1 , . . . , xn >
1.83
Mathematisch-algebraische Methode 3
Daten
Pierre Fierz
Beispiel: Queue algebraische Spezifikation
TYPES
Queue
ELEMENT
BOOLEAN
// wird hier definiert
// beliebiger Datentyp (generischer Parameter)
Einleitung
Datentypen
Abgeleitete Typen
FUNCTIONS
emptyqueue :
empty :
enqueue :
dequeue :
head :
7→ Stack
Queue 7→ BOOLEAN
ELEMENT × Queue 7→ Queue
Queue ,→ Queue
Queue ,→ ELEMENT
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
Sets
ELEMENT beliebiege Menge
Q = {<>} ∪ {< x1 , . . . , xn > |xi ∈ ELEMENT ∧ n ∈ N1 }
Functions
emptyqueue =<>
empty (q) = (q ==<>)
enqueue(e, q) =< e > falls q ==<>
=< e, x1 , . . . , xn > falls q ==< x1 , . . . , xn >
head(q) = ⊥ falls q ==<>
= xn falls q ==< x1 , . . . , xn >
dequeue(q) = ⊥ falls q ==<>
=< x1 , . . . , xn−1 > falls q ==< x1 , . . . , xn >
1.84
Informelle Methode
Daten
Pierre Fierz
Einleitung
• Die formale (mathematische) Spezifikation eines ADT ist
eine sehr schwierige Aufgabe
• In vielen Fällen genügt eine weniger formale
Beschreibung des ADT
• Diese Beschreibung kann zum Beispiel in Form eines
Java-Interfaces geschehen
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
• Zu jeder Methode werden die Preconditions und
Postconditions angegeben
• Die Beschreibung kann auch in natürlicher Sprache sein
• Es ist darauf zu Achten, dass die Beschreibung möglichst
eindeutig ist.
1.85
Informelle Methode 2
Daten
Pierre Fierz
Beispiel: Informelle Spezifikation des Stacks
Einleitung
public interface Stack<Element> {
static public class StackFullException extends Exception{};
static public class StackEmptyException extends Exception{};
/**
* Dieses Interface definiert die Schnittstelle zu
* einem Stack von beliebigen Elementen des Typs
* Element Die Implementation steht noch offen.
*/
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
/** Preconditions: none
* Postconditions: none
* @return true falls keine Elemente im Stack sind.
*/
public boolean empty();
/** Preconditions: none
* Postconditions: none
* @return true falls kein Element eingefuegt
werden kann.
*
*/
public boolean full();
1.86
Informelle Methode 3
Daten
Pierre Fierz
Beispiel: Informelle Spezifikation des Stacks (forts.)
Einleitung
/** Preconditions: full() == false
* Postconditions: -- Ein Element (item) mehr auf dem Stack
new.empty() == false
*
new.top() == item
*
* @param item: neues Element zuoberst auf dem Stack
*/
public void push(Element item) throws StackFullException;
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
/** Preconditions: empty() == false
* Postconditions: -- Ein Element weniger auf dem Stack
new.push(old.top()) == old
*
* @return Oberstes Element des Stacks
*/
public Element pop() throws StackEmptyException;
/** Preconditions: empty() == false
* Postconditions: none
* @return old.top() (Oberstes Element des Stacks)
*/
public Element top() throws StackEmptyException;
}
1.87
Informelle Methode 4
Daten
Pierre Fierz
Beispiel: Bounded Implementation mit Array
public class BoundedStack<Element> implements Stack<Element> {
private int maxsize;
private int sp;
private Element[] st;
public BoundedStack(int size) {
maxsize = size;
sp = -1;
st = (Element[])new Object[size];
}
Einleitung
Datentypen
Abgeleitete Typen
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
public boolean full() {
return sp+1 == maxsize;
}
public boolean empty() {
return sp == -1;
}
public void push(Element e) throws StackFullException {
if (full()) throw new StackFullException();
st[++sp] = e;
}
public Element pop() throws StackEmptyException {
if (empty()) throw new StackEmptyException();
return st[sp--];
}
public Element top() throws StackEmptyException {
if (empty()) throw new StackEmptyException();
return st[sp];
}
}
1.88
Informelle Methode 5
Daten
Pierre Fierz
Beispiel: Unbounded Implementation mit Vector
import java.util.Vector;
Einleitung
public class MyStack<Element> implements Stack<Element> {
private Vector<Element> st;
Datentypen
Abgeleitete Typen
public MyStack() {
st = new Vector<Element>();
}
public boolean empty() {
return st.size() == 0;
}
Weitere
Datenstrukturen
Der Abstrakte
Datentyp (ADT)
public boolean full() {
// Immer false
return false;
}
public Element pop() throws StackEmptyException {
if (empty()) throw new StackEmptyException();
return st.remove(st.size() - 1);
}
public void push(Element item) {
st.add(item);
}
public Element top() throws StackEmptyException {
if (empty()) throw new StackEmptyException();
return st.elementAt(st.size() - 1);
}
}
1.89
Herunterladen