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 ss 1 Schlüssel größer als sm: Zeiger m Nachfolgeknoten zu s= z k −1 falls s k −1ss 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 =1mm 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);