elementare Datenstrukturen Wie die Daten das Laufen lernten Andreas Ferber [email protected] elementare Datenstrukturen – p.1/40 KISS elementare Datenstrukturen – p.2/40 KISS (Keep It Simple, Stupid) Immer die einfachste mögliche Datenstruktur benutzen! elementare Datenstrukturen – p.2/40 (Container-)Datenstrukturen • speichern große und variable Mengen zusammengehöriger Daten elementare Datenstrukturen – p.3/40 (Container-)Datenstrukturen • speichern große und variable Mengen zusammengehöriger Daten • erleichtern deren Handhabung elementare Datenstrukturen – p.3/40 (Container-)Datenstrukturen • speichern große und variable Mengen zusammengehöriger Daten • erleichtern deren Handhabung • präsentieren die Daten in einer geeigneten Form für einen Algorithmus elementare Datenstrukturen – p.3/40 (Container-)Datenstrukturen • speichern große und variable Mengen zusammengehöriger Daten • erleichtern deren Handhabung • präsentieren die Daten in einer geeigneten Form für einen Algorithmus • Hilfsmittel bei Effizienzabschätzungen elementare Datenstrukturen – p.3/40 Arrays und Vektoren • einfache Handhabung • in den meisten Sprachen eingebaut • Vektor = eindimensionales Array • Beispiel Java: int a[] = new int[42]; a[23] = 4711; int koelnisch_wasser = a[23]; elementare Datenstrukturen – p.4/40 Terminologie: Graphen • Knoten und Kanten a f b c d e elementare Datenstrukturen – p.5/40 Terminologie: Graphen • Knoten und Kanten a c • f b d e gerichtete Kanten (Pfeile) elementare Datenstrukturen – p.5/40 Terminologie: Graphen • Knoten und Kanten a c • f b d e gerichtete Kanten (Pfeile) elementare Datenstrukturen – p.5/40 Listen elementare Datenstrukturen – p.6/40 Listen • gerichtete Graphen • einfach verkettet: jeder Knoten besitzt einen Pfeil zu seinem Nachfolger • doppelt verkettet: Pfeile zu Nachfolger und Vorgänger elementare Datenstrukturen – p.7/40 Darstellung von Knoten in Java public class SListNode { public Object data; public SListNode next; } public class DListNode { public Object data; public DListNode prev, next; } elementare Datenstrukturen – p.8/40 Einfügen in eine Liste • gegeben: Knoten N , Vorgänger S S S N N N.next = S.next; S.next = N; elementare Datenstrukturen – p.9/40 Einfügen in eine Liste • gegeben: Knoten N , Vorgänger S S S N N N.next = S.next; S.next = N; N.prev = S; N.next.prev = N; elementare Datenstrukturen – p.9/40 Entfernen von Listenelementen • gegeben: Vorgänger S S S S.next = S.next.next; elementare Datenstrukturen – p.10/40 Entfernen von Listenelementen • gegeben: Vorgänger S S S S.next = S.next.next; S.next.prev = S; elementare Datenstrukturen – p.10/40 Durchlaufen von Listen • gegeben: Knoten N • Nachfolger: N = N.next; • Vorgänger: N = N.prev; elementare Datenstrukturen – p.11/40 Komplexität: Vektor vs. Liste Vektor Liste einfach doppelt Speicherbedarf O(n) O(n) O(n) Aufbau Einfügen Löschen Nachfolger Vorgänger Zugriff Suche O(n) O(n) O(n) O(1) O(1) O(1) O(n) O(n) O(1) O(1) O(1) O(n) O(n) O(n) O(n) O(1) O(1) O(1) O(1) O(n) O(n) elementare Datenstrukturen – p.12/40 Overhead von Datenstrukturen • Aufwand zur Speicherung und Pflege der Datenstrukturen selbst • geht ein in konstante Faktoren bei Komplexitätsbetrachtungen elementare Datenstrukturen – p.13/40 (Mikro-)Optimierungen bei Listen • zusätzlich gemerkte Referenz auf das Ende ermöglicht Anhängen in O(1) • Länge der Liste merken • unbenutzter Knoten am Anfang oder Ringbildung erspart Spezialfälle elementare Datenstrukturen – p.14/40 Bäume elementare Datenstrukturen – p.15/40 Bäume • gerichtete azyklische Graphen • jeder Knoten besitzt höchstens einen Vorgänger (parent) • jeder Knoten besitzt keinen, einen oder mehrere Nachfolger (childs) elementare Datenstrukturen – p.16/40 Terminologie: Bäume • Blattknoten (leaf): kein Nachfolger • innere Knoten: alle außer den Blättern • Wurzelknoten (root): einziger Knoten ohne Vorgänger • • Zweig (branch): Pfad von der Wurzel bis zu einem Blatt R L L L L Schlüssel (key): in einem Knoten gespeicherter Wert elementare Datenstrukturen – p.17/40 binäre Bäume • jeder Knoten besitzt höchstens zwei Nachfolger • Sortierung z.B.: • Werte in den Blättern speichern • Schlüssel von inneren Knoten so wählen, daß gilt: • linker Teilbaum: alle Schlüssel kleiner oder gleich dem des Knotens • rechter Teilbaum: alle Schlüssel größer als der des Knotens elementare Datenstrukturen – p.18/40 Suche in binären Bäumen • gegeben: gesuchter Schlüssel S , Wurzel R C←R while (C 6= null) ∧ (C is not leaf) do if S ≤ C.key then C ← C.lef t else C ← C.right end if end while if (C 6= null) ∧ (C.key = S) then found else not found end if elementare Datenstrukturen – p.19/40 Entartung von Bäumen • Baum wird effektiv zu einfach verketteter Liste: R • ⇒ Baum muß ausbalanciert werden elementare Datenstrukturen – p.20/40 balancierte Bäume • spezielle Algorithmen für Veränderungen am Baum • der Baum bleibt immer (annähernd) ausbalanciert • Beispiele: • AVL-Trees • 2-3-Trees • 2-3-4-Trees • Red/Black-Trees elementare Datenstrukturen – p.21/40 Red/Black-Trees • „rote“ und „schwarze“ Kanten • Invarianten: • alle Zweige haben die gleiche Anzahl schwarzer Kanten • alle Blätter sind durch schwarze Kanten angebunden • auf keinem Pfad folgen zwei rote Kanten direkt aufeinander längster Zweig höchstens doppelt so lang wie kürzester Zweig • ⇒ elementare Datenstrukturen – p.22/40 RB-Trees: Beispiel R c a b d g e h f elementare Datenstrukturen – p.23/40 RB-Trees: Beispiel R c a b d g h ? e elementare Datenstrukturen – p.23/40 RB-Trees: Beispiel R c a b d g e h f elementare Datenstrukturen – p.23/40 RB-Tree-Knoten in Java public class RBTreeNode { Object key; RBTreeNode left, right, parent; boolean isBlack; } elementare Datenstrukturen – p.24/40 Einfügen in RB-Trees Phase I • gegeben: neuer Knoten S • 1. S suchen, fertig falls gefunden 2. letzten besuchten Knoten S 0 merken 3. S 0 durch neuen roten Knoten R mit S und S 0 als Nachfolger ersetzen (Schlüssel von R: kleinerer der Werte S und S 0 ) Q Q S’ R S S’ elementare Datenstrukturen – p.25/40 Einfügen in RB-Trees Phase II P Q 1 R 2 S S’ (Fall 1) elementare Datenstrukturen – p.26/40 Einfügen in RB-Trees Phase II P P Q 1 R 2 Q 1 S (Fall 1) R 2 S’ S S’ (Fall 2) elementare Datenstrukturen – p.26/40 Einfügen in RB-Trees Phase II P P Q 1 Q 1 R 2 S (Fall 1) P R 2 S’ Q 1 S (Fall 2) R 2 S’ S S’ (Fall 3) elementare Datenstrukturen – p.26/40 Einfügen in RB-Trees Phase II P P Q 1 Q 1 R 2 3 (Fall 1) P R 2 4 Q 1 3 (Fall 2) R 2 4 3 4 (Fall 3) elementare Datenstrukturen – p.26/40 Einfügen in RB-Trees Phase II (2a) • Fall 2a: Links-Rotation P Q 1 R 2 3 4 elementare Datenstrukturen – p.27/40 Einfügen in RB-Trees Phase II (2a) • Fall 2a: Links-Rotation Q P Q 1 P R 2 3 1 R 2 3 4 4 elementare Datenstrukturen – p.27/40 Einfügen in RB-Trees Phase II (2a) • Fall 2a: Links-Rotation Q P Q 1 P R 2 3 1 R 2 3 4 4 elementare Datenstrukturen – p.27/40 Einfügen in RB-Trees Phase II (2b) • Fall 2b: Rechts-Links-Rotation P Q 1 R 2 4 3 elementare Datenstrukturen – p.28/40 Einfügen in RB-Trees Phase II (2b) • Fall 2b: Rechts-Links-Rotation P P Q 1 R R 1 4 Q 2 3 2 3 4 elementare Datenstrukturen – p.28/40 Einfügen in RB-Trees Phase II (2b) • Fall 2b: Rechts-Links-Rotation P P Q 1 R 2 4 3 R 1 Q 2 3 4 elementare Datenstrukturen – p.28/40 Einfügen in RB-Trees Phase II (2b) • Fall 2b: Rechts-Links-Rotation P Q 1 R 2 R P 4 3 R 1 P Q 2 3 1 Q 2 3 4 4 elementare Datenstrukturen – p.28/40 Einfügen in RB-Trees Phase II (2b) • Fall 2b: Rechts-Links-Rotation P Q 1 R 2 R P 4 3 R 1 P Q 2 3 1 Q 2 3 4 4 elementare Datenstrukturen – p.28/40 Einfügen in RB-Trees Phase II (3) • Fall 3: neu kolorieren und aufwärts bewegen P Q 1 R 2 3 4 elementare Datenstrukturen – p.29/40 Einfügen in RB-Trees Phase II (3) • Fall 3: neu kolorieren und aufwärts bewegen P P Q 1 R 2 3 Q 1 R 2 4 3 4 elementare Datenstrukturen – p.29/40 Einfügen in RB-Trees Phase II (3) • Fall 3: neu kolorieren und aufwärts bewegen P Q 1 P’ P R 2 3 Q 1 R 2 4 3 Q’ 1’ 2’ 4 R’ =P 3’ =1 4’ elementare Datenstrukturen – p.29/40 Einfügen in RB-Trees Phase II (3) • Fall 3: neu kolorieren und aufwärts bewegen P Q 1 P’ P R 2 3 Q 1 R 2 4 3 Q’ 1’ 2’ 4 R’ =P 3’ =1 4’ elementare Datenstrukturen – p.29/40 Entfernen aus RB-Trees Phase I • gegeben: zu entfernender Wert S • 1. Wert S im Baum suchen 2. Knoten S und Vorgänger P entfernen Q P S Q Q S’ S’ P S Q S’ S’ S’ short node elementare Datenstrukturen – p.30/40 Entfernen aus RB-Trees Phase II (1) Q R X 1 2 elementare Datenstrukturen – p.31/40 Entfernen aus RB-Trees Phase II (1) (2) Q R X 1 Q R X S 2 1 3 2 elementare Datenstrukturen – p.31/40 Entfernen aus RB-Trees Phase II (1) (2) Q R X 1 (3) Q R X S 2 1 Q R X 3 1 2 2 elementare Datenstrukturen – p.31/40 Entfernen aus RB-Trees Phase II (1) (2) Q R X 1 (3) Q R X S 2 1 (4) Q R X 3 1 2 2 Q R X 1 2 elementare Datenstrukturen – p.31/40 Entfernen aus RB-Trees Phase II (1) • Fall 1: Rotation und umfärben Q R X 1 2 elementare Datenstrukturen – p.32/40 Entfernen aus RB-Trees Phase II (1) • Fall 1: Rotation und umfärben Q R R X 1 Q 2 X 2 1 elementare Datenstrukturen – p.32/40 Entfernen aus RB-Trees Phase II (1) • Fall 1: Rotation und umfärben Q R R X 1 Q 2 X 2 1 elementare Datenstrukturen – p.32/40 Entfernen aus RB-Trees Phase II (1) • Fall 1: Rotation und umfärben Q R R X 1 Q 2 X 2 1 elementare Datenstrukturen – p.32/40 Entfernen aus RB-Trees Phase II (2) • Fall 2: Doppel-Rotation und umfärben Q R X S 1 3 2 elementare Datenstrukturen – p.33/40 Entfernen aus RB-Trees Phase II (2) • Fall 2: Doppel-Rotation und umfärben Q Q R X S 1 3 2 S X R 1 2 3 elementare Datenstrukturen – p.33/40 Entfernen aus RB-Trees Phase II (2) • Fall 2: Doppel-Rotation und umfärben Q Q R X S 1 2 S X 3 S Q R 1 2 X R 1 2 3 3 elementare Datenstrukturen – p.33/40 Entfernen aus RB-Trees Phase II (2) • Fall 2: Doppel-Rotation und umfärben Q Q R X S 1 2 S X 3 S Q R 1 2 X R 1 2 3 3 elementare Datenstrukturen – p.33/40 Entfernen aus RB-Trees Phase II (2) • Fall 2: Doppel-Rotation und umfärben Q Q R X S 1 2 S X 3 S Q R 1 2 X R 1 2 3 3 elementare Datenstrukturen – p.33/40 Entfernen aus RB-Trees Phase II (3) • Fall 3: neu kolorieren Q R X 1 2 Q R X 1 2 elementare Datenstrukturen – p.34/40 Entfernen aus RB-Trees Phase II (3) • Fall 3: neu kolorieren Q Q R X 1 2 1 Q 1 2 Q R X R X R X 2 1 2 elementare Datenstrukturen – p.34/40 Entfernen aus RB-Trees Phase II (3) • Fall 3: neu kolorieren Q Q R X 1 2 1 Q 1 2 Q R X R X R X 2 1 2 elementare Datenstrukturen – p.34/40 Entfernen aus RB-Trees Phase II (3) • Fall 3: neu kolorieren Q Q R X 1 2 1 Q 1 2 Q R X R X R X 2 1 2 elementare Datenstrukturen – p.34/40 Entfernen aus RB-Trees Phase II (4) • Fall 4: Rotation Q R X S 1 3 2 elementare Datenstrukturen – p.35/40 Entfernen aus RB-Trees Phase II (4) • Fall 4: Rotation Q R R X S 1 Q 3 2 3 S X 1 2 elementare Datenstrukturen – p.35/40 Entfernen aus RB-Trees Phase II (4) • Fall 4: Rotation Q R R X S 1 Q 3 2 3 S X 1 2 elementare Datenstrukturen – p.35/40 Komplexität: RB-Tree Speicherbed. Aufbau Einfügen Löschen Nachfolger Vorgänger Suche RB-Tree Liste sortierter Vektor O(n) O(n) O(n) O(n log n) O(log n) O(log n) O(log n) O(log n) O(log n) O(n) O(1) O(1) O(1) O(1) O(n) O(n log n) O(n) O(n) O(1) O(1) O(log n) elementare Datenstrukturen – p.36/40 (Mikro-)Optimierungen bei Bäumen • Nutzdaten auch in inneren Knoten speichern • z.B. mit Liste kombinieren elementare Datenstrukturen – p.37/40 to boldly go . . . • Heaps • Hash-Tabellen • Radix-Bäume • Range-Trees, Quad-Trees etc. • ... elementare Datenstrukturen – p.38/40 Fazit • jede Datenstruktur hat spezifische Vor- und Nachteile • es gibt keine universell einsetzbare Datenstruktur • Datenstrukturen sind Baukästen • Overhead nicht vergessen! elementare Datenstrukturen – p.39/40 Viel Spaß am Gerät! elementare Datenstrukturen – p.40/40