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
Speicherhierarchien und Plattenspeicher Speicherung durch magnetische Felder
Speicherhierarchien und Plattenspeicher Prinzipieller Aufbau einer Magnetplatte
Speicherhierarchien und Plattenspeicher Aufbau eines Plattenstapels mit mehreren Magnetplatten und Schreibleseköpfen
Speicherhierarchien und Plattenspeicher Aufteilung der Spuren einer Magnetplatte in Sektoren
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
Struktur von B-Bäumen je Knoten bis zu m 1 Schlüssel geordnet (s 1, s 2,...,s m 2, s m 1 ), wobei s 1 < s 2 <... < s m 2 < s m 1 Adressinformation z i (z 0, s 1, z 1, s 2, z 2,..., s m 2, z m 2, s m 1, z m 1 ).
Struktur von B-Bäumen je Knoten bis zu m 1 Schlüssel geordnet Schlüssel s zwischen s k 1 und s k : Zeiger z k 1 Schlüssel kleiner als s 1 : Zeiger z 0, Schlüssel größer als s m : Zeiger 0 zfalls m s s 1 Nachfolgeknoten zu s={z z k 1 falls s k 1 s s k falls s m s z m m für jeweilige Anzahl von Schlüsseln zwei benachbarte Knoten zusammen niemals weniger als m Söhne zu einem Knoten verschmelzen
Suchen in B-Bäumen Schlüssel besitzen Verweis auf Datensatz Schlüssel nicht im ersten Knoten Nachfolgeknoten suchen zu Knoten gehörende Seite mit Schlüsseln laden Schlüssel weiter suchen bis Blatt des B-Baums Schlüssel nicht gefunden nicht im B-Baum entsprechende Meldung ausgeben
Einfügen in B-Bäume Einfügen eines neuen Schlüssels
Einfügen in B-Bäume Einfügen eines Schlüssels bei Knotenüberlauf
Wurzel ein Schlüssel zwei Nachfolgeknoten mit halber Schlüsselzahl (=m/2,m/2-1, oder 2 (m-1)/2) Dynamische Datenstrukturen Einfügen in B-Bäume Wenn auch Vaterknoten überläuft Knoten aufspalten in den meisten Implementierungen vor Einfügen jeden vollständig gefüllten Knoten aufspalten Wurzel erreicht beim Absenken aufspalten neue Wurzel erzeugen Beispiel: m=5 2 7 22 99 Wurzel Neue Wurzel 2 7 - - 22 - - - 99 - - -
Einfügen in B-Bäume Wenn auch Vaterknoten überläuft Wurzel erreicht beim Absenken aufspalten neue Wurzel erzeugen 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 Wurzel 8 12 18 16 Neue Wurzel 8 - - 12 - - 18 - - 16
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
Löschen in B-Bäumen Anzahl der Seiten mit Knoten gering halten mindestens (m 1)/2 sonst folgende Operation durchführen oder folgende
Eigenschaften von B-Bäumen Tiefe sei T Anzahl der Knoten: Max. Anzahl der Schlüssel: K T =1 m m 2 m 3 m 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 S T.
Top Down 2-3-4-Bäume
Rot-Schwarz-Bäume Top Down 234-Baum in Binärbaum wandeln Vollständig gefüllter Baum 2 6 15 6 2 15 Nicht vollständig 17 gefüllter Baum 15 17-15 17-15 15 17
Rot-Schwarz-Bäume Top Down 234-Baum in Binärbaum wandeln 15 27 37 27 15 37 11-20- 23-31 33 36 50 51-11 23 33 50 20 31 36 51
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.
Rot-Schwarz-Bäume Auch: letzte Blätter einheitlich Null-Knoten Regel: Blattknoten sämtlich schwarz Weitere Eigenschaften 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
Collections in Java Standard-Klassen Collections Set List Interfaces Map Implementations Hash Table Resizable Array Balanced Tree HashSet TreeSet ArrayList HashMap TreeMap Linked List LinkedList Menge (Set) Zusammenfassung von Objekten sämtlich verschieden Liste (List) Zugriff auf Objekte über Index
Collections in Java Standard-Klassen Collections Set List Interfaces Map Implementations Hash Table Resizable Array Balanced Tree HashSet TreeSet ArrayList HashMap TreeMap Linked List LinkedList 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
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)
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.
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
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
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)
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
Verändere Priorität eines Elements Ändere Schlüssel eines Elements in Durch Sift-Up- oder Sift-Down-Operation Heap- Eigenschaft wiederherstellen Aufwand O(log N) Lösche beliebige Element durch letztes Element des Heaps ersetzn Durch Sift-Up- oder Sift-Down-Operation Heap- Eigenschaft wiederherstellen
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
Skew Heaps als Prioritätswarteschlangen Skew Heap Nicht ausgeglichener Binärbaum beliebig erweiterbare Datenstruktur Merge Verschmelzen zweier Heaps Allgemein verwendbar Einfügen Merge(Knoten,SkewHeap) Löschen Merge(SkewHeap.Links, SkewHeap.Rechts)
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;
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);