13.07.2015 Aufrufe

Dynamische Datenstrukturen

Dynamische Datenstrukturen

Dynamische Datenstrukturen

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

–Einfügen von Element hinten in ListeListRecord EinfuegenHinten(ListRecord Liste,ListRecord Element) {Element.next = null;if(Liste==null) Liste = Element;else {ListRecord Lauf;for(Lauf = Liste;Lauf.next!=null;Lauf = Lauf.next);Lauf.next = Element;} return Liste;}


●Einfügen von Element hinten in Liste


●Element in Liste sortiert einfügenListRecord GeordnetEinfuegen(ListRecord Liste,ListRecord Element) {Element.next = null;if(Liste==null) Liste = Element;// leere Listeelse if(Liste.Datum>Element.Datum) {//kleineresElement.next = Liste; // ..Datum vorne einfügenListe = Element;} else { ListRecord Lauf;for(Lauf=Liste;Lauf.next!=null;Lauf=Lauf.next){if(Lauf.next.Datum>Element.Datum) {


●Einfügen von Element in Liste sortiert einfügen


●●●Baum (tree)– komplexere Datenstruktur als lineare Liste– jedes Listenelement zwei oder mehr NachfolgerBinärer Baum (binary tree)– jedes Listenelement höchstens zwei NachfolgerWurzel (root)– Ein ausgezeichnetes Element– kein Vorgänger– alle anderen Elemente des Baums erreichbar


●●●Gerichteter Graph– verkettete Menge von Knoten(stark) zusammenhängend(connect bzw. strongly connected)– jeder Knoten von jedem anderen aus erreichbarschwach zusammenhängend(weakly connected)– ausgezeichnetes Element, von dem aus jedes Elementerreichbar ist●Wurzel beim Baum


●Definition eines Baums


●●●Tiefe (depth) eines Knotens– Anzahl der Knoten von Wurzel zu Knoten an– Wurzel hat Tiefe 1Tiefe eines Baums– Tiefe des Blatts mit größter Tiefe– statt Tiefe bedeutungsgleich auch Höhe– Bäume meist mit Wurzel oben dargestelltausgeglichen (balanced)– alle Blätter gleiche Tiefe T, K = # KotenK = 2 T –1


●●ähnliche Operationen wie bei linearen Listen– Einfügen an bestimmter Stelle– Entfernen eines inneren Knotens– Entfernen eines Blatts– Entfernen der Wurzel– charakteristische Eigenschaften des Baums erhaltenSuchbaum– Knoten am linken Ast nur kleinere oder gleiche Werte– am rechten nur größere Werte– Kleinstes Element steht ganz links


●Balancierte Binärbäume– vorteilhafte Eigenschaft● N = 2T -1●Logarithmisches Verhältnis– N Daten– Baum vollständig ausgeglichend.h. alle Blätter die gleiche Tiefe●●Baum nahezu vollständig ausgeglichenSuchzeit log 2N– eine Million Daten– Nicht mehr als 20 Operationen auf Knoten des Baums


●Balancierte Binärbäume– Knoten besitzen Ordnung●●"Schlüssel"z.B. ganze Zahl– Für jeden Knoten gilt● Knoten mit kleinerem (oder gleichen) Schlüsseln → links ,●Knoten mit größerem Schlüsseln → rechts– Suchen: je nach Schlüsselwert links oder rechts– Struktur des Baums hängt ab●●Von Schlüsselwertenvon Reihenfolge in der Daten in Baum gehängt


●Daten in Knoten oder Blättern speichern125 151 10 13 213


●Daten nur in inneren Knoten speichern125 151 10 13 21-3- - - - - -- -


●Daten nur in Blättern speichern125 151 10 13211310 12 13 153 5


●Einfügen eines KnotensDatenSatz einfuegen(DatenSatz wurzel,DatenSatz element) {if(wurzel==null) return element;//element → Wurzelif(element.Wert


●Einfügen eines Knotens (iterativ)DatenSatz IterativesEinfuegen(DatenSatz wurzel, DatenSatz element) {if(wurzel==null) return element; //element→Wurzelfor(DatenSatz knoten = wurzel;;){//steige hinabif(element.key


●Baum durchlaufenTiefensuche (depth search)void Durchsuche(DatenSatz knoten) {if(knoten == null) return;// Preorder : Tue vor dem weiteren AbstiegDurchsuche(knoten.links);// Inorder: Tue etwas zwischen linkem und// rechten AbstiegDurchsuche(knoten.rechts);// Postorder: Tue etwas nach dem Abstieg


●Breitensuche


●●Bäume– Werte schnell wieder finden– unbekannte Anzahl von Daten speichernNachteile– relativ großer Adress-Overhead●große Anzahl von Zeigern je Knoten– können zu (fast) linearer Liste entarten●kein Vorteil mehr bei Zugriffszeit– relativ komplexe Datenstruktur●●nicht o.w. auf großen Datenträgern auslagerbarZeigerwerte sind Maschinenadressen– gelten nach Auslagerung der Daten nicht mehr


●Splay Bäume– binärer Suchbaum– zuletzt eingefügter oder gefundener Knoten→ neue Wurzel– Umkettungsoperationen zwischen Knoten●Rotationen– Links-RotationRechts-Rotation– Suchbaum-Eigenschaft bleibt erhalten


●Splay Baum– Knoten 51– Knoten 83● Linksrotation– Knoten 69● Links-Rechtsrotation– Knoten 28● Rechtsrotation– Knoten 68● Rechts-Linksrotation


●Splay Baum– Linksrotation (2,4) – Rechtsrotation (4,2)


● Splay Baum: Zig-Zag-Rotation (6,2,4)– Linksrotation (4,2) – Rechtsrotation (6,4)


● Splay Baum: Zig-Zig-Rotation (6,2,4)– Rechtsrotation (4,2) – Rechtsrotation (4,2)


●Splay Baum– Eigenschaften● Zufällige Verteilung der Daten● Tiefe etwa doppelt so groß wie bei AVL● Eigenschaften vergleichbar mit Suchbaum– Analyse nach M. A. Weiss● Amortisierte Zeit bei Wurzel T und KnotenX3∙(R(T)-R(X))+1 = O(Log N)R(i) = log S(i)


●Definition der AVL-Bäume– Ausgeglichener Binärbaum●alle Blätter gleiche Tiefe● Anzahl der Knoten K und der Tiefe T des Baums T K = 2T –1– Minimale (mittlere maximale) Suchzeit


●Definition der AVL-Bäume– „angenähert“ ausgeglichene Bäume●●●AVL-Bäumen– Unterschied der Teilbaumtiefe beschränktGewichtsbalancierte Bäume– Verhältnis der Teilbaumtiefe beschränktHöhenbalancierte Bäume– Nur Blätter mit gleicher Höhe– Bruderbäume– B-Bäume


●Definition der AVL-Bäume– Adelson-Velskij, Landis – 1962– Binärbäume mit einer minimalen Anzahl von Knoten●●F k = 1 52⋅5 ⋅ 1 5# Knoten in Teilbäumenunterscheiden sichhöchstens um 1Fibonacci-Baum istAVL-Baum mitmöglichstkwenigKnoten 5−12 22⋅5 ⋅ 1− 5B k 10 100 1000 10 000 100 000 1 000 000Mindestiefe 4 7 10 14 17 20Maximale Tiefe 5 10 15 19 24 29k


●Definition der AVL-Bäume– Binärbäume mit einer minimalen Anzahl von Knoten● # Knoten in Teilbäumen unterscheiden sich höchstens um 1●Fibonacci-Baum ist AVL-Baum mit möglichst wenig KnotenB k=B k−1B k−21B k=F k−1F k −1=F k−1 −1F k−2 −11F k = 1 52⋅5 ⋅ 1 52k 5−12⋅5 ⋅ 1− 52kB k 10 100 1000 10 000 100 000 1 000 000Mindestiefe 4 7 10 14 17 20Maximale Tiefe 5 10 15 19 24 29


●Einfügen von Knoten in AVL-Bäume– Einfügen eines Knotens an einen Teilbaum– Balance-Faktor: Tiefe rechts – Tiefe links


●Einfügen von Knoten in AVL-Bäume– Einfügen eines Knotens an einen Teilbaum– Wurzel ausgeglichen, links wird größer:


●Einfügen von Knoten in AVL-Bäume– Einfügen eines Knotens an einen Teilbaum– Wurzel ausgeglichen, rechts wird größer:


●Einfügen von Knoten in AVL-Bäume– Einfügen eines Knotens an einen Teilbaum– Wurzel +1, links wird größer:


●Einfügen von Knoten in AVL-Bäume– Einfügen eines Knotens an einen Teilbaum– Wurzel -1, rechts wird größer:


●Einfügen von Knoten in AVL-Bäume– Einfügen eines Knotens an einen Teilbaum– Wurzel +1, rechts wird größer, 1. Fall


●Einfügen von Knoten in AVL-Bäume– Einfügen eines Knotens an einen Teilbaum– Wurzel +1, rechts wird größer, 2. Fall:– Wurzel +1, links wird größer 'analog'.


●Löschen von Knoten in AVL-Bäume– Löschen eines Knotens in einen Teilbaum– Entfernen eines Blatts


●Löschen von Knoten in AVL-Bäume– Löschen eines Knotens in einen Teilbaum– Entfernen eines Blatts– Entfernen eines Halbblatts●Innerer Knoten mit genau einem Nachfolger (Blatt)


●Löschen von Knoten in AVL-Bäume– Löschen eines Knotens in einen Teilbaum– Wurzel ausgeglichen, links wird kleiner


●Löschen von Knoten in AVL-Bäume– Löschen eines Knotens in einen Teilbaum– Wurzel ausgeglichen, rechts wird kleiner


●Löschen von Knoten in AVL-Bäume– Löschen eines Knotens in einen Teilbaum– Wurzel -1, links wird kleiner


●Löschen von Knoten in AVL-Bäume– Löschen eines Knotens in einen Teilbaum– Wurzel +1, rechts wird kleiner


●Löschen von Knoten in AVL-Bäume– Löschen eines Knotens in einen Teilbaum– Wurzel +1, links wird kleiner, 1. Fall


●Löschen von Knoten in AVL-Bäume– Löschen eines Knotens in einen Teilbaum– Wurzel +1, links wird kleiner, 2. Fall


●Löschen von Knoten in AVL-Bäume– Löschen eines Knotens in einen Teilbaum– Wurzel +1, links wird kleiner, 3. Fall


●Suchen in AVL-Bäumen– AVL-Bäume können die Suchbaumeigenschaft nichtvollständig erhalten:●Beispiel: einfügen von drei gleichen Schlüsseln● Weiteres Einfügen führt zu:● Daher sind nicht alle gleichenKnoten links von einemWurzelknoten zu finden


●Suchen in AVL-BäumenAVLDaten sucheAlle(int key) {if(key == this.key) { // Schlüssel gefundenif(links!=null)links.sucheAlle(key); // weiter linksif(rechts!=null)rechts.sucheAlle(key);// weiter rechtsreturn this;// alles durchsucht}if(key < this.key) // nicht gefunden,weiter linksif(links != null) return links.sucheAlle(key);else return null;if(rechts != null) // und weiter rechtsreturn rechts.sucheAlle(key);return null;} } // Ende:: AVLDaten sucheAlle()

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!