K27 Datenstrukturen Teil 1 Lernziele

Werbung
FHZ
Hochschule Technik+Architektur Luzern
Abteilung Informatik, Fach Programmieren
K27 Datenstrukturen Teil 1
K27 Datenstrukturen Teil 1
• Inhalt
Einführung
1. Arrays
1. Array unsortiert
2. Array sortiert
3. Heap
2. Listen
1. Einfach verkettete Liste unsortiert
2. Einfach verkettete Liste sortiert
3. Doppelt verkettete Liste sortiert
3. Bäume
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 1
Lernziele
• Sie festigen Ihr Wissen über Arrays und Heaps
• Sie verstehen die verschiedenen Arten der
Speicherung von Informationen in Listen
• Sie kennen sich mit den verschiedenen Arten von
binären Bäumen aus
• Sie wissen, wie binäre Bäume traversiert werden
können
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27_Datenstrukturen_Teil1-P.ppt, V20
2004 © Diego Schmidlin
K27 Datenstrukturen Teil 1
Folie 2
Teil 1
Seite 1
FHZ
Hochschule Technik+Architektur Luzern
Abteilung Informatik, Fach Programmieren
K27 Datenstrukturen Teil 1
Einführung
• Datenstrukturen
– Zentrale Bedeutung in der Programmierung
– Unabhängig von einer bestimmten Programmiersprache
• Typische Eigenschaften von Datenstrukturen sind:
?
?
?
?
?
–
–
–
–
Zugriffsart, z.B. direkt
Zugriffsmöglichkeiten, z.B. Nachfolger
Zugriffsaufwand, z.B. O(n)
statische oder dynamische Datenstrukturen
(vgl. Array vs. Bäume)
– implizite oder explizite Datenstrukturen
(vgl. Stack als Array oder Liste)
41
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 3
1. Arrays
• Array
– Grösse wird bei Deklaration oder Instanzierung festgelegt
– Zur Laufzeit ist Speicherplatz fest reserviert (statisch)
• Unabhängig, wie viele Komponenten des Arrays effektiv zum
Speichern von Daten benötigt werden
– Direkter Zugriff auf Komponente über Index
• direct access
• einfach, sehr schnell
– Arrays repräsentieren implizite Datenstrukturen
• Für das Festhalten der Beziehungen zwischen den Daten ist nicht
explizit Speicher erforderlich
• Beziehungen werden implizit festgehalten, z.B. durch Formeln
42
K27_Datenstrukturen_Teil1-P.ppt, V20
2004 © Diego Schmidlin
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 4
Teil 1
Seite 2
FHZ
Hochschule Technik+Architektur Luzern
Abteilung Informatik, Fach Programmieren
K27 Datenstrukturen Teil 1
1. Arrays
• In Java werden meistens Objekte in Arrays verwaltet
– Objekte via Referenzvariablen
"s"
"c"
"x"
"i"
"o"
"m"
"e"
"k"
0
1
2
3
4
5
6
7
array
8
9
– Vereinfacht
array
s
c
x
i
o
m
e
k
0
1
2
3
4
5
6
7
8
9
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
42
K27 Datenstrukturen Teil 1
Folie 5
1.1 Array unsortiert
array
s
c
x
i
o
m
e
k
0
1
2
3
4
5
6
7
8
9
• Zugriff auf Elemente
suchen
entfernen
einfügen
O(n)
O(n)*
O(1)
Nachfolger Vorgänger
nein
nein
sortierte
Ausgabe
nein
* inklusive Nachrücken bzw. Auffüllen mit letztem Element
• Bemerkung:
• Ein Array kann bekanntlich mit einem Aufwand von
O(n×log n) sortiert werden (vgl. Heapsort)
43
K27_Datenstrukturen_Teil1-P.ppt, V20
2004 © Diego Schmidlin
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 6
Teil 1
Seite 3
FHZ
Hochschule Technik+Architektur Luzern
Abteilung Informatik, Fach Programmieren
K27 Datenstrukturen Teil 1
1.2 Array sortiert
array
c
e
i
k
m
o
s
x
0
1
2
3
4
5
6
7
8
9
• Zugriff auf Elemente
suchen
entfernen
einfügen
O(log n)
O(n)*
O(n)*
Nachfolger Vorgänger
ja
sortierte
Ausgabe
ja
ja
* inklusive Nachrücken
• Bemerkung:
• Das Suchen erfolgt nun einfach binär
43
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 7
1.3 Heap
• Nicht verwechseln mit dynamischer Speicherverwaltung!
• Ein Heap ist ein binärer Baum, der
– eine strukturelle Bedingung erfüllt
• ein fast vollständiger Baum ist (vgl. 3.5),
– eine inhaltliche Bedingung erfüllt
• jeder innere Knoten besitzt eine höhere Priorität als seine Söhne
– auf eine spezielle Weise in einem Array abgespeichert ist
44
K27_Datenstrukturen_Teil1-P.ppt, V20
2004 © Diego Schmidlin
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 8
Teil 1
Seite 4
FHZ
Hochschule Technik+Architektur Luzern
Abteilung Informatik, Fach Programmieren
K27 Datenstrukturen Teil 1
1.3 Heap
•
Entfernen des Wurzelelementes
–
Durch Methode getMaximum()
–
–
Baum muss reorganisiert werden
Erfüllung der strukturelle und inhaltliche Bedingung
1. Wurzelelement entfernen: O(1)
getMaximum()
17
15
10
9
5
4
2
1
12
13
3
8
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
45
K27 Datenstrukturen Teil 1
Folie 9
1.3 Heap
2. Blatt ganz unten rechts zur Wurzel hoch verschieben: O(1)
8
10
15
5
4
9
2
1
13
12
3
3. Sinkprozess durchführen: O(log n)
15
15
10
8
5
4
9
2
1
45
K27_Datenstrukturen_Teil1-P.ppt, V20
2004 © Diego Schmidlin
13
3
10
13
5
12
4
9
2
1
8
12
3
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 10
Teil 1
Seite 5
FHZ
Hochschule Technik+Architektur Luzern
Abteilung Informatik, Fach Programmieren
K27 Datenstrukturen Teil 1
1.3 Heap
•
Auch insert() muss beide Bedingungen sicherstellen:
1. Neues Element als Blatt ganz unten rechts einfügen: O(1)
15
10
13
5
9
12
8
insert()
4
2
1
3
14
2. Steigprozess durchführen: O(log n)
15
15
13
10
5
4
14
9
2
1
3
14
10
12
5
4
8
13
9
1
2
12
8
3
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
46
K27 Datenstrukturen Teil 1
Folie 11
1.3 Heap
• Abbildung des fast vollständigen binäre Baums in
einem Array a:
12
15
13
8
17
3
9
1
10
2
5
4
a
9
13 12 4
2
1
3
0
4
5
8
9
10 11 12 13 14 15 16 17
1
2
3
6
7
Vater mit Index
(j-1)/2
Vater mit Index i
47
K27_Datenstrukturen_Teil1-P.ppt, V20
2004 © Diego Schmidlin
...
17 10 15 5
linker Sohn mit
Index (2⋅i)+1
8
Sohn mit Index j
rechter Sohn mit
Index 2⋅(i+1)
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 12
Teil 1
Seite 6
FHZ
Hochschule Technik+Architektur Luzern
Abteilung Informatik, Fach Programmieren
K27 Datenstrukturen Teil 1
1.3 Heap
• Aufwände bezüglich:
– getMaximum(): O(1) + O(1) + O(log n) =
– insert():
O(1) + O(log n) =
O(log n)
O(log n)
• Zugriff auf Elemente
suchen
entfernen*
einfügen
O(n)
O(log n)
O(log n)
Nachfolger Vorgänger
nein
nein
sortierte
Ausgabe
"nein"
* nur Maximum (oder Minimum) inklusive Reorganisation
47
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 13
2. Listen
• Liste
– Mit Hilfe von Referenzvariablen und Objekten
Datenstrukturen dynamisch auf- und abbauen
• Nur soviel Speicherplatz allozieren, wie benötigt wird
• Von Anzahl Objekten abhängig
– Objekte sind nicht mehr direkt ansprechbar
• Nur noch indirekt über Referenzvariablen
– Listen repräsentieren explizite Datenstrukturen
• Für das Festhalten der Beziehungen zwischen den Daten ist
explizit Speicher erforderlich
48
K27_Datenstrukturen_Teil1-P.ppt, V20
2004 © Diego Schmidlin
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 14
Teil 1
Seite 7
FHZ
Hochschule Technik+Architektur Luzern
Abteilung Informatik, Fach Programmieren
K27 Datenstrukturen Teil 1
2. Listen
• In Java werden Objekte in Listen verwaltet
– Objekte via Referenzvariablen
– Verweis auf nächstes Objekt via Referenzvariable
"s"
"c"
"x"
"i"
"o"
"m"
liste
– Vereinfacht
s
c
x
i
o
m
liste
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
48
K27 Datenstrukturen Teil 1
Folie 15
2.1 Einfach verkettete Liste unsortiert
s
c
x
i
o
m
liste
• Zugriff auf Elemente
suchen
entfernen
einfügen
O(n)
O(n)
O(1)
49
K27_Datenstrukturen_Teil1-P.ppt, V20
2004 © Diego Schmidlin
Nachfolger Vorgänger
nein
nein
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
sortierte
Ausgabe
nein
K27 Datenstrukturen Teil 1
Folie 16
Teil 1
Seite 8
FHZ
Hochschule Technik+Architektur Luzern
Abteilung Informatik, Fach Programmieren
K27 Datenstrukturen Teil 1
2.2 Einfach verkettete Liste sortiert
c
i
m
o
s
x
liste
• Zugriff auf Elemente
suchen
entfernen
einfügen
O(n)
O(n)
O(n)
Nachfolger Vorgänger
ja
sortierte
Ausgabe
nein
ja
• Bemerkung:
• Handhabung von sortierten, einfach verketteten Listen ist
relativ aufwendig
• Deshalb werden sie eher selten eingesetzt
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
49
K27 Datenstrukturen Teil 1
Folie 17
2.3 Doppelt verkettete Liste sortiert
c
i
m
o
head
tail
• Zugriff auf Elemente
suchen
entfernen
einfügen
O(n)
O(n)
O(n)
4 10
K27_Datenstrukturen_Teil1-P.ppt, V20
2004 © Diego Schmidlin
Nachfolger Vorgänger
ja
ja
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
sortierte
Ausgabe
ja
K27 Datenstrukturen Teil 1
Folie 18
Teil 1
Seite 9
FHZ
Hochschule Technik+Architektur Luzern
Abteilung Informatik, Fach Programmieren
K27 Datenstrukturen Teil 1
3. Bäume
• Bäume
– Weitere wichtige dynamische Datenstrukturen
• Verwendung bei:
– hierarchischen Beziehungen
– rekursiven Objektstrukturen
4 11
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 19
3.1 Beispiele
a) Sortierte Namen
b) Arithmetischer Ausdruck: z.B. (8+(7*2))*(4-(2/3))
4 11
K27_Datenstrukturen_Teil1-P.ppt, V20
2004 © Diego Schmidlin
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 20
Teil 1
Seite 10
FHZ
Hochschule Technik+Architektur Luzern
Abteilung Informatik, Fach Programmieren
K27 Datenstrukturen Teil 1
3.1 Beispiele
c) Quadtree
Nummerierung
der Quadranten:
1
1
2
3
2
3
1
2
3
4
4
4
4 12
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 21
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 22
3.2 Terminologie
4 12
K27_Datenstrukturen_Teil1-P.ppt, V20
2004 © Diego Schmidlin
Teil 1
Seite 11
FHZ
Hochschule Technik+Architektur Luzern
Abteilung Informatik, Fach Programmieren
K27 Datenstrukturen Teil 1
3.3 Binäre Bäume
• Ein binärer Baum ist ein Baum mit Grad 2:
• Minimale Höhe hmin
Binärer Baum mit n Knoten
(vgl. vollständig ausgeglichener binärer Baum) :
?
– hmin = aufgerundet ld(n + 1)
• Maximale Höhe hmax
Binärer Baum mit n Knoten (vgl. lineare Liste):
?
– hmax = n
Hinweis: ld n = (log n) / (log 2) ð O(ld n) = O(log n)
4 13
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 23
3.3 Binäre Bäume
• Minimale Weglänge wmin
Beliebiger binärer Baum (vgl. Wurzel):
?
– wmin = 1
• Maximale Weglänge wmax
Binärer Baum mit n Knoten (vgl. lineare Liste):
?
– wmax = hmax
• Mittlere Weglänge wmittel
Zufälliger binärer Baum mit n Knoten
(gilt für grosse n):
?
– wmittel ≈ 1,4 ⋅ hmin
4 13
K27_Datenstrukturen_Teil1-P.ppt, V20
2004 © Diego Schmidlin
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 24
Teil 1
Seite 12
FHZ
Hochschule Technik+Architektur Luzern
Abteilung Informatik, Fach Programmieren
K27 Datenstrukturen Teil 1
3.3 Binäre Bäume
• Vollständiger binärer Baum
– Ein binärer Baum der Höhe h heisst vollständig, wenn er
aus n = 2h - 1 Knoten besteht
– Er besitzt dann natürlich die kleinstmögliche Höhe h = hmin
4 14
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 25
3.4 Fast vollständiger binärer Baum
• Fast vollständiger binärer Baum
– Unterschied zu vollständigen Baum mit der Höhe h:
• Niveau h muss nicht vollständig mit Blättern belegt sein
• Vorhandene Blätter auf Niveau h müssen sich ganz links befinden
– Besitzt ebenfalls die kleinstmögliche Höhe h = hmin
4 14
K27_Datenstrukturen_Teil1-P.ppt, V20
2004 © Diego Schmidlin
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 26
Teil 1
Seite 13
FHZ
Hochschule Technik+Architektur Luzern
Abteilung Informatik, Fach Programmieren
K27 Datenstrukturen Teil 1
3.5 Vollständig ausgeglichener binärer Baum
• Vollständig ausgeglichener binärer Baum
– Für jeden inneren Knoten
• unterscheiden sich die Anzahl Knoten in linken und rechten
Teilbaum um höchstens 1
– Besitzt ebenfalls die kleinstmögliche Höhe h = hmin
4 15
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 27
3.6 Ausgeglichener binärer Baum AVL-Baum
• Ausgeglichener binärer Baum AVL-Baum
– Adelson-Velskii und Landis, 1962
– Für jeden inneren Knoten
• unterscheiden sich die Höhen in linken und rechten Teilbaum
um höchstens 1
– Die Höhe lässt sich unabhängig von n abschätzen
• Höhe h < 1.45 * hmin
4 15
K27_Datenstrukturen_Teil1-P.ppt, V20
2004 © Diego Schmidlin
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 28
Teil 1
Seite 14
FHZ
Hochschule Technik+Architektur Luzern
Abteilung Informatik, Fach Programmieren
K27 Datenstrukturen Teil 1
3.7 Geordneter binärer Baum
• Geordneter binärer Baum
– Jedem Knoten ist ein Schlüssel zugeordnet
• z.B. Nummer oder Namen
– Einfügen eines neuen Knotens
• entsprechend der definierten Ordnung auf den Schlüsselwerten
• immer als Blatt
– Die Höhe des Baumes ist abhängig von der Reihenfolge
der Schlüssel
• Die Höhe liegt im Bereich h = hmin ... hmax
4 16
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 29
3.7 Geordneter binärer Baum
• Beispiel:
– 7 8 1 14 10 27 4 6 8 ð
4 16
K27_Datenstrukturen_Teil1-P.ppt, V20
2004 © Diego Schmidlin
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 30
Teil 1
Seite 15
FHZ
Hochschule Technik+Architektur Luzern
Abteilung Informatik, Fach Programmieren
K27 Datenstrukturen Teil 1
3.7 Geordneter binärer Baum
• Bester Fall
– Binäre Baum ist vollständig ausgeglichen
– Höhe h = hmin
4 17
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 31
3.7 Geordneter binärer Baum
• Schlechtester Fall
– Binäre Baum ist lineare Liste
– Höhe h = hmax
4 17
K27_Datenstrukturen_Teil1-P.ppt, V20
2004 © Diego Schmidlin
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 32
Teil 1
Seite 16
FHZ
Hochschule Technik+Architektur Luzern
Abteilung Informatik, Fach Programmieren
K27 Datenstrukturen Teil 1
3.8 Durchlaufen eines Baumes
• Durchlaufen eines Baumes
– Tree Traversal
– Alle Knoten bzw. Objekte eines Baumes bearbeiten
– Drei Varianten für das Durchlaufen des Baumes
– Diese Varianten sind rekursiv wie folgt definiert:
W
L
4 18
R
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 33
3.8 Durchlaufen eines Baumes
1. Preorder:
?
– W, L, R
– die Wurzel vor den Teilbäumen
2. Inorder:
?
W
– L, W, R
3. Postorder:
?
L
R
– L , R, W
– die Wurzel nach den Teilbäumen
4 18
K27_Datenstrukturen_Teil1-P.ppt, V20
2004 © Diego Schmidlin
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 34
Teil 1
Seite 17
FHZ
Hochschule Technik+Architektur Luzern
Abteilung Informatik, Fach Programmieren
K27 Datenstrukturen Teil 1
3.8 Durchlaufen eines Baumes
• Beispiel
– Arithmetischer Ausdruck
(8+(7*2))*(4-(2/3))
1. Preorder (W, L, R)
ð Prefix:
2. Inorder (L, W, R)
ð Infix:
(vgl. Normalfall)
3. Postorder (L, R, W)
ð Postfix:
(vgl. hp)
* + 8 * 7 2 - 4 / 2 3
8 + 7 * 2 * 4 - 2 / 3
8 7 2 * + 4 2 3 / - *
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
4 18
K27 Datenstrukturen Teil 1
Folie 35
3.9 Aufwand bei geordneten binären Bäumen
• Aufwand allgemein
– Höhe des Baumes ist massgebend
– Suchen
• maximale Weglänge
• Vergleich bei jedem Knoten
– gewünschter Knoten gefunden
– im linken oder rechten Teilbaum weitersuchen
– Pro traversiertem Knoten typisch 2 Vergleiche erforderlich
suchen
entfernen
einfügen
O(log n)
...O(n)
O(log n)
...O(n)
O(log n)
...O(n)
4 19
K27_Datenstrukturen_Teil1-P.ppt, V20
2004 © Diego Schmidlin
Nachfolger Vorgänger
nein
nein
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
sortierte
Ausgabe
ja
K27 Datenstrukturen Teil 1
Folie 36
Teil 1
Seite 18
FHZ
Hochschule Technik+Architektur Luzern
Abteilung Informatik, Fach Programmieren
K27 Datenstrukturen Teil 1
3.9 Aufwand bei geordneten binären Bäumen
• Für geordnete ausgeglichene binäre Bäume
(AVL-Bäume) gilt:
suchen
entfernen
einfügen
O(log n)
O(log n)
O(log n)
Nachfolger Vorgänger
nein
sortierte
Ausgabe
nein
ja
• Bemerkungen:
– Hat man Pech, so ist ein binärer Baum zu einer Liste entartet
• Bedeutet Mehraufwand
– Die Algorithmen für AVL-Bäume sind komplex
• Justierung des Baums nach jedem Entfernen und Einfügen
• Eine weniger komplexe Alternative stellen sogenannte Skip-Listen dar
– Aufwand von O(log n) ist gleichwertig wie ein Aufwand von O(ld n)
4 19
K27_Datenstrukturen_Teil1-P.ppt, V20
2004 © Diego Schmidlin
Abteilung Informatik, Fach Programmieren
2004 © Diego Schmidlin V20
K27 Datenstrukturen Teil 1
Folie 37
Teil 1
Seite 19
Herunterladen