<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  <link rel="stylesheet" type="text/css" media="all" href="stylesheet.css">
  <title>Bäume</title>
</head>
<body>
  <span id="menu"><a href="index.php">zurück zur Liste</a></span>
  
  <div id="buttons">
    <form action="edit.php" method="POST">
      <input type="hidden" name="filename" value="<?php echo $_SERVER['SCRIPT_FILENAME']?>">
      <p>
        <input type="submit" value="Seite bearbeiten">
      </p>
    </form>
  </div>
  
  <h1>Bäume</h1>
  
<h2>AVL-Bäume</h2>
AVL-Bäume (Adelson-Velskii und Landis) sind eine Form von binären Suchbäumen, die das Entarten vermeiden und dabei den Aufwand beim Ausgleichen begrenzt halten.<br><br>
<table>
  <tr>
    <td><b>AVL-Kriterium:</b></td>
    <td>Ein AVL-Baum ist ein ausgeglichener/balancierter Binärbaum, d.h. für jeden Knoten unterscheidet sich die Höhe (= Weg von der Wurzel bis zum Knoten) seiner beiden Nachfolger um höchstens 1.</td>
  </tr>
</table>
<br>
Durch diese Bedingung eignen sich AVL-Bäume besonders zur Suche, da im worst case eine Laufzeit von O(log n) entsteht.<br>
Bei jeder Einfüge- oder Löschoperation muss die AVL-Bedingung über eine oder zwei Rotationen wieder hergestellt werden.<br><br>

<h4>Einfügen in einen AVL-Baum</h4>
Das grundsätzliche Vorgehen beim Einfügen eines Elements entspricht dem Algorithmus vom binären Suchbaum. Als Folge dieser Operation kann jedoch die AVL-Eigenschaft verletzt sein, was man durch Vertauschen von Knoten (Rotation bzw. Doppelrotation) wieder behebt.<br><br>

<b>Rotation</b><br>
<table>
  <tr>
    <td><img src="rotation1.gif"></td>
    <td><img src="rotation2.gif"></td>
  </tr>
</table>
Wenn es nach dem Einfügen eines neuen Wertes einen Knoten <b>k<sub>0</sub></b> gibt, dessen linker Teilbaum <b>a</b> des linken Kindes <b>k<sub>1</sub></b> und <b>k<sub>1</sub></b> (bzw. dessen rechter Teilbaum des rechten Kindes und das rechte Kind) eine um zwei größere Höhe hat als der rechte Teilbaum <b>c</b> (bzw. der linke Teilbaum), dann wird <b>k<sub>0</sub></b> mit <b>k<sub>1</sub></b> vertauscht.<br><br>

<b>Doppelrotation</b><br>
<table>
  <tr>
    <td><img src="doppelrotation1.gif"></td>
    <td><img src="doppelrotation2.gif"></td>
    <td><img src="doppelrotation3.gif"></td>
  </tr>
</table>
Wenn es nach dem Einfügen eines neuen Wertes einen Knoten <b>k<sub>0</sub></b> gibt, dessen rechter Teilbaum <b>b</b> des linken Kindes <b>k<sub>1</sub></b> und <b>k<sub>1</sub></b> (bzw. dessen linker Teilbaum des rechten Kindes und das rechte Kind) eine um zwei größere Höhe hat als der rechte Teilbaum <b>d</b> (bzw. der linke Teilbaum), dann wird zunächst <b>k<sub>1</sub></b> mit seinem rechten Kind <b>k<sub>2</sub></b> (bzw. linken Kind) vertauscht und dann <b>k<sub>2</sub></b> nach oben rotiert, so dass dieser Knoten nun die neue Wurzel dieses Teilbaums ist.<br><br>

<h4>Löschen in einen AVL-Baum</h4>
Ein gelöschter Knoten wird durch den linkesten Knoten seines rechten Teilbaums ersetzt. Hat der Knoten keinen rechten Teilbaum, wird er durch sein linkes Kind ersetzt. Der Baum wird danach durch Rotation und Doppelrotation wieder ausgeglichen falls nötig.

<br><br>
<h2>B-Bäume</h2>
B-Bäume sind keine Binärbaume, sondern ausgeglichene Mehrwegbäume. D.h. sie sind Bäume, die in einem Knoten mehrere Elemente speichern können.<br>
Ein B-Baum der Ordnung m kann m-1 Elemente in einem Knoten speichern und hat folgende Eigenschaften:
<ol>
  <li>Jeder Knoten hat höchstens m Kinder.</li>
  <li>Jeder Knoten mit Ausnahme der Wurzel und der Blattknoten hat mindestens m/2 Kinder.</li>
  <li>Die Wurzel hat mindestens 2 Kinder (oder ist ein Blattknoten).</li>
  <li>Alle Blattknoten sind auf der gleichen Ebene, und tragen keine weiteren Informationen</li>
  <li>Ein innerer Knoten mit k Kindern besitzt k-1 Schlüssel.</li>
</ol>

<table>
  <tr>
    <td><b>Beispiel:</b></td>
    <td><img src="bbaum.gif"></td>
    <td><div class="quelle" style="text-align: right;">Grafik entnommen aus Saake, Sattler: &quot;Algorithmen &amp; Datenstrukturen&quot;</div></td>
  </tr>
</table>

2-3-Bäume bzw. 2-4-Bäume sind B-Bäume der Ordnung 3 bzw. 4. Die 2 gibt die minimale Anzahl der Kinder pro Knoten an.
<br><br>

<h4>Suchen in einen B-Baum</h4>
Nehmen wir an, dass wir einen (2,3)-Baum haben und einen Eintrag mit dem Wert w suchen. <br>
Ein Knoten mit drei Elementen enthält die Werte a, b und c, wobei a &#8804; b &#8804; c, und vier Verweise, wobei v<sub>1</sub> auf alle Elemente e verweist, die kleiner a sind, v<sub>2</sub> auf alle a &#8804; e < b, v<sub>3</sub> auf alle b &#8804; e < c und v<sub>4</sub> auf alle c &#8804; e.<br>
Man fängt also wie gewohnt in der Wurzel an, überprüft, ob es dort einen Wert gibt, der gleich w ist. Wenn nicht nimmt man den jeweiligen Veweis zum nächsten Knoten und fährt rekursiv fort. Wenn man in einem Blatt angekommen ist und der Wert bis jetzt nicht gefunden wurde, ist er nicht im Baum gespeichert.
<br><br>

<h4>Einfügen in einen B-Baum</h4>
Zunächst wird das Blatt gesucht, in das das Element eingetragen werden soll und wird (der Sortierung entsprechend) eingefügt. 
<table>
  <tr>
    <td>Dann gibt es zwei Fälle:</td>
    <td>
      <ol>
        <li>Die Anzahl der Einträge des Knotens ist immernoch < m</li>
        <li>Die Anzahl der Einträge ist &#8805; m</li>
      </ol>
    </td>
  </tr>
</table>
Im ersten Fall freut man sich, dann ist man nämlich mit dem Einfügen fertig.<br>
Im zweiten Fall nimmt man das mittlere Element e<sub>i</sub> in den Elternknoten, teilt den Knoten in zwei und verweist jeweils recht und links von e<sub>i</sub> auf die neuen Knoten. Wenn nun der Elternknoten mehr als m-1 Elemente speichert, fährt man rekursiv fort. Dies kann sich bis zur Wurzel hochziehen. Hat die Wurzel nun mehr als m-1 Elemente wird e<sub>i</sub> nicht in den Elternknoten (gibt ja keinen), sondern wird in einen neuen Knoten geschrieben, der jetzt die Wurzel ist. Der B-Baum wächst also nach oben.<br><br>

<h4>Löschen in einen B-Baum</h4>
Zunächst wird der Knoten gesucht, in das das Element gespeichert ist und der Eintrag gelöscht.
<table>
  <tr>
    <td>Dann gibt es drei Fälle:</td>
    <td>
      <ol>
        <li>Die Anzahl der Einträge des Knotens aus dem gelöscht wurde ist immernoch &#8805; m/2</li>
        <li>Die Anzahl der Einträge des <b>Knotens</b> ist < m/2</li>
        <li>Die Anzahl der Einträge des <b>Blattes</b> ist < m/2</li>
      </ol>
    </td>
  </tr>
</table>
Im ersten Fall freut man sich, dann ist man nämlich mit dem Löschen fertig.<br>
Im zweiten Fall wird das Element durch den nächstkleineren aus einem Blatt ersetzt. Wenn sich für das Blatt nun ein Unterlauf ergibt, wird wie im dritten Fall fortgefahren.<br>
<table>
  <tr>
    <td>Im dritten Fall gibt es wiederum zwei Möglichkeiten:</td>
    <td>
      <ol>
        <li>Ein Nachbarknoten hat <b>mehr als m/2</b> Elemente</li>
        <li>Die Nachbarknoten haben <b>nur m/2</b> Einträge</li>
      </ol>
    </td>
  </tr>
</table>
Im ersten Fall werden der Knoten, der Nachbarknoten und e<sub>i</sub> aus dem Elternknoten, von dem aus rechts und links die beiden Verweise zu den Knoten ausgehen, kurzzeitig zu einem Knoten zusammengefasst, wieder halbiert und ein neues e<sub>i</sub>, was in den Elternknoten geschrieben wird, festgelegt.<br>
Im zweiten Fall wird der Knoten, der Nachbarknoten und e<sub>i</sub> aus dem Elternknoten zusammengelegt. Einer der Verweise vom Elternknoten fällt weg (ist ja nur noch ein Knoten). Der neue Knoten hat m Einträge: (m/2)-1 vom ursprünglichen Knoten + m/2 vom Nachbarknoten + 1 der Knoten aus dem Elternknoten e<sub>i</sub>.<br>
Möglicherweise gibt es nun im Elternknoten einen Unterlauf. Dieser wird rekursiv behandelt.<br>
<i>Darf ein Knoten nicht nur m-1 Einträge speichern?</i>
<br><br>

<h2>Rot-Schwarz-Bäume</h2>
<table>
  <tr>
    <td><b>Eigenschaften:</b></td>
    <td>
      <ol>
        <li>Knoten sind rot oder schwarz.</li>
        <li>Die Wurzel ist schwarz.</li>
        <li>Externe Knoten sind schwarz.</li>
        <li>Die Kinder von roten Knoten sind schwarz. (Rotbedingung)</li>
        <li>
          Jeder Pfad von einem Knoten x zu einem externen Knoten besitzt die gleiche Anzahl schwarzer Knoten.<br>
          Diese Anzahl (x nicht mitgezählt gezählt) heißt schwarze Höhe bh(x) eines Knotens.
        </li>
      </ol>
    </td>
  </tr>
</table>
<br>
<table>
  <tr>
    <td><b>Rot-Schwarz-Baum</b></td>
    <td><img src="rotschwarz1.gif"></td>
    <td><img src="rotschwarz2.gif"></td>
    <td><img src="rotschwarz3.gif"></td>
  </tr>
  <tr>
  	<td colspan="4"><div class="quelle" style="text-align: right;">Die Grafik ist ein Screenshot von Arsen Gogeshvilis <a href="http://webpages.ull.es/users/jriera/Docencia/AVL/AVL%20tree%20applet.htm">Binärbaum-Applet</a></div><br /></td>
  </tr>
  <tr>
    <td><b>(2,3)-Baum</b></td>
    <td><img src="bbaum1.gif"></td>
    <td><img src="bbaum2.gif"></td>
    <td><img src="bbaum3.gif"></td>
  </tr>
  <tr>
  	<td colspan="4"><div class="quelle" style="text-align: right;">Grafik entnommen aus Saake, Sattler: &quot;Algorithmen &amp; Datenstrukturen&quot;</div><br /></td>
  </tr>
</table>
<br>
Jeder Rot-Schwarz-Baum lässt sich durch einen (2,3)-Baum darstellen und umgekehrt.<br>
Ein 1-Knoten lässt sich durch einen schwarzen Knoten ersetzen, ein 2-Knoten durch einen schwarzen Knoten mit einem roten Kind und ein 3-Knoten durch einen schwarzen Knoten mit zwei roten Kindern.<br>
Suchen, einfügen und löschen funktionieren also nach dem gleichen Prinzip wie im (2,3)-Baum.
<br><br>

<h2>Digitalbäume</h2>
<div class="quelle">Die Grafiken zu Digitalbäumen wurden den Folien zur <a href="http://www.inf.fu-berlin.de/lehre/WS02/ALP3/index.html">Vorlesung</a> entnommen.</div>
Es gibt verschiedene Möglichkeiten einen Digitalbaum darzustellen.<br><br>

<table>
  <tr>
    <td>
      <b>Digitalbaum</b><br>
      <img src="digitalbaum.gif"></td>
    <td><img src="digitalbaum2.gif"></td>
  </tr>
  <tr>
    <td>
      <b>Binärer Digitalbaum</b><br>
      <img src="binaererdigitalbaum.gif"></td>
    <td><img src="binaererdigitalbaum2.gif"></td>
  </tr>
</table>
<br>

<h3>Patricia-Bäume</h3>
Patricia-Bäume (Practical Algorithm To Retrieve Information Coded In Alphanumeric) sind binäre Digitalbäume. <br>
Das Prinzip ist sehr einfach:<br>
<img src="patricia1.gif"><br>
Alle Schlüssel werden in den Blättern gespeichert. In den Knoten steht die Anzahl der Zeichen (Bits), die  auf den Wegen zu den Blättern überspringen werden können.<br><br>

Ein richtiger Patricia-Baum sieht so aus:<br>
<img src="patricia2.gif"><br>
Der Schlüssel HEINZ ist z.B. folgendemaßen abgespeichert: 10010001000101100100110011101011010<br>
<table>
  <tr>
    <td>Wegfindung:</td>
    <td>
100100010<br>
0<br>
0<br>
1<br>
011001<br>
0<br>
011001110<br>
1<br>
01<br>
1<br>
010
    </td>    
    <td>
9 Bits überspringen<br>
links<br>
links<br>
rechts<br>
6 Bits überspringen<br> 
links<br>
9 Bits überspringen<br>
rechts<br>
2 Bits überspringen<br>
rechts &#8658; bei HEINZ angekommen
    </td>
  </tr>
</table>

<h3>Suffix-Bäume</h3>
In einem Suffuixbaum sind alle Suffixe eines Wortes gespeichert.<br><br>
<b>Beispiel: Mississippi</b><br>
<img src="mississippi.gif"><br>

<h3>Anmerkungen</h3>

<b>Digitalbaum allgemein:</b> zeichenweiser Schlüsselvergleich entscheidet über Pfad im Baum.<br>
<b>Digitalbaum speziell (Radix tree):</b> Schlüssel in inneren Knoten und Blättern, zeichenweiser Schlüsselvergleich, keine Schlüsselordnung.<br>
<b>Trie:</b> Schlüssel nur in Blättern, geordnet nach Schlüsseln.<br>
<b>Patricia Trie</b> (Compressed Trie), (manchmal Patricia Tree): Redundanz eliminiert: jeder innere Knoten hat mindestens zwei Nachfolger.<br>
<b>Suffix Trie:</b> Trie, der alle Suffixe einer Zeichenkette enthält (eher unwichtig, kommt selten vor).<br>
<b>Suffixbaum (Suffix Tree):</b> Patricia Trie, der alle Suffixe einer Zeichenkette enthält, also: jeder innere Knoten mit zwei Nachfolgern. (wichtig)<br>
<b>Suffix-Feld (Suffix Array):</b> Felddarstellung eines Suffixbaums (nicht behandelt).<br>


  <h2>Links</h2>
  <a href="http://webpages.ull.es/users/jriera/Docencia/AVL/AVL%20tree%20applet.htm">Das Applet zu AVL- und Rot-Schwarz-Bäumen</a>
  <br>
  <a href="http://alfi.ira.uka.de/lehre/sommer2002/AVLTreeApplet/avl.html">AVL-Applet mit einzelnen Umsortierungsschritten (zum Mitverfolgen)</a>
  <br>
  <a href="http://www.vameo.de/uni/tutorium/binaryandavl.pdf">Merkblatt zu Binäre Suchbäume & AVL-Bäume von Augustin</a>
  <br>
  <a href="http://www.vameo.de/uni/tutorium/redblack.pdf">Merkblatt zu Rot-Schwarz-Bäume von Augustin</a>
  <br>
  <a href="http://www.vameo.de/uni/tutorium/23tree.pdf">Merkblatt zu 2-3-Bäume von Augustin</a>
  <br>
  <a href="http://www.vameo.de/uni/tutorium/digibaum.pdf">Merkblatt zu Digitalbäume von Augustin</a>
  <a href="http://dbs.uni-leipzig.de/en/skripte/ADS2/HTML/kap1-32.html">Patricia-Bäume</a>
</body>
</html>