Dynamische Datenstrukturen

Werbung
Dynamische
Datenstrukturen
Dynamische Datenstrukturen
●
B-Bäume
–
größere Datenmengen verwalten
–
Extern speichern
–
Art der Speicherung berücksichtigen
–
sonst kein optimaler Datenzugriff möglich
–
Art der Speicherung großer Datenmengen
●
●
●
–
Magnetplatten (hard disc)
auch Platten (disc)
Speicherplatten
Datenstruktur um
●
Berücksichtigung der Verzögerungszeiten
Dynamische Datenstrukturen
●
Speicherhierarchien und Plattenspeicher
–
Speicherplatz nach verschiedenen Kriterien
●
●
●
●
●
●
–
Kosten,
Zugriffszeit,
Dauerhaftigkeit,
Zuverlässigkeit,
Schreibbarkeit
(ROM = Read Only Memory)
Usw
Hier wichtigsten Kriterien
●
●
Kosten und
Dynamische Datenstrukturen
●
Speicherhierarchien und Plattenspeicher
–
Speicherung durch magnetische Felder
Dynamische Datenstrukturen
●
Speicherhierarchien und Plattenspeicher
–
Prinzipieller Aufbau einer Magnetplatte
Dynamische Datenstrukturen
●
Speicherhierarchien und Plattenspeicher
–
Aufbau eines Plattenstapels mit mehreren
Magnetplatten und Schreibleseköpfen
Dynamische Datenstrukturen
●
Speicherhierarchien und Plattenspeicher
–
Aufteilung der Spuren einer Magnetplatte in
Sektoren
Dynamische Datenstrukturen
●
Struktur von B-Bäumen
–
balancierter Baum der Ordnung m,
●
●
–
Sämtliche Blätter gleiche Tiefe
jeder Knoten bis zu m Nachfolger
großer Verzweigungsgrad
●
●
●
gesuchte Information mit wenigen Zugriffen finden
Knoten in Blöcken im Plattenspeicher abgelegt
Zugriffszeit stark verringern
Dynamische Datenstrukturen
●
Struktur von B-Bäumen
–
je Knoten bis zu m–1 Schlüssel geordnet
●
(s1, s2, ...,sm–2, sm–1), wobei s1 < s2 < ... < sm–2 < sm–1
●
Adressinformation zi
●
(z0, s1, z1, s2, z2, ..., sm–2, zm–2, sm–1, zm–1).
Dynamische Datenstrukturen
●
Struktur von B-Bäumen
–
je Knoten bis zu m–1 Schlüssel geordnet
●
Schlüssel s zwischen sk–1 und sk: Zeiger zk–1
●
Schlüssel kleiner als s1: Zeiger z0,
●
●
{
z 0 zfalls
ss 1
Schlüssel größer als sm: Zeiger
m
Nachfolgeknoten zu s= z k −1 falls s k −1ss k
zm
falls s m s
m für jeweilige Anzahl von Schlüsseln
–
–
zwei benachbarte Knoten zusammen niemals weniger als m
Söhne
zu einem Knoten verschmelzen
Dynamische Datenstrukturen
●
Suchen in B-Bäumen
–
–
Schlüssel besitzen Verweis auf Datensatz
Schlüssel nicht im ersten Knoten
●
–
zu Knoten gehörende Seite mit Schlüsseln laden
●
●
–
Nachfolgeknoten suchen
Schlüssel weiter suchen
bis Blatt des B-Baums
Schlüssel nicht gefunden
●
●
nicht im B-Baum
entsprechende Meldung ausgeben
Dynamische Datenstrukturen
●
Einfügen in B-Bäume
–
Einfügen eines neuen Schlüssels
Dynamische Datenstrukturen
●
Einfügen in B-Bäume
–
Einfügen eines Schlüssels bei Knotenüberlauf
Dynamische Datenstrukturen
●
Einfügen in B-Bäume
–
Wenn auch Vaterknoten überläuft
●
●
Knoten aufspalten
in den meisten Implementierungen vor Einfügen
22
–
●
Neue Wurzel
beim Absenken aufspalten
neue Wurzel erzeugen
●
●
●
-
-
jeden vollständig gefüllten Knoten aufspalten
Wurzel erreicht
–
-
Wurzel
2 7 22 99
2 7
-
-
Beispiel: m=5
Wurzel ein Schlüssel
zwei Nachfolgeknoten
mit halber Schlüsselzahl (=m/2,m/2-1, oder 2(m-1)/2)
99 -
-
-
Dynamische Datenstrukturen
●
Einfügen in B-Bäume
–
Wenn auch Vaterknoten überläuft
●
Wurzel erreicht
–
●
Neue Wurzel 12 Wurzel
8 12 18
beim Absenken aufspalten
neue Wurzel erzeugen
16
● Beispiel: m=4
● Wurzel ein Schlüssel
● Zwei Nachfolgeknoten
mit halber Schlüsselzahl
(=m/2,m/2-1, oder 2(m-1)/2)
● Baum wächst nach oben zur Wurzel
● Baum bleibt ausgeglichen
Alternative Implementierung:
–
Suche Einfügestelle
-
8
-
-
18 16
-
Dynamische Datenstrukturen
●
Löschen in B-Bäumen
–
zunächst Schlüssel suchen
●
nächstgrößere Schlüssel an dessen Stelle
–
–
●
–
kleinster, der größer ist als dieser Schlüssel
stets in einem Blatt
nur Schlüssel von Blättern gelöscht
Anzahl der Seiten mit Knoten gering halten
●
●
mindestens (m – 1)/2 Schlüssel je Knoten
sonst folgende Operationen durchführen
Dynamische Datenstrukturen
●
Löschen in B-Bäumen
–
Anzahl der Seiten mit Knoten gering halten
●
●
●
mindestens (m – 1)/2
sonst folgende
Operation
durchführen
oder folgende
Dynamische Datenstrukturen
●
Eigenschaften von B-Bäumen
–
Tiefe sei T
2
3
K T =1mm m m
●
Anzahl der Knoten:
●
Max. Anzahl der Schlüssel:
●
T −1
mT −1
=
m−1
S T =K T⋅m−1=m T −1
Bei zufälliger Schlüsseleingabe ist
mittlere Füllung ≈ 2/3∙ST.
Dynamische Datenstrukturen
●
Top Down 2-3-4-Bäume
Dynamische Datenstrukturen
●
Rot-Schwarz-Bäume
–
Top Down 234-Baum in Binärbaum wandeln
–
Vollständig gefüllter Baum
6
2
6 15
2
–
17 gefüllter Baum
Nicht vollständig
15
15
15 17 -
15 17 15
17
Dynamische Datenstrukturen
●
Rot-Schwarz-Bäume
–
Top Down 234-Baum in
Binärbaum wandeln
27
15 27 37
15
37
11 - 20- 23 31 33 36 50 51 11
23
20
33
31
50
36
51
Dynamische Datenstrukturen
●
Rot-Schwarz-Bäume
–
Eigenschaften
1. Jeder Knoten ist entweder schwarz oder rot.
2. Ein roter Knoten hat zwei schwarze Kinder oder
keine Kinder (Blattknoten).
3. Ein schwarzer Knoten hat zwei Kinder; oder nur ein
rotes Kind, welches selbst keine Kinder hat
(Blattknoten).
4. Die Anzahl der schwarzen Verkettungen von der
Wurzel bis zum Blatt ist für jedes Blatt gleich.
5. Die Wurzel ist schwarz.
Dynamische Datenstrukturen
●
Rot-Schwarz-Bäume
–
Auch: letzte Blätter einheitlich Null-Knoten
●
–
Weitere Eigenschaften
●
●
●
●
–
Regel: Blattknoten sämtlich schwarz
Rote Verkettungen niemals direkt hintereinander
niemals mehr als doppelt so viele rote wie schwarze
Verkettungen
Verhältnis der Tiefe zweier Blätter höchstens 1:2
Bäume niemals völlig entartet
Durchsuchen
●
Kein zusätzlicher Aufwand gegenüber Binärbaum
Dynamische Datenstrukturen
●
Collections in Java
–
Standard-Klassen
Implementations
Collections
Hash Table Resizable Array Balanced Tree Linked List
TreeSet
Set HashSet
ArrayList
LinkedList
List
Interfaces Map HashMap
–
Menge (Set)
●
●
–
TreeMap
Zusammenfassung von Objekten
sämtlich verschieden
Liste (List)
●
Zugriff auf Objekte über Index
Dynamische Datenstrukturen
●
Collections in Java
–
Standard-Klassen
Implementations
Collections
Hash Table Resizable Array Balanced Tree Linked List
TreeSet
Set HashSet
ArrayList
LinkedList
List
Interfaces Map HashMap
–
TreeMap
Verschiedene Implementierungen
●
●
●
●
Hashen mit in der Regel O(1)-Komplexität
Felder (Größe passt sich der Füllung an)
Balancierter Rot-Schwarz-Baum
verkettete Liste
Dynamische Datenstrukturen
●
Prioritätswarteschlangen
–
Datenstruktur, welche Elemente mit kleinstem
(oder größtem) Schlüssel
●
●
●
–
auswählt
Entfernt
ändert
Lösung durch sortierte Liste
●
●
●
●
●
einfach
Aufwand O(N∙log N)
Einfügen Aufwand: O(N)
Entfernen Aufwand: O(N)
Aufwand zu groß (oder: es geht besser)
Dynamische Datenstrukturen
●
Anwendungen der Prioritätswarteschlangen
–
zeitdiskrete Simulationssysteme
●
nächste Element mit kleinster Aktivierungszeit
–
Scheduling von Aufträgen mit Prioritäten
–
numerische Berechnungen
●
Ausdrücke mit größtem Fehler zuerst berechnen
–
Algorithmen zum Durchsuchen von Graphen,
–
Algorithmen zum Verdichten von Dateien.
Dynamische Datenstrukturen
●
Schnittstellen einer Prioritätswarteschlange
●
●
●
●
●
●
●
Aufbauen einer Prioritätswarteschlange mit N
Elementen,
Einfügen eines Elements in eine
Prioritätswarteschlange,
Entfernen des kleinsten Elements aus einer
Prioritätswarteschlange,
Ersetzen des kleinsten Elements durch ein anderes
Verändern der Priorität eines Elements,
Löschen eines beliebigen Elements,
Verschmelzen zweier Prioritätswarteschlangen
Dynamische Datenstrukturen
●
Heaps als Prioritätswarteschlangen
–
Datenstruktur zum Sortieren von Daten
–
auch zur Implementierung von
Prioritätswarteschlangen geeignet
Aufbauen einer Prioritätswarteschlange mit N
Elementen
–
Heap aufbauen in O(N)
–
kleinstes Element steht an Platz 1 im Feld
Dynamische Datenstrukturen
Baue Prioritätswarteschlange mit N Elementen auf
–
Heap aufbauen in O(N)
–
kleinstes Element steht an Platz 1 im Feld
Füge Element in Prioritätswarteschlange ein
–
neues Element ans Ende des Heaps
–
durch 'Sift'-Operation Heap-Eigenschaft
wiederherstellen
–
Aufwand O(log N)
Dynamische Datenstrukturen
Entferne kleinstes Element aus
Prioritätswarteschlange
–
kleinstes Element steht an 1. Stelle
–
letztes Element an erste Stelle verbringen
–
durch 'Sift'-Operation Heap-Eigenschaft
wiederherstellen
–
Aufwand O(log N)
Ersetze kleinstes Element durch anderes
–
Schlüssel des 1. Elements verändern
–
Durch 'Sift'-Operation Heap-Eigenschaft
Dynamische Datenstrukturen
Verändere Priorität eines Elements
–
Ändere Schlüssel eines Elements in
–
Durch Sift-Up- oder Sift-Down-Operation HeapEigenschaft wiederherstellen
–
Aufwand O(log N)
Lösche beliebige Element
–
durch letztes Element des Heaps ersetzn
–
Durch Sift-Up- oder Sift-Down-Operation HeapEigenschaft wiederherstellen
Dynamische Datenstrukturen
Verschmelzung zweier Prioritätswarteschlangen zu einer größeren
–
beide Heaps in ein Feld kopieren
–
Heap-Eigenschaft wiederherstellen
–
Aufwand O(N)
–
Mit anderen Datenstrukturen schneller möglich
Dynamische Datenstrukturen
●
Skew Heaps als Prioritätswarteschlangen
–
Skew Heap
●
●
–
Merge
●
●
–
Verschmelzen zweier Heaps
Allgemein verwendbar
Einfügen
●
–
Nicht ausgeglichener Binärbaum
beliebig erweiterbare Datenstruktur
Merge(Knoten,SkewHeap)
Löschen
●
Merge(SkewHeap.Links, SkewHeap.Rechts)
Dynamische Datenstrukturen
●
Skew Heaps als Prioritätswarteschlangen
Daten merge(Daten links, Daten rechts){
if(links==null)
return rechts;
if(rechts==null) return links;
if(links.key<rechts.key) {
Daten swap
= links.links;
links.links
= merge(links.rechts, rechts);
links.rechts = swap;
return links;
} else {
Daten swap
= rechts.rechts;
Dynamische Datenstrukturen
●
Skew Heaps als Prioritätswarteschlangen
static int size = 0;
Daten SkewHeapEinfügen(int key, Daten wurzel)
{
size++;
return merge( wurzel, new Daten(key));
}
Daten SkewHeapLöschen(Daten wurzel) {
size--;
return merge( wurzel.links, wurzel.rechts);
Herunterladen