Datenstrukturen Teil 4 Bäume zur Codierung und BBäume Codebäume Entropiekodierung ● ● ● Bezeichnet eine verlustfreie Datenkompression Dabei werden den einzelnen Zeichen unterschiedlich lange Bitfolgen als Codesegmente zugeordnet Idee dabei ist, das die Zeichen mit dem häufigsten Vorkommen den kürzesten Code erhalten Entropiekodierung ● ● Allerdings kann es hier keinen „naiven“ Ansatz geben und Codes „einfach so“ vergeben werden Beispiel: – A: 0 – B: 1 – C: 01 – D: 10 – ABCD = 010110 = CCD oder ABABD ... Entropiekodierung ● ● ● ● ● Hier sind Mehrdeutigkeiten entstanden Der Code ist nicht mehr eindeutig decodierbar Lösung: der Code muß die Eigenschaft „präfixfrei“ haben Präfixfrei: Kein Codesegment darf als Präfix (Anfang) eines anderen Codesegment auftauchen Wie kann ein präfixfreier Code erzeugt werden ? Entropiekodierung ● ● ● ● Präfixfreie Codes können durch Binärbäume erzeugt werden Dabei stehen die Blätter für die codierten Zeichen Der Weg von der Wurzel zu einem Blatt bestimmt den Code des Datums im Blatt Dazu muß die Verzweigung des Baumes belegt werden, z.B. mit – Pfad zum linken Kind = 0 – Pfad zum rechten Kind = 1 Entropiekodierung ● Beispiel: ● Codierung: ● Alternativen: Entropiekodierung ● Nach der Codierung Links->0, Rechts->1 ergibt sich für ABCD: – ● ● ● 0001100110 Zur Dekodierung wird die Zeichenfolge im Baum abgearbeitet (gesucht) Wird ein Blatt erreicht, wird mit dem nächsten Bit wieder in der Wurzel angefangen Problem ist nun, wie der Codebaum eigentlich erstellt wird Huffman ● ● ● Die meisten Algorithmen, die einen Codebaum erzeugen, arbeiten auf der Häufigkeit der zu codierenden Daten / Zeichen Dabei werden die Zeichen gemäß ihrer Häufigkeit sortiert und dann in einen Baum eingefügt Der optimale Algorithmus dafür (math. Beweisbar) ist der von David A. Huffman Huffman – Codebaum erzeugen ● Algorithmusschritte: – Erstelle einen „Wald“ mit Bäumen für jedes Zeichen, jeder Baum hat nur das Zeichen als Knoten – Suche zwei Bäume mit der niedrigsten Auftrittswahrscheinlichkeit (Häufigkeit) – Erstelle aus ihnen einen neuen Baum, dessen Wurzel die Summe der beiden Wahrscheinlichkeiten hat – Wiederhole, bis nur noch ein Baum übrig ist Huffman – Codebaum erzeugen B-Bäume B-Bäume ● ● ● Sollte die Speicherung der Daten, die in einem Baum dargestellt sind, nicht im Speicher sondern (was z.B. bei Datenbanken der Fall ist) auf einem Massenspeicher erfolgen, so haben Binärbäume einen eklatanten Nachteil Die Operationen Löschen, Suchen, Einfügen benötigen beim Binärbaum aufgrund seiner Struktur eine Vielzahl an wahlfreien Zugriffen Schlechte Performance ist die Folge B-Bäume ● ● ● ● Lösung hierfür sind die Mehrwegbäume, insbesondere die B-Bäume Knoten in Mehrwegbäumen können mehr als zwei Kinder haben Dadurch werden sie „flacher“ und es sind weniger Zugriffsschritte auf die Knoten nötig B-Bäume sind spezielle Mehrwegbäume, die eine besondere Definition haben B-Bäume ● Definition – Jeder Pfad von der Wurzel zu einem Blatt hat gleiche Länge – Jeder Knoten außer der Wurzel und den Blättern hat mindestens k + 1 Kinder (Unterbäume). Die Wurzel ist entweder ein Blatt oder hat mindestens 2 Kinder – Jeder Knoten hat höchstens 2k + 1 Kinder – Jedes Blatt hat höchstens 2k Einträge und (mit Ausnahme der Wurzel als Blatt) mindestens k Einträge – In den Knoten sind die Schlüssel aufsteigend sortiert B-Bäume ● ● B-Bäume werden in Klassen aufgeteilt Eine Klasse von k bedeutet, daß jeder Knoten außer der Wurzel minimal k Schlüssel (also k+1 Nachfolger) und maximal 2k Schlüssel (also 2k+1 Nachfolger) besitzt. B-Bäume - Suchen ● Ist eine verallgemeinerte Form der Suche im Binärbaum – Beginnt mit dem Wurzelknoten r als aktuellem Knoten x – Ist x ein innerer Knoten, wird die Position j des kleinsten Schlüssels bestimmt, der größer oder gleich k ist. ● Existiert eine solche Position j, aber ist k != x.kj, kann der gesuchte Schlüssel nur in dem Unterbaum mit Wurzel x.cj enthalten sein. Die Suche wird daher mit Schritt 2 und dem Knoten x.cj als aktuellem Knoten fortgesetzt. – ansonsten wurde der Schlüssel gefunden und (x,j) wird als Ergebnis zurückgeliefert. Existiert keine solche Position, ist der Schlüssel größer als alle im aktuellen Knoten gespeicherten Schlüssel. In diesem Fall kann der gesuchte Schlüssel nur noch in dem Unterbaum enthalten sein, auf den der letzte Kindverweis x.cx.s + 1 zeigt. In diesem Fall wird die Suche mit Schritt 2 und dem Knoten x.cx.s + 1 als aktuellem Knoten fortgesetzt. – ● – Ist x ein Blattknoten, ● ● Wird k in den Schlüsseln von x gesucht. Wenn der Schlüssel an Position j gefunden wird, ist das Ergebnis (x,j), ansonsten nicht enthalten. B-Bäume - Suchen B-Bäume - Einfügen ● Einfügen geschieht immer in einem Blattknoten – In einem vorbereitenden Schritt wird der Blattknoten x gesucht, in den eingefügt werden muss. Dabei werden Vorkehrungen getroffen, damit die Einfügeoperation nicht die B-Baum-Bedingungen verletzt und einen Knoten erzeugt, der mehr als 2t − 1 Schlüssel enthält. – In einem abschließenden Schritt wird k unter Berücksichtigung der Sortierreihenfolge lokal in x eingefügt. B-Bäume - Einfügen ● Die Suche nach x läuft bis auf zwei Unterschiede wie die normale Suche ab: – Die Suche bricht nicht in einem inneren Knoten ab, wenn dort der Schlüssel k bereits gefunden wird. Es findet immer ein Abstieg zu einem Blattknoten statt. – Bevor die Suche zu einem Kindknoten x.cj absteigt, wird überprüft, ob x.cj voll ist, d. h. bereits 2t − 1 Schlüssel enthält. In diesem Fall wird x.cj vorsorglich geteilt. Dies garantiert, dass die Einfügeoperation mit einem einzigen Baumabstieg durchgeführt werden kann und keine anschließenden Reparaturmaßnahmen zur Wiederherstellung der BBaum-Bedingungen durchgeführt werden müssen. B-Bäume - Einfügen B-Bäume - Einfügen ● ● ● Neue Schlüsselwerte werden in Sortierordnung in den Blättern gespeichert Wenn ein Blatt überläuft, wird es gesplittet, und der mittlere Schlüssel in den Elternknoten aufgenommen Wenn der Elternknoten selber schon voll ist, dann kann sich das Splitten bis zur Wurzel fortsetzen B-Bäume - Löschen ● Beim nächsten Mal ....