B-Baum¨Ubungstool - Institut für Informatik

Werbung
Leopold-Franzens-Universität Innsbruck
Institut für Informatik
Datenbanken und Informationssysteme
B-Baum Übungstool
Bachelor-Arbeit
Karin Waldner
betreut von
Michael Tschuggnall, MSc.
Prof. Dr. Günther Specht
Innsbruck, 10. April 2014
Zusammenfassung
Ein B-Baum ist eine Struktur zum Speichern von Daten und Indexen
bei relationalen Datenbanken. Die Knoten eines B-Baumes nehmen gegenüber anderen Bäumen mehr als ein Element auf. Die Elemente werden sortiert abgespeichert und durch verschiedene Algorithmen wird sicher gestellt, dass der Baum immer ausbalanciert ist.
Das Ziel dieser Bachelor Arbeit ist die Implementierung eines webbasierten Übungstools zur Veranschaulichung und Vertiefung der Konzepte und Algorithmen von B-Bäumen. Dafür stellt das Tool den Baum
sowie die Operationen graphisch und animiert dar. Zugleich wird noch
eine Anleitung zu dem jeweiligen Algorithmus angezeigt.
Für die Umsetzung des Tools wird das Google Web Toolkit und deren
Erweiterung GXT genutzt.
Abstract
A B-tree is a structure for storing data and indexes in relational databases. The nodes of a B-tree can hold more than one element. The
elements are stored in a sorted order and various algorithms ensure that
the tree stays balanced.
The aim of this thesis is the implementation of a web-based exercise
tool to illustrate and deepen the concepts and algorithms of B-trees. For
this purpose, the tool represents the tree and the operation graphically
and animated. At the same time a tutorial is displayed to the respective
algorithm.
For the implementation of the tools, the Google Web Toolkit and its
expansion GXT is used.
Inhaltsverzeichnis
1 Einleitung
1
2 B-Baum
2.1 Definition . . . . . . . . . . . . . . . . . .
2.2 Operationen . . . . . . . . . . . . . . . . .
2.2.1 Suchen . . . . . . . . . . . . . . . .
2.2.2 Einfügen . . . . . . . . . . . . . . .
2.2.3 Löschen . . . . . . . . . . . . . . .
2.2.4 Anmerkung zum Löschalgorithmus
2.3 B+ -Baum . . . . . . . . . . . . . . . . . .
2.4 B*-Baum . . . . . . . . . . . . . . . . . .
2.4.1 Anmerkung zur Benennung . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3 Systemspezifikation des B-Baum Übungstools
3.1 Grundlegende Funktionen . . . . . . . . . . . . . . . . .
3.1.1 Suchen . . . . . . . . . . . . . . . . . . . . . . . .
3.1.2 Einfügen . . . . . . . . . . . . . . . . . . . . . . .
3.1.3 Löschen . . . . . . . . . . . . . . . . . . . . . . .
3.2 Graphische Benutzeroberfläche (GUI) . . . . . . . . . .
3.3 Erstellen eines B-Baumes . . . . . . . . . . . . . . . . .
3.3.1 Erstellen eines zufälligen B-Baumes . . . . . . .
3.3.2 Erstellen eines gegebenen B-Baumes . . . . . . .
3.3.3 Erstellen eines zufälligen B-Baumes unter Vorgabe
diverser Parameter . . . . . . . . . . . . . . . . .
4 Implementierung
4.1 Google Web Toolkit . . . . . . . . . .
4.2 Grundgerüst . . . . . . . . . . . . . . .
4.2.1 Baumstruktur . . . . . . . . . .
4.2.2 Grundlegende Operationen . .
4.3 Erstellung von Zufallsbäumen . . . . .
4.4 Erstellen und Bearbeiten des Baumes
4.5 Ausgabe des Latex-Codes . . . . . . .
III
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
3
4
4
6
9
17
18
19
20
.
.
.
.
.
.
.
.
21
21
21
22
22
22
23
23
24
. 24
.
.
.
.
.
.
.
25
25
26
26
26
29
30
31
INHALTSVERZEICHNIS
4.6
4.7
4.8
4.5.1 Latex-Code mit Qtree . . . . . . . . . . . . . . .
4.5.2 Latex-Code mit Usepackage Tikz . . . . . . . . .
Erstellung von Übungsblätter . . . . . . . . . . . . . . .
4.6.1 Einfügen ohne Überlauf . . . . . . . . . . . . . .
4.6.2 Einfügen mit genau einem Überlauf . . . . . . .
4.6.3 Einfügen mit mehreren Überläufen . . . . . . . .
4.6.4 Löschen ohne Unterlauf . . . . . . . . . . . . . .
4.6.5 Löschen mit Unterlauf, welcher durch Zusammenfassen von Knoten behoben wird . . . . . . . . .
4.6.6 Löschen mit Unterlauf, welcher durch eine Rotation auf Blattebene behoben wird . . . . . . . . .
4.6.7 Löschen mit Unterlauf, welche durch Rotation im
Inneren des Baumes behoben wird . . . . . . . .
4.6.8 Löschen in einem Inneren Knoten . . . . . . . . .
Graphische Benutzeroberfläche . . . . . . . . . . . . . .
4.7.1 Darstellung der Startseite . . . . . . . . . . . . .
4.7.2 Darstellung des Funktionsfensters . . . . . . . . .
4.7.3 Implementierung der Benutzeroberfläche . . . . .
Internationalisierung . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
. 37
. 37
.
.
.
.
.
.
.
5 Zusammenfassung
Handbuch
A.1 Anleitung . . . . . . . . . . . . . . . .
A.2 Operationen und Animation . . . . . .
A.3 Weitere Funktionen . . . . . . . . . . .
A.3.1 Erstellung von Zufallsbäumen .
A.3.2 Erstellen eines Baumes . . . . .
A.3.3 Ausgabe des Latex-Codes . . .
A.3.4 Größe der Zeichnung ändern .
A.3.5 Erstellung von Übungsblättern
Literaturverzeichnis
IV
31
33
34
36
36
36
36
38
38
39
39
41
42
44
47
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
49
49
50
51
51
52
53
54
54
57
Karin Waldner
Kapitel 1
Einleitung
B-Bäume sind wichtige Strukturen zum Speichern von Daten und werden hauptsächlich in relationalen Datenbanken eingesetzt. In der Vorlesung Datenbanksysteme, lernen Studenten diese Indexstruktur kennen. Studenten lernen dabei nicht nur die Struktur der Bäume kennen, sondern erlernen auch die einzelnen Operationen. Da B–Bäume
Vielwegbäume sind, sind sie nicht so einfach zu handhaben wie andere Suchbäume, welche in jedem Knoten nur ein Element enthalten. BBäume wachsen dadurch langsamer, dafür werden sie auch komplexer,
da in jedem Knoten mehrere Elemente zu verwalten sind. Beim Einfügen
in B-Bäume wird nicht einfach für jedes neue Element ein neuer Knoten
angelegt, sondern das Element wird, sofern möglich, in einen bestehenden Knoten eingefügt. Da jeder Knoten nur eine bestimmte Anzahl an
Elemente aufnehmen darf, kann es zu Überläufen kommen. Ähnlich wird
beim Löschen eines Elements nicht sofort ein Knoten gelöscht, sondern
nur das Element selbst und gegebenenfalls tritt ein Unterlauf auf.
Dieses B-Baum Tool soll den Studenten und anderen Benutzern helfen
die Eigenschaften und die Struktur von B-Bäumen zu verstehen. Das
Tool erklärt die unterschiedlichen Operationen schrittweise durch eine
Animation. Der Benutzer verfolgt die Animation der einzelnen Schritte
mit textueller Anleitung und erlernt damit besser die einzelnen Algorithmen. Damit das erlernte Wissen auch eingesetzt werden kann, ermöglicht
das Tool das Erstellen eigener Übungsblätter.
In dieser Arbeit werden zu Beginn B-Bäume erklärt. Danach folgt die
Erklärung wie die einzelnen Operationen angewandt werden und jeweils
ein kurzes Beispiel dazu. Dann wird festgehalten, welche Funktionen das
Tool beherrscht. Im darauffolgenden Kapitel wird die Implementierung
des Tools beschrieben. Im Anhang befindet sich noch ein kurzes Handbuch für die Bedienung des Tools.
1
Kapitel 2
B-Baum
2.1
Definition
B-Bäume wurden 1972 von Rudolf Bayer und Edward McCreight entwickelt[1].
B-Bäume dienen zum Speichern von Index- und Datenstrukturen im
Hintergrundspeicher und werden hauptsächlich bei relationalen Datenbanken eingesetzt. Hintergrundspeicher sind Festplatten und CDs/DVDs
[2].
Einwegbäume wie binäre Suchbäume, sind effizient beim Speichern und
Zugreifen auf interne Speicher. Für das Speichern und Zugreifen auf
Hintergrundspeicher sind jedoch andere Organisationsformen notwendig. Eine gut geeignete Organisationsform sind hierbei sogenannte Vielwegbäume, wie zum Beispiel B-Bäume [2].
Vielwegbäume lassen sich besser auf Seiten im Hintergrundspeicher abbilden. Ein Knoten wird dabei auf eine Seite abgebildet. Dabei wird die
Knotengröße der Seitengröße angepasst. Nur beim verfolgen von Kanten
werden die Seiten gewechselt. Im ungünstigsten Fall befindet sich ein gesuchtes Element in einem Blattknoten, das heißt die maximale Anzahl
an Seitenzugriffen entspricht der Höhe des Baumes [3].
Ein Knoten enthält eindeutig identifzierbare Schlüssel, weshalb kein
Schlüssel doppelt vorhanden ist. In der Realität nehmen Knoten hunderte Schlüssel auf. Jeder Knoten, ausgenommen Blattknoten, hat Zeiger
auf andere Knoten. Durch die besondere Strukturierung des Baumes
sind die Suche-, Einfüge- und Löschoperation effizient [2].
Jeder B-Baum hat eine Ordnung n und über diese Ordnung werden die
Eigenschaften des Baumes festgelegt [3, 2]:
• Alle Blätter haben die gleiche Tiefe.
• Die Wurzel hat mindestens 1 Schlüssel und maximal 2n Schlüssel.
3
KAPITEL 2. B-BAUM
• Die Wurzel mit m Schlüsseln hat m + 1 Nachfolgerknoten. Das
heißt die Wurzel hat zwischen 2 und 2n + 1 Nachfolgerknoten.
• Jeder Knoten, ausgenommen die Wurzel, hat zwischen n und 2n
Schlüssel.
• Jeder innere Knoten, ausgenommen die Wurzel, mit m Schlüsseln,
hat m + 1 Nachfolgerknoten. Daraus folgt, dass mindestens n + 1
und maximal 2n + 1 Nachfolgerknoten vorhanden sind.
• Knoten welche Blätter sind, haben keine Nachfolgerknoten. Die
Wurzel kann ebenfalls keine Nachfolgerknoten haben.
Zusätzlich gelten noch die allgemeinen Eigenschaften von Suchbäumen:
alle Elemente werden sortiert eingefügt, weshalb B-Bäume stets sortiert
sind. Zudem sind B-Bäume durch die Algorithmen immer ausbalanciert
und alle Blätter sind gleich weit von der Wurzel entfernt.
2.2
Operationen
Die möglichen Operationen auf einem B-Baum sind Suchen, Einfügen
und Löschen.
Da Einfügen und Löschen den Baum verändern, wird nach diesen Operationen kontrolliert ob die Anzahl der Schlüssel in den jeweiligen Knoten
noch korrekt ist. Beim Einfügen wird nach der Operation überprüft, ob
in den beteiligten Knoten maximal 2n Schlüssel vorhanden sind. Falls
mehr Schlüssel vorhanden sind, werden Algorithmen angewandt, um den
Baum wieder auszubalancieren.
Nach dem Löschen wird überprüft ob jeder Knoten noch mindestens n
Schlüssel hat bzw. wenn nicht, wird der Baum neu ausbalanciert. Eine
Ausnahme bildet die Wurzel. Sie enthält laut Definition zwischen 1 und
2n Schlüssel.
2.2.1
Suchen
Suche Schlüssel S im Baum:
• Suche nach S wird in der Wurzel begonnen.
• Knoten ist keine Blattseite:
– von links nach rechts wird verglichen ob S ≤ den Schlüsseln
im Knoten ist:
∗ S ist gleich dem Schlüssel: S ist gefunden und die Suche
ist beendet.
4
Karin Waldner
KAPITEL 2. B-BAUM
∗ S ist größer als ein Schlüssel:
· falls ein Knoten rechts vorhanden ist, wird S mit diesem Knoten verglichen.
· falls kein Knoten mehr vorhanden ist, wird im rechten
Teilbaum weitergesucht.
∗ S ist kleiner als ein Schlüssel: es wird im Kindknoten
links von diesem Schlüssel weitergesucht.
• Knoten ist Blattseite:
– von links nach rechts wird verglichen ob S im Knoten enthalten ist.
∗ S wird gefunden: Knoten und Position werden zurückgegeben und die Suche ist beendet.
∗ S wird nicht gefunden: S ist weder im Knoten noch im
Baum enthalten. Die Suche ist beendet.
Beispiel: Suche
Im Baum (siehe Abbildung 2.1) der Ordnung 2 wird nach der Zahl 91
gesucht.
65
0
2
6
30
12
24
34
49
62
71
73
75
79
76
101
87
90
91
105
107
108
Abbildung 2.1: Suche nach der Zahl 91
Die Suche beginnt in der Wurzel [65]. Von links beginnend wird die
gesuchte Zahl mit jedem Schlüssel in der Wurzel verglichen. 91 ist größer
als 65, also wird im rechten Teilbaum weitergesucht. Dieser Schritt wird
in Abbildung 2.2 dargestellt.
65
91 > 65
0
2
6
30
12
24
34
49
62
71
73
75
79
76
101
87
90
91
105
107
108
Abbildung 2.2: Suche nach der Zahl 91 in der Wurzel
Nun wird wieder von links beginnend die gesuchte Zahl mit den einzelnen
Schlüsseln im Knoten verglichen. 91 ist größer als 76, dementsprechend
Karin Waldner
5
KAPITEL 2. B-BAUM
ist 91 nicht im linken Teilbaum. 91 ist kleiner als 101, das bedeutet, dass
sich die gesuchte Zahl im Teilbaum zwischen 76 und 101 befindet (siehe
Abbildung 2.3).
65
91 > 65
6
30
12
24
76
101
91 < 101
0
2
34
49
62
71
73
75
79
87
90
91
105
107
108
Abbildung 2.3: Suche nach der Zahl 91 im rechten Teilbaum
Die Suche ist in einem Blattknoten angekommen. Von links beginnend
wird wieder nach 91 gesucht. 91 ist größer als 79, 87 und 90. Schließlich
wird 91 an der letzten Position des Knotens gefunden (Abbildung 2.4).
65
91 > 65
6
30
76
101
76 < 91 < 101
0
2
12
24
34
49
62
71
73
75
79
87
90
91
105
107
108
Abbildung 2.4: Suche nach der Zahl 91 im Blattknoten
2.2.2
Einfügen
Einfügen von Schlüssel S im Baum:
Suche nach Schlüssel S.
• S wird nicht gefunden: Blattknoten wird zurückgegeben, in dem
die Suche abgebrochen wurde.
• S wird gefunden: S ist vorhanden und wird nicht noch einmal
eingefügt. Einfügeoperation ist beendet.
Schlüssel S wird im Blattknoten eingefügt.
• wenn der Knoten nach dem Einfügen weniger als 2n Elemente
enthält: Baum ist korrekt und Einfügeoperation ist beendet.
• wenn der Knoten mehr als 2n Elemente enthält: Überlauf wird
durch Knotensplit behandelt.
Knotensplit:
• mittleres Element wird durch n + 1 bestimmt:
6
Karin Waldner
KAPITEL 2. B-BAUM
• links vom mittleren Element ensteht ein neuer Knoten,
• rechts vom mittleren Element entsteht ein neuer Knoten.
• Falls der aufgesplittete Knoten die Wurzel ist:
– entsteht ein neuer Knoten mit dem mittleren Element.
– Der neue Knoten wird zur Wurzel.
• Falls der aufgesplittete Knoten nicht die Wurzel ist:
– wird das mittlere Element an die korrekte Position im Elternknoten gegeben.
• Die beiden neuen Knoten werden als linker bzw. rechter Teilbaum
an das in den Elternknoten (oder der neu entstandenen Wurzel)
gegebene Element gehängt.
• Der Elternknoten wird auf die Anzahl der Elemente überprüft:
– maximal 2n Elemente: kein neuer Überlauf entsteht und die
Einfügeoperation ist beendet.
– mehr als 2n Elemente: neuer Überlauf tritt im Elterknoten
auf. Überlauf wird durch Knottensplit behandelt.
Einfügen ohne Knotensplit
Nachdem der Schlüssel eingefügt wurde, wird dieser Knoten auf die
Anzahl der Elemente überprüft. Der Baum ist korrekt wenn alle Knoten, mit Ausnahme der Wurzel, zwischen n und 2n Schlüssel enthalten.
Enthält der Knoten durch das Einfügen weniger bzw. gleich 2n Schlüssel
sind die Eigenschaften erfüllt. Der Einfügevorgang ist damit beendet
und weitere Knoten werden nicht mehr überprüft, da deren Anzahl an
Schlüssel nicht verändert wurde.
Beispiel: Einfügen ohne Knotensplit
Im Baum der Ordnung 2 wird die Zahl 8 eingefügt. Als erstes wird die
Suchoperation aufgerufen, um die Position des einzufügenden Elementes
zu bestimmen (siehe Abbildung 2.5).
Das Element wird im Blattknoten [12,24] an der ersten Position eingefügt (siehe Abbildung 2.6).
Im Blattknoten [8,12,24] sind nach dem Einfügen drei Schlüssel vorhanden. Der Baum hat die Ordnung 2, das heißt in jedem Knoten dürfen
maximal 4 Schlüssel vorhanden sein. Da nur drei Schlüssel vorhanden
sind ist die Bedingung erfüllt und es entsteht kein Überlauf.
Karin Waldner
7
KAPITEL 2. B-BAUM
65
8 < 65
6
30
76
101
87
90
6 < 8<30
0
2
12
24
34
49
62
71
73
75
79
91
105
107
108
91
105
107
108
Abbildung 2.5: Suche nach der Zahl 8
65
6
0
2
8
30
12
24
34
49
62
71
73
75
79
76
101
87
90
Abbildung 2.6: Einfügen von 8
Einfügen mit Knotensplit
Besitzt ein Knoten nach dem Einfügen eines neuen Schlüssels, mehr als
2n Elemente, so entsteht ein Überlauf. Ein Überlauf wird durch das
Aufteilen des Knotens behoben. Durch das Aufteilen werden aus einem
Knoten zwei Knoten. Dazu wird zuerst der Schlüssel welcher sich in der
Mitte des Knoten befindet, mit Hilfe der Formel n + 1 gesucht. Danach
entsteht links und rechts von diesem Schlüssel jeweils ein neuer Knoten und der Schlüssel wandert nach oben. Die zwei neuen Knoten sind
dann jeweils die Nachfolgerknoten. Da im Elternknoten ein weiteres Element hinzugekommen ist, wird auch der Elternknoten auf einen Überlauf
überprüft. Tritt im Elternknoten ebenfalls ein Überlauf auf, wird dieser
durch einen Split behoben. Findet der Knotensplit in der Wurzel statt,
so wandert der Schlüssel in der Mitte nach oben und bildet einen neuen
Knoten. Der neue Knoten wird zur neuen Wurzel mit zwei Nachfolgerknoten.
Überläufe entstehen nur in Knoten, in welchen Elemente eingefügt wurden oder in welchen durch Knotensplits Elemente hinzugefügt wurden.
Beispiel: Einfügen mit Knotensplit
Im Baum der Ordnung 2 wird die Zahl 51 eingefügt. Zu Beginn wird die
Position ermittelt (siehe Abbildung 2.7).
Das Element wird im Knoten [34,49,62,64] an der dritten Position eingefügt. Der Baum hat die Ordnung 2 und nimmt deshalb maximal 4
Schlüssel auf. Nach dem Einfügen sind in diesem Blattknoten 5 Elemente vorhanden und ein Überlauf tritt auf (siehe Abbildung 2.8).
Um den Überlauf zu behandeln wird der Knoten aufgesplittet. Dazu
8
Karin Waldner
KAPITEL 2. B-BAUM
65
51 < 65
6
30
76
101
87
90
51 > 30
0
2
12
34
24
49
62
64
71
73
75
79
91
105
107
108
91
105
107
108
Abbildung 2.7: Suche nach der Zahl 51
65
0
2
6
30
12
24
34
49
51
62
64
71
73
75
79
76
101
87
90
Abbildung 2.8: Einfügen von 51
wandert der Schlüssel in der Mitte, der die Position n + 1 hat, in den
Elternknoten. In diesem Fall wandert 51 in den Elternknoten an die
dritte Position. Die zwei neuen Knoten [34,49] und [62,64] werden an
die richtige Position im Elternknoten gehängt. Der Knoten [34,49] wird
als Teilbaum zwischen 30 und 51 angehängt und der Knoten [62,62] wird
als rechter Teilbaum von 51 angehängt. Die Überlaufbehandlung ist in
Abbildung 2.9 dargestellt.
65
6
0
2
12
30
24
51
34
49
61
62
71
73
75
79
76
101
87
90
91 105
107
108
Abbildung 2.9: Überlauf behandeln
2.2.3
Löschen
Schlüssel S wird im Baum gelöscht:
Suche nach S im Baum.
• S wird nicht gefunden: Element ist nicht vorhanden und kann deshalb nicht gelöscht werden.
• S wird gefunden: Knoten und Position von S wird zurückgegeben.
Knoten ist kein Blattknoten:
• S wird mit dem größten (kleinsten) Element im linken (rechten)
Teilbaum getauscht. S befindet sich jetzt in einem Blattknoten.
Karin Waldner
9
KAPITEL 2. B-BAUM
Schlüssel S wird gelöscht.
• Der Knoten wird auf die Anzahl der Elemente überprüft:
– weniger als n Elemente: Unterlauf wird behandelt.
– mindestens n Elemente: Baum ist korrekt und die Löschoperation
ist beendet.
Unterlauf behandeln:
• Nachbarknoten hat mehr als n Elemente:
– eine Rotation wird durchgeführt.
• Nachbarknoten hat genau n Elemente:
– die Knoten werden zusammengefasst.
Rotation:
• linker Nachbarknoten hat mehr als n Elemente:
– größtes Element aus dem Nachbarknoten wird in den Vaterknoten verschoben.
– Nächstgrößeres Element im Vaterknoten wird in den Knoten
mit Unterlauf verschoben.
• rechter Nachbarknoten hat mehr als n Elemente:
– kleinstes Element aus dem rechten Nachbarknoten wird in
den Vaterknoten verschoben.
– Nächstkleineres Element im Vaterknoten wird in den Knoten
mit Unterlauf verschoben.
• Knoten ist Blattseite:
– Rotation beendet. Kein neuer Unterlauf entsteht und die Löschoperation
ist beendet.
• Knoten ist keine Blattseite:
– die Kindknoten werden an den korrekten Elternknoten gehängt.
– Rotation beendet. Kein neuer Unterlauf entsteht und die Löschoperation
ist beendet.
Zusammenfassen:
• Knoten wird mit Nachbarknoten zusammengefasst.
10
Karin Waldner
KAPITEL 2. B-BAUM
• Trennendes Element im Elternknoten wird in den zusammengefassten Knoten gegeben.
• Knoten ist kein Blattknoten:
– Kinderknoten der zusammengefassten Knoten werden an den
neuen Knoten in der korrekten Reihenfolge gehängt.
• Elternknoten des neuen Knotens wird auf einen Unterlauf untersucht:
– weniger als n Elemente: Unterlauf wird behandelt.
– mindestens n Elemente: kein Unterlauf entsteht. Unterlaufbehandlung und Löschoperation sind beendet.
Löschen ohne Unterlauf
Nachdem ein Element gelöscht wird, wird der beteiligte Knoten auf die
Anzahl der Elemente überprüft. Damit der Baum korrekt ist, muss jeder
Knoten mindestens n Elemente enthalten. Falls der beteiligte Knoten
genügend Elemente enthält ist die Löschoperation beendet und es ist
nicht nötig andere Knoten zu überprüfen.
Beispiel: Löschen ohne Unterlauf
Im Baum der Ordnung 2 wird der Schlüssel 79 gelöscht. Wie beim
Einfügen wird das zu löschende Element gesucht. Das gesuchte Element
befindet sich im Knoten [79,87,90,91] (Abbildung 2.10).
65
65 < 79
6
30
12
24
76
101
76 < 79 < 101
0
2
34
49
62
71
73
75
79
87
90
91
105
107
108
Abbildung 2.10: Suche nach der Zahl 79
Nun wird 79 aus dem Blattknoten gelöscht. Im Knoten befinden sich
noch 3 Elemente und da der Knoten mindestens 2 Elemente enthalten
muss, tritt kein Unterlauf auf. Das Löschen des Elementes ist in Abbildung 2.11 dargestellt.
Löschen mit Unterlaufbehandlung
Besitzt ein Knoten nach dem Löschvorgang weniger als n Elemente,
entsteht ein Unterlauf. Ein Unterlauf wird durch rotieren oder zusammenfassen behoben. Beim Zusammenfassen wird der Knoten mit einem
Karin Waldner
11
KAPITEL 2. B-BAUM
65
0
2
6
30
12
24
76
34
49
62
71
73
75
87
101
90
91
105
107
108
Abbildung 2.11: Löschen von 79
Nachbarknoten zusammengefügt. Aus dem Elternknoten wandert ein
Element in den neuen Kindknoten. Deshalb wird der Elternknoten ebenfalls auf einen Unterlauf überprüft. Das bedeutet, dass jedes Mal wenn
Knoten zusammengefasst werden, auch der Elternknoten auf die Anzahl
der Elemente überprüft wird.
Bei einer Rotation werden stets nur Elemente verschoben. Deshalb entsteht nach einer Rotation nie ein Unterlauf.
Zusammenfassen von Knoten
Eine Möglichkeit einen Unterlauf zu beheben, ist das Zusammenfassen
von Knoten. Dafür wird in den Nachbarknoten kontrolliert, ob genau n
Elemente in den Knoten vorhanden sind. Sind genau n Elemente enthalten, werden die zwei nebeneinanderliegen Knoten verschmolzen. Alle
Elemente der beiden Knoten samt dem Element aus dem Elternknoten, welche die zwei Knoten trennt, werden in einem Knoten zusammengefügt. Zusätzlich werden die alten Verweise gelöscht und ein neuer
Verweis auf den neu entstandenen Knoten angelegt. Werden die Kindknoten der Wurzel zusammengefügt und die Wurzel enthält nur einen
Schlüssel, so werden alle drei Knoten verschmolzen. Die Wurzel wird
gelöscht und der neue Kindknoten wird zur neuen Wurzel.
Für das Zusammenfassen dürfen genau n Schlüssel im Nachbarknoten
vorhanden sein, da durch das Zusammenfassen der Knoten und den trennenden Schlüssel im Elternknoten, der neue Knoten 2n Schlüssel enthält.
Enthält der Nachbarknoten mehr als n Elemente, so würde der neue
Knoten mehr als 2n Elemente enthalten und der Baum wäre nicht mehr
korrekt.
Beispiel: Löschen mit Zusammenfassen der Knoten
Im Baum der Ordnung 2 wird der Schlüssel 2 gelöscht. Zu Beginn wird
das Element gesucht und danach aus dem Knoten entfernt (siehe Abbildung 2.12).
Im Knoten [0,2] wird 2 gelöscht. Damit ist im Knoten nur noch ein
Schlüssel vorhanden. Da aber mindestens zwei Elemente vorhanden sein
müssen, entsteht ein Unterlauf. Der Knoten hat nur einen Nachbarkno12
Karin Waldner
KAPITEL 2. B-BAUM
65
2 < 65
6
30
12
24
76
101
2< 6
0
2/
34
49
62
71
73
75
87
90
91
105
107
108
Abbildung 2.12: Suche und Löschen der Zahl 2
ten und da sich in diesem Nachbarknoten genau n Elemente befinden,
werden die beiden Knoten verschmolzen. Für das Zusammenfassen wird
das Element welches im Elternknoten die beiden Teilbäume teilt, in den
neu entstehenden Knoten eingefügt. Das Zusammenfassen der Knoten
ist in Abbildung 2.13 dargestellt.
65
30
0
6
12
24
76
34
49
62
71
73
75
87
101
90
91
105
107
108
Abbildung 2.13: Unterlauf wird durch Zusammenfassen von Knoten behoben
Durch das Verschmelzen der Knoten ist die Anzahl der Elemente in den
Blattknoten wieder korrekt. In der Ebene darüber hat der Elternknoten
[30] durch das Zusammenfassen der Kindknoten weniger als n Elemente.
Um den Baum wieder korrekt auszubalancieren werden weitere Knoten
verschmolzen. Der Elternknoten wird mit der Wurzel zusammengefasst.
Der Baum hat nach dem Zusammenfassen eine geringere Höhe (siehe
Abbildung 2.14).
30
0
6
12
24
34
49
62
65
71
76
73
101
75
87
90
91
105
107
108
Abbildung 2.14: Unterlauf im Elternknoten behandeln
Kleine Rotation (Verschiebung in Blattknoten)
Um einen Unterlauf zu beheben besteht die Möglichkeit eine kleine Rotation vorzunehmen. Der Nachbarknoten wird auf die Anzahl der Elemente überprüft. Falls der Nachbarknoten mehr als n Elemente hat,
wird eine Rotation durchgeführt. Wird der linke Nachbarknoten für die
Rotation ausgewählt, so kommt das größte Element des linken Nachbarknotens in den Vaterknoten. Das Element, welches den Knoten mit dem
Karin Waldner
13
KAPITEL 2. B-BAUM
linken Nachbarknoten trennt, wandert in den Knoten mit dem Unterlauf. Dieses Element bekommt die erste Position im Blattknoten. Mit
der Verschiebung des Elementes wird der Unterlauf behoben.
Beim rechten Nachbarknoten wird das kleinste Element in den Vaterknoten verschoben. Vom Vaterknoten wird das nächstkleinere Element
in den Kindknoten mit dem Unterlauf, verschoben.
Bei einer kleinen Rotation wird danach nicht mehr kontrolliert ob der
Baum korrekt ist. Da von einem Nachbarknoten, in welchem mehr als
n Elemente vorhanden sind, ein Element verschoben wird, ist sowohl
der Knoten als auch der Nachbarknoten korrekt. Im Vaterknoten wird
nur ein Element ausgetauscht und im Knoten, wo das Element gelöscht
wurde, wird durch die Rotation ein Element hinzugefügt.
Beispiel: Kleine Rotation
Im Baum der Ordnung 2 wird der Schlüssel 2 gelöscht. Zu Beginn wird
nach dem Element 2 gesucht und in einem Blattknoten gefunden (siehe
Abbildung 2.15).
65
2< 65
6
30
76
101
87
90
2<6
0
2/
12
24
28
34
49
71
73
75
79
91
105
107
108
Abbildung 2.15: Suche und Löschen der Zahl 2
Der Schlüssel wird aus dem Baum entfernt. Im Blattknoten ganz links
ist nach dem Löschen ein Schlüssel zu wenig. Der Unterlauf ist in Abbildung 2.16 dargestellt.
65
6
0
12
30
24
28
34
49
71
73
75
79
76
101
87
90
91
105
107
108
Abbildung 2.16: Löschen von 2
Nach dem Löschvorgang wird der Unterlauf im Blattknoten [0] behandelt. Der Knoten hat nur einen Nachbarknoten, in dem sich mehr als 2
Elemente befinden. Eine Verschmelzung der Knoten ist nicht möglich,
da der zusammengefasste Knoten mehr als 2n (in diesem Fall 5) Elemente enthalten würde. Deshalb wird eine kleine Rotation durchgeführt.
14
Karin Waldner
KAPITEL 2. B-BAUM
Das kleinste Element des Nachbarknotens wird in den Elternknoten verschoben und dort wird das nächstkleinere Element in den Kindknoten
verschoben. Die Rotation der Elemente ist in Abbildung 2.17 dargestellt.
65
0
6
12
30
24
28
34
49
71
73
75
76
101
87
90
79
91
105
107
108
Abbildung 2.17: Unterlauf wurde durch Rotation behandelt
Große Rotation (Rotation im Inneren des Baumes)
Für eine große Rotation müssen mehrere Bedingungen zutreffen:
1. In einem Blattknoten entsteht beim Löschen ein Unterlauf.
2. Der Blattknoten wird mit einem Nachbarknoten zusammengefasst.
3. Beim Zusammenfassen der Blattknoten entsteht im Elternknoten
ein Unterlauf.
4. Im Nachbarknoten des Elternknoten sind mehr als n Schlüssel und
es findet eine Rotation statt.
Da eine Rotation im Inneren des Baumes stattfindet, haben nach der
Rotation der Elemente die Teilbäume nicht den korrekten Elternknoten.
Die Teilbäume werden mitverschoben und dementsprechend nach der
Rotation an den korrekten Elternknoten gehängt.
Beispiel: Große Rotation
Im Baum der Ordnung 1 wird die Zahl 2 gelöscht (siehe Abbildung 2.18).
65
2 < 65
6
76
101
79
87
2<6
2/
12
71
75
105
107
Abbildung 2.18: Suche und Löschen der Zahl 2
Das Element wird gelöscht. Der aktuelle Blattknoten ist nach dem Löschen
leer und hat einen Unterlauf. Um den Unterlauf zu beheben wird der
Karin Waldner
15
KAPITEL 2. B-BAUM
65
6
12
71
75
76
101
79
87
105
107
Abbildung 2.19: Zusammenfassen der Knoten
Knoten mit seinem Nachbarknoten [12] zusammengefasst. Die Verschmelzung der Knoten ist in Abbildung 2.19 abgebildet.
Durch das Zusammenfassen der Knoten entsteht im Elternknoten ebenfalls ein Unterlauf. Dieser Unterlauf wird durch eine Rotation behoben.
76 wandert in die Wurzel und 65 wandert in den linken Kindknoten der
Wurzel. Abbildung 2.20 stellt die Rotation im Inneren des Baumes dar.
In der Abbildung 2.20 ist gut ersichtlich, dass der Kindknoten noch nicht
verschoben wurde.
76
65
6
101
12
71
75
79
87
105
107
Abbildung 2.20: Rotation im Inneren des Baumes
Da eine Rotation im Inneren des Baumes stattgefunden hat, wurden
nur die Elemente verschoben. Der Kindknoten hingegen hängt noch am
alten Elternknoten. Der Knoten [71, 75] ist kleiner als die neue Wurzel
und wird an den richtigen Elternknoten angehängt. Die Verschiebung
des Kindknotens ist in Abbildung 2.21 dargestellt.
76
65
6
12
101
71
75
79
87
105
107
Abbildung 2.21: Kindknoten wird an den korrekten Elternknoten
gehängt
16
Karin Waldner
KAPITEL 2. B-BAUM
Löschen in einem inneren Knoten
In einem B-Baum werden nur Elemente in Blattknoten gelöscht. Ist das
zu löschende Element in einem inneren Knoten, so wird das zu löschende
Element mit dem nächstgrößeren oder nächstkleineren Element in einem
Blattknoten vertauscht. Danach wird das Element wie gewohnt gelöscht.
Entsteht ein Unterlauf wird dieser entweder durch Rotation oder Verschmelzung behoben.
Beispiel: Löschen im Inneren eines Baumes
Im Baum der Ordnung 2 wird der Schlüssel 101 gelöscht (siehe Abbildung 2.22).
65
0
2
6
30
12
24
34
49
62
71
73
75
79
76
101
87
90
91
105
107
108
Abbildung 2.22: Suche nach der Zahl 101
Da sich aber das gesuchte Element im Inneren des Baumes befindet
und nicht in einem Blattknoten, wird das Element mit dem größten
Element im linken Teilbaum ausgetauscht. Der Tausch der Elemente ist
in Abbildung 2.23 dargestellt.
65
0
2
6
30
12
24
34
49
62
71
73
75
79
76
91
87
90
101
105
107
108
Abbildung 2.23: Tauschen der Elemente
101 wird gelöscht. Da der Blattknoten danach genug Element hat, entsteht kein Unterlauf und die Löschoperation ist erfolgreich abgeschlossen. Die Löschoperation ist in Abbildung 2.24 dargestellt.
2.2.4
Anmerkung zum Löschalgorithmus
Welcher Algorithmus zum Behandeln von Unterläufen herangezogen wird,
ist von Fall zu Fall unterschiedlich. Da Knoten meistens einen linken und
einen rechten Nachbarknoten haben, stellt sich die Frage mit welchen
Nachbarknoten der Unterlauf behoben wird. Eine beliebte Variante [3]
ist, dass falls möglich eine Rotation durchgeführt wird. Tritt der Fall
Karin Waldner
17
KAPITEL 2. B-BAUM
65
0
2
6
30
12
24
76
34
49
62
71
73
75
79
91
87
90
105
107
108
Abbildung 2.24: Löschen der Zahl 101
auf, dass eine Rotation weder mit dem linken noch mit dem rechten
Nachbarknoten möglich ist, werden die Knoten zusammengefasst. Eine
Rotation verursacht weniger Kosten als das Zusammenfassen von Knoten. Bei der Rotation werden nur Elemente verschoben, während beim
Zusammenfassen Knoten gelöscht werden.
Genauso existieren Varianten in denen nicht festgelegt wird, ob zuerst eine Rotation oder eine Zusammengefassung gemacht wird. Der Anwender
entscheidet selbst über die Reihenfolge. Dabei besteht die Möglichkeit,
dass der Überlauf immer mit dem selben Nachbarknoten behoben wird1 ,
insofern dieser Nachbarknoten vorhanden ist.
Beim Löschen aus inneren Knoten ist der Ablauf nicht klar definiert.
Entweder wird das zu löschende Element immer mit dem größten Element im linken Teilbaum vertauscht oder das Element wird immer mit
dem kleinsten Element aus dem rechten Teilbaum vertauscht[3]. Kostengünstiger ist die Variante, dass erst überprüft wird, ob einer dieser beiden Knoten mehr als n Elemente enthält. Dadurch wird falls
möglich mit jedem Knoten ein Element getauscht, welcher nach dem
Löschvorgang noch genug Elemente enthält. Es existieren Definitionen,
in denen nicht klar definiert wird, mit welchem Blattknoten das Element
getauscht wird[2].
In der Realität werden meistens mehr Einfügeoperationen als Löschoperationen durchgeführt. Deshalb werden in Datenbanken oft keine Verschmelzungen durchgeführt, da dies zu aufwendig ist. Dadurch ist auch
die Bedingung, dass jeder Knoten mindestens n Elemente besitzt, zeitweise verletzt[3].
2.3
B+ -Baum
B+ -Bäume sind eine Weiterentwicklung der B-Bäume [4]. Der grundlegende Unterschied zwischen den beiden Indexstrukturen ist, dass B+ Bäume hohle Bäume [3] sind. Bei hohlen Bäumen befinden sich die
Daten in den Blättern und die Knoten enthalten nur noch die Referenzen auf die Daten. Dementsprechend läuft die Suche immer bis in die
1
http://dbis-informatik.uibk.ac.at/files/ext/lehre/ws13-14/VO-DBS/
DBS-Kap09-PhysischeOrg.pdf
18
Karin Waldner
KAPITEL 2. B-BAUM
Blätter. Damit diese Struktur noch effizienter ist, hat jeder Blattknoten
einen Zeiger auf einen oder beiden direkt danebenliegenden Blattknoten. Zusätzlich besteht die Möglichkeit, dass innere Knoten eine andere
Anzahl an Elementen haben, als die Blattknoten oder die Wurzel [3].
Die Eigenschaften eines B+ -Baumes werden im Buch Datenbanksyste”
me“ [3] wie folgt beschrieben:
Ein B+ -Baum vom Typ (k,k*) hat also folgende Eigenschaf”
ten:
1. Jeder Weg von der Wurzel zu einem Blatt hat die gleiche
Länge.
2. Jeder Knoten – außer Wurzel und Blättern – hat mindestens k und höchstens 2k Einträge. Blätter haben mindestens k* und höchstens 2k* Einträge. Die Wurzel hat
entweder maximal 2k Einträge, oder sie ist ein Blatt
mit maximal 2k* Einträgen.
3. Jeder Knoten mit n Einträgen, außer den Blättern, hat
n + 1 Kinder.
4. Seien R1 , . . . , Rn die Referenzschlüssel eines inneren Knotens (d.h. auch der Wurzel) mit n + 1 Kindern. Seien
V0 , V1 , . . . , Vn die Verweise auf diese Kinder.
(a) V0 verweist auf den Teilbaum mit Schlüsseln kleiner
oder gleich R1 .
(b) Vi (i = 1, ..., n − 1) verweist auf den Teilbaum, dessen Schlüssel zwischen Ri und Ri+1 liegen (einschließlich Ri+1 ).
(c) Vn verweist auf den Teilbaum mit Schlüsseln größer
als Rn .“
Der B+ -Baum enthält Referenzschlüssel, welche nicht immer reale Schlüssel sind. Die Referenzschlüssel werden beim Zusammenfassen einfach
gelöscht. Beim Splitten eines Knotens erhält der Vaterknoten eine Kopie und der mittlere Referenzschlüssel wird in einen der beiden Knoten
gegeben [3].
2.4
B*-Baum
B*-Bäume [5] sind eine Weiterentwicklung von B-Bäumen. Der B*-Baum
wurde 1973 von Donald Ervin Knuth entwickelt. Der grundlegende Unterschied zwischen B-Baum und B*-Baum ist, dass ein B* - Baum zu 32
gefüllt sein muss, während ein B-Baum nur zur Hälfte gefüllt sein kann
[5].
Karin Waldner
19
KAPITEL 2. B-BAUM
Um eine Füllung von 23 zu garantieren werden die Algorithmen angepasst. Beim Einfügen wird der Überlauf nicht immer mit einem Split
aufgelöst, sondern es wird überprüft, ob in den angrenzenden Nachbarknoten noch Platz frei ist. Ist im Nachbarknoten noch Platz frei, werden
die Schlüssel (samt dem Schlüssel welcher sich im Vaterknoten befindet und die beiden Knoten trennt), gleichmäßig auf die beiden Knoten
verteilt. Enthält der Nachbarknoten ebenfalls die maximale Anzahl an
Schlüsseln, so entsteht ein neuer Knoten. Die Schlüssel des Knotens und
des Nachbarknotens werden nach dem Split gleichmäßig auf den Knoten,
Nachbarknoten und den neuen Knoten aufgeteilt [2].
Der Baum hat durch diese Methode einen höheren Füllgrad. Dies hat
zur Folge, dass der Baum eine geringere Höhe hat. Durch den höheren
Verzweigunsgrad verringert sich auch die Zeit für die Suche nach einem
Element und hat somit eine bessere Performance.
2.4.1
Anmerkung zur Benennung
Sowohl für den B+ -Baum als auch für den B*-Baum existieren mehrere
Definitionen. Oft werden die Namen auch vertauscht. In dieser Arbeit
wurden für B-Baum und B+ -Baum die Definitionen aus dem Buch Da”
tenbanksysteme Eine Einführung“ von Kemper und Eickler genommen.
Für den B*-Baum wird die Definition von Knuth Donald hergenommen. Das Buch Algorithmen und Datenstrukturen“ von Ottmann und
”
Widmayer wird zur Vervollständig der Informationen genutzt.
20
Karin Waldner
Kapitel 3
Systemspezifikation des
B-Baum Übungstools
Dieses Kapitel legt die Anforderung an die Applikation fest. Es werden
die wichtigsten Operationen beschrieben, das Aussehen der graphischen
Benutzeroberfläche und die weiteren Funktionen des Programms.
3.1
Grundlegende Funktionen
Das Ziel des Programms ist es den Studenten die Konzepte, Strukturen
sowie die grundlegenden Operationen und Algorithmen anschaulich zu
erklären. Das Programm erstellt einen B-Baum um darauf die verschiedenen Operationen anzuwenden. Zu den Operationen gehören Suchen,
Einfügen und Löschen.
3.1.1
Suchen
Der Benutzer gibt das zu suchende Element in ein Textfeld ein. Beginnend bei der Wurzel werden die Elemente mit dem gesuchten Element
verglichen. Befindet sich das gesuchte Element in der Wurzel so ist die
Suche bereits beendet und das Element erhält eine farbliche Kennzeichnung. Falls nicht, erfolgt durch Vergleiche die Bestimmung des Nachfolgeknotens/Kindknotens, in welchen die Suche weitergeht. Dort wird
schließlich wieder geschaut ob das gewünschte Element vorhanden ist
bzw. der Nachfolgeknoten bestimmt. Dies geschieht so lange bis das
Element gefunden wurde oder die Suche in einem Blattknoten endet,
in welchem das Element nicht vorhanden ist. Falls das Element nicht
vorhanden ist, erscheint eine entsprechende Meldung.
21
KAPITEL 3. SYSTEMSPEZIFIKATION DES B-BAUM
ÜBUNGSTOOLS
3.1.2
Einfügen
Der Benutzer gibt das gewünschte Element zum Einfügen ein. Zu Beginn wird die Suche nach diesem Element aufgerufen. Ist das Element
bereits vorhanden, erscheint am Bildschirm eine Meldung, dass das Element bereits vorhanden ist. Falls das Element noch nicht vorhanden ist,
gibt die Suche die Position zurück, an welcher das Element eingefügt
wird. Nachdem das Element eingefügt wurde, wird überprüft ob die
Eigenschaften noch erfüllt werden. Entsteht ein Überlauf, wird ein Knotensplit durchgeführt und danach erfolgt wieder eine Überprüfung ob
der Baum korrekt ausbalanciert ist. Die Knoten werden solange gesplittet bis der gesamte Baum korrekt ist. Welche Knoten überprüft werden
und gesplittet werden, wird durch die Animation und der Anleitung
verdeutlicht.
3.1.3
Löschen
Der Benutzer gibt das Element ein, welches er löschen möchte. Daraufhin wird wieder nach dem Element gesucht. Sollte es nicht vorhanden
sein, so erscheint am Bildschirm eine Meldung. Ist das gesuchte Element
vorhanden, dann wird es gelöscht. Danach erfolgt eine Überprüfung ob
die Eigenschaften des Baumes noch erfüllt sind. Sollte dies nicht der Fall
sein, entstehen Unterläufe, welche es zu behandeln gilt. Dies geschieht
entweder durch Zusammenfassen von Knoten oder durch Rotationen.
Das Entstehen von Unterläufen wird in der Animation farblich gekennzeichnet und in der Anleitung wird beschrieben, wie der Unterlauf behoben wird.
3.2
Graphische Benutzeroberfläche (GUI)
Die Website ist in zwei Teile aufgeteilt, wobei der größere Teil zwei
Drittel des Bildschirmes einnimmt und der kleinere Teil sich am rechten Bildschirmrand befindet. Die graphische Darstellung des Baumes
nimmt den größten Teil des Bildschirmes ein. Bei der Ausführung von
Operationen hat der Benutzer zwei Möglichkeiten sich diese graphisch
anzeigen zu lassen. Bei der ersten Möglichkeit sieht er sofort den fertigen
Baum. Die zweite Möglichkeit ist, sich den Algorithmus für die jeweilige
Operation Schritt für Schritt graphisch anzeigen zu lassen. Jeder Schritt
wird gekennzeichnet und der Benutzer kann über eine Taste anhalten
bzw. fortfahren. Bei der Suche wird jeder Knoten, durch welche die Suche wandert, farblich gekennzeichnet. Beim Einfügen sieht der Benutzer,
welchen Weg das Element genommen hat und an welcher Position es eingefügt wird. Falls ein Überlauf stattfindet wird dieser ebenfalls gekennzeichnet. Beim Löschen werden die Unterläufe farblich gekennzeichnet
22
Karin Waldner
KAPITEL 3. SYSTEMSPEZIFIKATION DES B-BAUM
ÜBUNGSTOOLS
und die Knoten, welche zusammengefasst oder bei denen eine Rotation
vorgenommen werden muss, werden ebenfalls farblich hervorgehoben.
Am rechten Rand wird die Anleitung angezeigt. Zu Beginn ist die Anleitung eingeblendet. Sobald eine Operation ausgeführt wird, erscheint
dort die dazugehörende Anleitung. Die Anleitung enthält nicht nur die
allgemeinen Informationen zum Algorithmus, sondern wie er konkret
in diesem Beispiel anzuwenden ist. Der Benutzer sieht an Hand seines
Baumes (mit seinem Elementen) wie der Algorithmus funktioniert. Lässt
sich der Benutzer den Algorithmus schrittweise anzeigen, so baut sich
auch die Anleitung Schritt für Schritt auf. Wird die Operation ohne
Zwischenschritte angezeigt, so erscheint sofort die gesamte Anleitung.
Falls die Anleitung nicht benötigt wird, kann sie über eine Schaltfläche
ausgeblendet werden.
Unter dem Baum (am unteren Bildschirmrand) befindet sich eine Menüleiste. Der Benutzer gibt hier die Ordnung des Baumes ein, wobei standardmäßig die Ordnung 2 eingestellt ist. Daneben befinden sich die Operationen Suchen, Einfügen und Löschen. Die Operation wird entweder
sofort durchgeführt oder falls die Animation eingeschaltet ist, wird die
Operation Schritt für Schritt angezeigt.
Zusätzlich findet der Benutzer die Möglichkeit einen Baum zu erstellen.
Er hat verschiedene Möglichkeiten B-Bäume zu erzeugen. Bei der ersten
Möglichkeit wird nur die Höhe und Ordnung eingegeben und ein Baum
mit Zufallszahlen erzeugt. Der Benutzer kann aber auch die Ordnung
und Anzahl der Elemente eingeben um einen Zufallsbaum zu erzeugen.
Die zweite Möglichkeit ist, dass ein bereits gegebener Baum gezeichnet
wird. Die dritte Möglichkeit ist das Erstellen von Zufallsbäumen, bei
welchen durch Einfügen oder Löschen von Elementen der Benutzer die
verschiedenen Algorithmen übt.
3.3
3.3.1
Erstellen eines B-Baumes
Erstellen eines zufälligen B-Baumes
Der Benutzer gibt die Ordnung sowie die Höhe des Baumes ein. Das
Programm errechnet eine zufällige Anzahl an Elementen. Danach wird
ein Baum mit Zufallszahlen erstellt. Die einzufügenden Zufallszahlen
befinden sich zwischen 0 und (AnzahlZuf allszahlen) ∗ 5. Der Bereich
der Zufallszahlen wird um den Faktor 5 vergrößert. Damit wird erreicht,
dass nicht alle natürlichen Zahlen im Intervall [0, AnzahlZuf allszahlen]
in den Zufallsbaum eingefügt werden und noch ausreichend natürliche
Zahlen existieren (auch aus [0, AnzahlZuf allszahlen]) und durch den
Benutzer eingefügt werden können.
Karin Waldner
23
KAPITEL 3. SYSTEMSPEZIFIKATION DES B-BAUM
ÜBUNGSTOOLS
Da das Tool Übungszwecke dient, wird der Bereich nicht zu groß gewählt.
Da die Größe des Knotens von der Ziffernanzahl der größten Zahl abhängt,
wird durch die Einschränkung nach oben erreicht, dass die Knoten bei
Bäumen mit niedriger Ordnung und geringer Höhe eine kleine Knotengröße haben. Der Platz für die Zeichnung wird somit besser genutzt.
Zusätzlich erscheint noch die Information in welcher Reihenfolge die Zufallszahlen eingefügt wurden. Die zweite Möglichkeit ist, dass die Ordnung und die Anzahl an Elementen eingegeben werden. Das Programm
erstellt einen Zufallsbaum mit der angegebenen Ordnung und Anzahl an
Elementen.
3.3.2
Erstellen eines gegebenen B-Baumes
Ist der Baum bereits bekannt, aber nicht die Reihenfolge in welcher die
Elemente eingefügt wurden, wird der Baum über ein eigenes Fenster
vollständig eingegeben und anschließend gezeichnet.
3.3.3
Erstellen eines zufälligen B-Baumes unter Vorgabe
diverser Parameter
Der Benutzer erzeugt wiederum einen beliebigen Baum, jedoch neben
Ordnung und Anzahl der Elemente werden noch gewisse Parameter eingegeben. Die Parameter sind die bekannten Algorithmen zum Einfügen
und Löschen. So kann ein Baum erzeugt werden, bei welchem beim
Einfügen eines gewissen Elements ein Knotensplit erreicht wird. Beim
Löschen können mehrere Unterläufe vorgegeben werden, welche entweder durch Rotationen oder durch Zusammenfassen von Knoten behoben
werden müssen. Über ein Auswahlmenü wird festgelegt welche Problemstellungen vorhanden sein müssen. Das Programm erzeugt nicht nur dem
Baum sondern auch Vorschläge welche Zahlen einzufügen oder zu löschen
sind um die vorgegebenen Algorithmen einzusetzen.
Anschließend wird der Baum gezeichnet und das Programm erstellt den
dazugehörenden Latex-Code. Der Latex-Code enthält die Vorschläge,
welche Zahlen gelöscht oder eingefügt werden. Dieser Latex-Code kann
dann für Übungsblätter genutzt werden. Der Algorithmus zur Erstellung
generiert einen Zufallsbaum und untersucht diesen auf seine Eigenschaften. Sind die gewünschten Unterläufe bzw. Überläufe nicht möglich, so
wird ein neuer Zufallsbaum generiert. Wird nach 1000 Versuchen kein
Zufallsbaum mit den gewünschten Eigenschaften gefunden, bricht das
Programm die Suche nach einen geeigneten Baum ab. Falls kein Baum
gefunden wird, wird eine Meldung ausgegeben.
24
Karin Waldner
Kapitel 4
Implementierung
Dieses Kapitel erklärt welche Programmsprache zur Implementierung
des Übungstools verwendet wurde. Anschließend wird die Implementierung des Grundgerüstes, der Operationen und der weiteren Funktionen
erklärt.
4.1
Google Web Toolkit
Zur Entwicklung des webbasierten B-Baum Übungstools wird das Google Web Toolkit (kurz GWT [6]) benutzt. GWT ist eine freie Software
welche 2006 von Google veröffentlicht wurde. Es dient zur Erstellung und
Optimierung von komplexen webbasierten Programmen. Dabei soll der
Nutzer komplexe Webanwendungen entwickeln ohne dass er JavaScript,
XML oder andere Browser-Eigenheiten beherrschen muss. Ermöglicht
wird dies unter anderem durch einen Java-to-Javascript Compiler und
einen XML Parser [7].
Bei GWT werden sowohl der Client als auch der Server in Java geschrieben. Falls kein Server notwendig ist, wird nur der Client implementiert.
Für GWT besteht die Möglichkeit, es in bestimmten Benutzerumgebungen (zum Beispiel Eclipse) zu integrieren. Außerdem ist ein Server integriert welcher mit der Benutzerumgebung verbunden ist. Dadurch wird
das webbasierte Programm einfach über die Benutzerumgebung aufgerufen. Das Programm wird in Eclipse gestartet, woraufhin der Programmierer das Programm über einen Link öffnet. Die Website wird danach
im bevorzugten Browser angezeigt. Zusätzlich besteht die Möglichkeit
den Quellcode während des Ausführen zu verändern. Die Änderung wird
abgespeichert und im Browser wird andschließend die Website aktualisiert [7, 8].
Bei GWT kann die graphische Benutzeroberfläche nicht direkt mit Hilfe
von Java bzw. Java Swing erstellt werden, sondern GWT enthält eigene
Klassen zur Erstellung von einfachen Benutzeroberflächen. Wird die Be25
KAPITEL 4. IMPLEMENTIERUNG
nutzeroberfläche komplexer, so stellt Google die Erweiterung GXT [9]
zur Verfügung. Das Grundgerüst des Übungstools wurde in Java implementiert, während für die graphische Benutzeroberfläche GXT verwendet wurde [10].
4.2
Grundgerüst
4.2.1
Baumstruktur
Das Grundgerüst des Tools ist die Implementierung der Baumstruktur samt Algorithmen. Die Baumstruktur besteht aus den zwei Klassen
BTreeNode und BTree.
Wie das Wort bereits sagt ist im BTreeNode der Knoten beschrieben.
Diese Klasse enthält Informationen zu den Schlüsseln, Kindknoten und,
ausgenommen der Wurzel, auch über den Vaterknoten. Außerdem wird
beschrieben ob der Knoten ein Blatt ist. Es stehen Methoden zur Verfügung, welche die Anzahl der Schlüssel und die Anzahl der Kindknoten zurückgibt. Im Konstruktor wird der Vaterknoten und die Schlüssel
des Knotens gesetzt. Bei der Wurzel ist kein Vaterknoten vorhanden
und wird deshalb auf NULL“ gesetzt. Bei der Erstellung eines Baumes
”
ist die Wurzel ebenfalls ein Blattknoten. Erst wenn die Wurzel gesplittet wird, ist sie kein Blatt mehr. Danach werden bei jedem Split eines
Blattknotens die zwei neu entstandenen Knoten zu Blattknoten. Beim
Löschen entstehen keine neuen Blattknoten, da bei einer Rotation keine
Knoten gelöscht werden bzw. beim Zusammenfassen immer nur nebeneinander liegende Blattknoten zusammengefasst werden.
Die Klasse BTree enthält den gesamten Baum samt Operationen welche
auf dem Baum ausgeführt werden. Um einen Baum zu erstellen muss
die Ordnung mitgegeben werden. BTree enthält beim ersten Aufruf die
leere Wurzel. Erst wenn Elemente hinzugefügt werden und die Wurzel
aufgeteilt wird, entstehen neue Knoten.
Die wichtigsten Methoden sind Suchen, Einfügen und Löschen. Neben
diesen drei Grundfunktionen enthält die Klasse aber auch Methoden für
die Ausgabe in Latex-Code, Erstellen von Übungszetteln und Bearbeiten
eines Baumes.
4.2.2
Grundlegende Operationen
Die wichtigsten Operationen auf einem B-Baum sind Suchen, Einfügen
und Löschen. Die Algorithmen wurden laut Definition implementiert.
Das heißt die Suche beginnt immer in der Wurzel und je nachdem ob
die gesuchte Zahl kleiner oder größer ist, wird die Suche im jeweiligen
Unterbaum fortgesetzt. Ein Beispiel für den Suchalgorithmus ist in Abbildung 4.1 abgebildet. In der Abbildung 4.1 wird nach der Zahl 20
26
Karin Waldner
KAPITEL 4. IMPLEMENTIERUNG
gesucht und schließlich in einem Blattknoten gefunden.
Für das Ergebnis wird eine Hilfsklasse eingeführt. Die Hilfsklasse enthält
die Information ob die Zahl gefunden wurde, den Knoten und die Position. Ist die Suche erfolgreich liefert sie mehrere Informationen zurück.
Nicht nur ob das Element gefunden wurde, sondern auch in welchem
Knoten und die Position im Knoten. Wurde das Element nicht gefunden, wird der Knoten und Position zurückgegeben, an welcher sich das
Elemente befinden sollte. Wird in einem Baum nach einer beliebigen
Zahl gesucht und diese ist nicht im Baum vorhanden, erscheint eine entsprechende Meldung.
(a) Suche in der 1. Ebene
(b) Suche in der 2. Ebene
(c) Suche in der 3. Ebene
Abbildung 4.1: Suche nach dem Element 20
Die Einfügeoperation ruft die Suche auf. Die Suche liefert zurück, ob
das Element gefunden wurde oder ob es nicht gefunden wurde. Ist das
Element bereits vorhanden wird es nicht noch einmal eingefügt. Falls
das Element nicht vorhanden ist, liefert die Suche den Knoten und die
Position an welcher sich das Element befinden müsste zurück. Danach
wird das Element eingefügt und das Programm kontrolliert, ob kein
Überlauf entstanden ist. Tritt ein Überlauf auf so wird der betroffene
Knoten aufgeteilt. Da ein Element in den Elterknoten wandert, wird bei
jedem Split der Elternknoten auch auf einen Überlauf überprüft. In Abbildung 4.2 wird ein Beispiel für das Einfügen mit Überlaufbehandlung
gezeigt. Die Zahl 17 wird im rechten Blattknoten eingefügt. In diesem
Blattknoten entsteht dadurch ein Überlauf. In Abbildung 4.3 wird der
Überlauf behandelt. Der Knoten wird aufgeteilt und 14 wandert in den
Elternknoten.
(a) Suche in der 1. Ebene
(b) Suche in der 2. Ebene
(c) Einfügen: 17
Abbildung 4.2: Suche und Einfügen des Elementes 17
Ähnlich der Einfügeoperation ruft auch die Löschfunktion zu Beginn
die Suche auf. Die Suche liefert zurück ob das Element gefunden wurde. Wenn das Element nicht gefunden wurde, dann kann es auch nicht
Karin Waldner
27
KAPITEL 4. IMPLEMENTIERUNG
(a) Überlauf behandeln
Abbildung 4.3: Überlaufbehandlung
gelöscht werden. Ist das Element hingegen im Baum enthalten, so liefert
die Suche den Knoten und die Position des Elements. Das Element wird
gelöscht und das Programm überprüft ob ein Unterlauf aufgetreten ist.
Ist dies der Fall so wird der Unterlauf entweder durch Zusammenfassen
von Knoten oder durch eine Rotation behoben. Nach dem Zusammenfassen kontrolliert das Programm ob der Baum korrekt ausbalanciert ist.
In Abbildung 4.4 wird die Zahl 17 gelöscht und im rechten Blattknoten
entsteht ein Unterlauf. Der Unterlauf wird in Abbildung 4.5 durch das
Zusammenfassen mit dem linken Nachbarknoten behoben.
(a) Suche in der 1. Ebene
(b) Suche in der 2. Ebene
(c) Löschen: 17
Abbildung 4.4: Suche und Löschen des Elements 17
(a) Unterlauf
(b) Knoten zusammenfassen
Abbildung 4.5: Unterlauf behandeln
Beim Löschen existieren mehrere Varianten. Entsteht ein Unterlauf so
kann dieser entweder durch Rotation oder durch Zusammenfassen von
Knoten behoben werden. Da ein Knoten oft zwei Nachbarknoten hat,
stellt sich die Frage mit welchen Knoten zusammengefasst bzw. eine Rotation gemacht wird. Als Nachbarknoten werden jene Knoten bezeichnet, welche den selben direkten Vorgänger haben und in der Kinderliste
des Elternknotens direkt nebeneinander liegen. Das Programm bietet
dafür drei Einstellungen an. Die erste Einstellung R/Z“ gibt der Ro”
tation Vorrang. Der Knoten mit einem Unterlauf kontrolliert zuerst, ob
mit dem linken Nachbarknoten eine Rotation möglich ist, wenn nicht,
dann wird überprüft ob mit dem rechten Nachbarknoten eine Rotation
28
Karin Waldner
KAPITEL 4. IMPLEMENTIERUNG
möglich ist. Erst wenn ausgeschlossen ist, dass keine Rotation möglich
ist, wird der Knoten mit einem seiner Nachbarknoten zusammengefügt.
Dadurch wird sichergestellt, dass falls möglich eine Rotation gemacht
wird, da bei dieser nur Elemente vertauscht werden. Hingegen beim Zusammenfassen werden Knoten gelöscht und die Baumstruktur ändert
sich. Beim Löschen aus dem Inneren des Baumes wird erst der linke
Teilbaum kontrolliert, ob im Knoten mit dem größten Element genug
Elemente vorhanden sind. Falls dies der Fall ist, wird mit dem größten
Element im linken Teilbaum getauscht. Ansonsten wird der Knoten mit
dem kleinsten Element im rechten Teilbaum überprüft. Falls dieser mehr
als die minimale Anzahl an Elementen hat, wird mit dem kleinsten Element im rechten Teilbaum getauscht. Tritt der Fall auf, dass weder links
noch rechts genug Elemente vorhanden sind, wird das zu löschende Element mit dem größten Element im linken Teilbaum getauscht. Der Unterlauf, welcher entsteht, wird falls möglich durch Rotation oder durch
Zusammenfassen der Knoten gelöst.
Die zweite Einstellung L“ gibt an, dass beim Löschen immer zu erst
”
kontrolliert wird ob ein linker Nachbarknoten existiert und mit diesem
entweder zusammengefasst oder eine Rotation gemacht wird. Existiert
ein linker Nachbarknoten so kann immer zusammengefasst oder eine
Rotation gemacht werden, da der Knoten entweder genau n bzw. mehr
als n Elemente enthält. Existiert kein linker Nachbarknoten so wird der
Unterlauf mit Hilfe des rechten Nachbars behoben. Beim Löschen eines
Elementes im Inneren des Baumes wird das zu löschende Element immer mit dem größten Element im linken Teilbaum getauscht. Tritt ein
Unterlauf auf, dann wird dieser behoben.
Die dritte Einstellung R“ ist ähnlich wie die zweite, jedoch wird hier zu
”
erst mit dem rechten Nachbarknoten der Unterlauf behoben. Falls dieser
nicht vorhanden ist, wird der Unterlauf mit dem linken Nachbarknoten
behoben. Wird aus dem Inneren des Baumes ein Element gelöscht, so
wird das zu löschende Element immer mit dem kleinsten Element im
rechten Teilbaum vertauscht.
4.3
Erstellung von Zufallsbäumen
Das Tool bietet zwei Möglichkeiten zur Erstellung von zufälligen Bäumen.
Bei der ersten Möglichkeit gibt der Nutzer die Ordnung und die Höhe des
Baumes ein. Sowohl die Ordnung als auch die Höhe sind ganzstellige positive Zahlen. Das Tool berechnet eine zufällige Zahl an Elementen. Danach werden zufällig generierte Elemente eingefügt. In der Methode wird
die Höhe des Baumes kontrolliert. Wurden zu viele Elemente eingefügt,
so dass die Höhe überschritten wurde, dann werden so lange zufällig
Elemente gelöscht bis die richtige Höhe erreicht wird. Dabei genügt es
Karin Waldner
29
KAPITEL 4. IMPLEMENTIERUNG
nicht nur das letzte Element zu löschen, da daraus nicht zwingend die
letzte Einfügeoperation rückgängig gemacht wird. Bei B-Bäumen ist jedes Element nur einmal vorhanden. Wird versucht, ein Element doppelt
einzufügen, erfolgt eine Rückmeldung, dass das Element bereits vorhanden ist. Danach wird ein anderes Element eingefügt. In Abbildung 4.6
wurde ein Zufallsbaum der Ordnung 1 und Höhe 3 erstellt.
Abbildung 4.6: Zufallsbaum der Ordnung 1 und Höhe 3
Bei der zweiten Möglichkeit gibt der Nutzer die Ordnung und die Anzahl
von Elementen ein. Die Ordnung und die Anzahl der Elemente sind positive, ganzstellige Zahlen. Das Tool generiert zufällige Elemente und fügt
diese nacheinander ein. Die Einfügeoperation gibt eine Rückmeldung
falls das Element bereits vorhanden ist und das Tool fügt ein anderes
Element ein. Die Abbildung 4.7 zeigt ein Beispiel für einen Zufallsbaum
der Ordnung 1 mit 13 Elementen.
Abbildung 4.7: Zufallsbaum der Ordnung 1 und 13 Elementen
4.4
Erstellen und Bearbeiten des Baumes
Das Programm ermöglicht dem Benutzer einen bestehenden Baum textuell einzugeben. Dadurch wird das Wiederherstellen eines alten Baumes
möglich, auch wenn dem Benutzer die Einfügereihenfolge der Elemente
unbekannt ist. Der Benutzer gibt die Ordnung im entsprechenden Textfeld ein, wobei die Ordnung eine ganze Zahl größer 0 sein muss. Das Programm öffnet einen Editor, in dem der Baum erstellt wird. Der Benutzer
gibt die Knoten hintereinander ein. Knoten werden durch eckige Klammern dargestellt. Die Knoten werden nebeneinander geschrieben oder
durch Leerzeichen/neue Zeilen voneinander getrennt. Die Trennung der
Elemente im einzelnen Knoten erfolgt durch einen Beistrich. Die Knoten
30
Karin Waldner
KAPITEL 4. IMPLEMENTIERUNG
werden von der Wurzel bis zu den Blättern bzw. von links nach rechts
eingegeben. Die Eingabe sieht wie folgt aus:
[60]
[15, 44][90, 108]
[5, 6][17, 23][48,58, 59][61, 71, 72, 79][99, 106][109, 114]
Aus dieser Eingabe erstellt das Programm den Baum der Ordnung 2
(siehe Abbildung 4.8).
60
5
6
15
44
17
23
48
58
59
61
71
72
79
90
108
99
106
109
114
Abbildung 4.8: Erstellen eines Baumes
Die Wurzel befindet sich ganz oben, die Blätter ganz unten. Die Knoten
werden jeweils von links nach rechts ausgegeben. Beim Einlesen kontrolliert das Programm ob genügend Knoten vorhanden sind und ob jeder
Knoten die Mindestanzahl der Elemente nicht unterschreitet bzw. die
maximale Anzahl an Elementen nicht überschreitet. Weiteres wird die
aufsteigende Sortierung der Elemente im Baum überprüft. Zusätzlich
wird kontrolliert ob kein Element doppelt vorhanden ist.
Der bestehende Baum kann auch bearbeitet werden. Das Programm bietet eine eigene Schaltfläche für das Bearbeiten an. Die Schaltfläche öffnet
den gleichen Editor wie beim Erstellen eines Baumes, jedoch mit dem
aktuellen Baum. Der Benutzer kann im Editor Knoten ändern, einzelne Knoten oder ganze Ebenen hinzufügen bzw. löschen. Wie auch beim
Erstellen des Baumes kontrolliert das Programm zum Schluss ob der
Baum korrekt ist. Beim Bearbeiten ist es nicht möglich die Ordnung des
Baumes zu ändern. Soll die Ordnung verändert werden, muss ein neuer
Baum mit der gewünschten Ordnung erstellt werden.
4.5
4.5.1
Ausgabe des Latex-Codes
Latex-Code mit Qtree
Das Programm bietet zwei Varianten für die Erstellung des Latex-Codes
an. Bei der ersten Variante werden die Latex Pakete
\usepackage{framed}
\usepackage{amssymb}
\usepackage{qtree}
Karin Waldner
31
KAPITEL 4. IMPLEMENTIERUNG
verwendet. Bei diesen Usepackages werden die Knoten verschachtelt dargestellt. Die Knoten werden auf zwei Arten unterschieden. Der Baum
wird in innere Knoten und Blattknoten unterteilt. Ein innerer Knoten
wird durch
[.\framebox[0.5cm][c]{Element} Kindknoten ].\framebox[0.5cm]
[c]{Element}
dargestellt. Der Blattknoten wird hingegen durch
\framebox[0.5cm][c]{Element}}
dargestellt. Hier ist gut erkennbar, dass die inneren Knoten mit ihren
Kindknoten verschachtelt sind. Deshalb ist die Methode für die Generierung des Latex-Codes rekursiv. Der restliche Latex-Code, welcher sich
nicht verändert wird danach hinzugefügt. Quelltext 4.1 stellt den LatexCode dar und darunter befindet sich die Zeichnung des Baumes.
Quelltext 4.1: LatexCode und Zeichnung des Baumes
\ d o c u m e n t c l a s s [ a4paper , 11 pt ] { s c r a r t c l }
\ u s e p a c k a g e [ T1 ] { f o n t e n c }
\ usepackage [ l a t i n 1 ] { inputenc }
\ u s e p a c k a g e { ngerman }
\ usepackage { graphicx }
\ u s e p a c k a g e { framed }
\ u s e p a c k a g e {amssymb}
\ usepackage { q t re e }
\ s e t k o m a f o n t { s e c t i o n i n g }{\ n o r m a l f o n t \ n o r m a l c o l o r
\ mdseries }
\ s e t l e n g t h {\ p a r i n d e n t }{0em}
\ s e t l e n g t h {\ p a r s k i p } { 2 . 0 ex p l u s 1 . 0 ex minus 0 . 5 ex }
\ b e g i n { document }
{
\ center
\ tiny
\ Tree
[ . \ framebox [ 0 . 5 cm ] [ c ] { 5 5 } [ . \ framebox [ 1 . 0 cm ] [ c ]
{22 28}
\ framebox [ 1 . 5 cm ] [ c ] { 3 20 21} \ framebox [ 1 . 0 cm ] [ c ]
{23 24}
\ framebox [ 1 . 5 cm ] [ c ] { 4 0 50 51} ] . \ framebox [ 1 . 0 cm ]
[ c ] { 2 2 28}
[ . \ framebox [ 1 . 0 cm ] [ c ] { 7 9 104} \ framebox [ 1 . 5 cm ] [ c ]
{56 66 70}
\ framebox [ 1 . 5 cm ] [ c ] { 9 3 100 103} \ framebox [ 1 . 5 cm ] [ c ]
32
Karin Waldner
KAPITEL 4. IMPLEMENTIERUNG
{105 108 109}
] . \ framebox [ 1 . 0 cm ] [ c ] { 7 9 104}
[ c ]{55}}
\ end { document }
] . \ framebox [ 0 . 5 cm ]
55
22 28
3 20 21
4.5.2
23 24
79 104
40 50 51
56 66 70
93 100 103
105 108 109
Latex-Code mit Usepackage Tikz
Für die zweite Ausgabe des Latex-Codes wird das Tikz - Usepackage
benutzt. Das Tikz Package stellt eigene Knoten zur Verfügung. Um einen
Baum zu erstellen, wird zu Beginn das Tikz - Package hinzugefügt und
anschließend die Umgebung erstellt, in welcher sich der Baum befindet.
Ein Knoten wird durch folgende Befehlszeilen angelegt:
{\begin{tikzpicture}
[ scale=0.6,
level distance=50pt,
every node/.style={inner sep=0pt,font=\small}]
\node{\begin{tabular}{|c|} \hline Element\\ \hline
\end{tabular}};
\end{tikzpicture}
}
Für weitere Knoten wird der vorhergehende Befehl erweitert:
\node{\begin{tabular}{|c|} \hline Element\\ \hline
\end{tabular}}
child {node{\begin{tabular}{|c|} \hline Element\\
\hline \end{tabular}}}
child {node{\begin{tabular}{|c|} \hline Element\\
\hline \end{tabular}}};
Das Tool erstellt den Baum mit Hilfe einer rekursiven Methode. Abbildung 4.9 zeigt den selben Baum, welcher in Listing 4.1 mit dem Qtree Package erstellt wurde.
Das Tikz - Package hat gegenüber den Qtree Package eigene Knoten,
welche auch in der Zeichnung besser dargestellt werden. Beim Qtree Karin Waldner
33
KAPITEL 4. IMPLEMENTIERUNG
55
3
20
21
22
28
23
24
79
40
50
51
56
66
70
93
104
100
103
105
108
109
Abbildung 4.9: Zeichnung eines B-Baumes mit Tikz
Package gehen alle Linien der Kindknoten von der Mitte des Elternknotens aus. Da bei einem B-Baum ab der Ordnung 2 mehr als zwei
Kindknoten vorhanden sind, ist die Darstellung mit dem Tikz - Package
übersichtlicher. Beim Tikz - Package werden die einzelnen Schlüssel im
Knoten eindeutig durch eine Trennlinie getrennt. Von dieser Trennlinie
geht dann die Linien für den dazugehörenden Teilbaum ab.
4.6
Erstellung von Übungsblätter
Eine weitere Funktion des Programmes ist die Erstellung von Übungsblättern. Der Benutzer gibt die Ordnung und die Anzahl der Elemente
ein. Danach wählt der Benutzer die Algorithmen aus. Beim Einfügen
hat der Benutzer die Auswahl: Einfügen ohne Überlauf, Einfügen mit
genau einem Überlauf und Einfügen mit mehreren Überläufen. Beim
Löschen wählt der Benutzer zwischen Löschen ohne Unterlauf, Löschen
mit Unterlauf welcher durch Zusammenfassen behoben wird, Löschen
mit Unterlauf welcher durch eine Rotation auf Blattebene behoben wird
und Löschen mit Unterlauf welcher mit einer Rotation im Inneren des
Baumes behoben wird, aus. Zusätzlich besteht die Option, dass Elemente
aus dem Inneren des Baumes gelöscht werden. Das Auswahlmenü ist in
Abbildung 4.10 dargestellt.
Falls nichts ausgewählt wird, wird weder Baum noch Übungsblatt erstellt. Ansonsten werden alle ausgewählten Algorithmen erzeugt. Die
Operationen werden nicht hintereinander ausgeführt sondern jede Operation wird auf dem Ursprungsbaum ausgeführt. Für den Benutzer ist es
einfacher, wenn die Operationen jeweils wieder auf dem Ursprungbaum
ausgeführt werden, weil dadurch Folgefehler durch falsch angewandte
Algorithmen vermieden werden.
Das Programm erstellt einen Zufallsbaum und kontrolliert ob die gewünschten Operationen darauf anwendbar sind. Falls eine der ausgewählten Operationen nicht möglich ist, generiert das Programm einen
neuen Zufallsbaum. Spätestens nach 1000 Versuchen bricht das Programm ab. Sobald eine Bedingung nicht erfüllt ist und ein neuer Baum
generiert wird, muss der neue Baum wieder auf alle ausgewählten Operationen untersucht werden. Findet das Programm einen Baum so wird
eine Ausgabe des Baumes in Latex-Code generiert. Unter dem Code
34
Karin Waldner
KAPITEL 4. IMPLEMENTIERUNG
Abbildung 4.10: Auswahlmenü für die Erstellung von Übungsblättern
für den Baum, stehen noch die Elemente welche eingefügt oder gelöscht
werden. Ein Beispiel für das Übungsblatt stellt Abbildung 4.11 dar.
Abbildung 4.11: Übungsblatt
In den folgenden Abschnitten werden die Auswahlmöglichkeiten und deren Implementierung vom Erstellen der Übungsblätter kurz beschrieben.
Da das Programm die Einstellungen R/Z“ und L“ anbietet, wird das
”
”
Übungsblatt entweder mit der Variante R/Z“ erstellt oder mit der Vari”
ante L“. Beide Varianten werden in den betroffenen Implementierungen
”
kurz beschrieben.
Karin Waldner
35
KAPITEL 4. IMPLEMENTIERUNG
4.6.1
Einfügen ohne Überlauf
Beim Einfügen ohne Überlauf wird ein Element in einem Knoten eingefügt, welcher die maximale Anzahl an Elemente noch nicht erreicht
hat.
Das Programm erstellt eine Liste aller Blattknoten. Danach wird zufällig
ein Knoten ausgewählt und überprüft ob der Knoten weniger als die maximal erlaubte Anzahl an Elemente enthält. Ist dies nicht der Fall geht
das Programm zum nächsten Knoten in der Liste und überprüft diesen
Knoten. Dieser Schritt wird so lange wiederholt bis entweder ein Knoten mit weniger als 2n Elementen gefunden wurde oder alle Blattknoten
überprüft sind und keiner den Anforderungen entspricht. Wurde ein solcher Knoten gefunden, dann wird eine passende Zufallszahl generiert.
Entspricht kein Knoten der Bedingung wird ein neuer Baum generiert
und überprüft.
4.6.2
Einfügen mit genau einem Überlauf
Beim Einfügen mit genau einem Überlauf wird ein Blattknoten gesucht,
welcher die maximale Anzahl an Elementen besitzt. Dessen Elternknoten enthält dagegen nicht die maximale Anzahl an Elementen. Das Programm erstellt wieder eine Liste der Blattknoten. Es geht die gesamte
Liste durch bis ein Knoten gefunden ist, welcher die maximale Anzahl
an Elementen enthält und der Vaterknoten weniger als die maximal erlaubte Anzahl an Elementen besitzt. Wird ein solcher Knoten gefunden,
wird eine Zufallszahl generiert und zurückgegeben. Falls kein Knoten gefunden wurde, erstellt das Programm einen neuen Baum und überprüft
ihn auf diese Eigenschaften.
4.6.3
Einfügen mit mehreren Überläufen
Beim Einfügen mit mehreren Überläufen enthält sowohl der Blattknoten
als auch sein Vaterknoten die maximale Anzahl an Elementen.
Wie bei den anderen beiden Varianten wird hier ebenfalls eine Liste der
Blattknoten erstellt. Bei dieser Varianten wird ein Blattknoten mit der
maximalen Anzahl an Elementen gesucht. Danach wird der Elternknoten
auf die Anzahl der Elemente überprüft. Erst wenn in beiden Knoten die
maximale Anzahl an Elementen gegeben ist, ist die Bedingung erfüllt.
Findet das Programm einen solchen Knoten so wird eine Zufallszahl
erstellt. Ansonsten wird ein neuer Baum generiert.
4.6.4
Löschen ohne Unterlauf
Beim Löschen ohne Unterlauf wird ein Blattknoten gesucht, welcher
mehr als n Elemente enthält.
36
Karin Waldner
KAPITEL 4. IMPLEMENTIERUNG
Das Programm erstellt eine Liste von Blattknoten und prüft ob ein Blattknoten mehr als die minimale Anzahl an Elementen hat. Existiert ein
Knoten mit mehr als n Elementen, so wird das Löschen eines Elements
in diesem Knoten keinen Unterlauf erzeugen. Das Programm wählt anschließend zufällig, welches der vorhandenen Elemente gelöscht wird.
Findet das Programm keinen solchen Knoten so wird ein neuer Baum
erstellt und in diesem nach dem Knoten gesucht.
4.6.5
Löschen mit Unterlauf, welcher durch Zusammenfassen von Knoten behoben wird
Beim Löschen entsteht ein Unterlauf, welcher durch Zusammenfassen
mit einem Nachbarknoten behoben wird. Da beim Löschen mehrere Varianten bestehen welcher Algorithmus bzw. welcher Nachbarknoten zuerst kontrolliert wird, bietet das Programm zwei Varianten an.
Bei der ersten Variante hat die Rotation Vorrang, das Programm sucht
einen Blattknoten der genau n Elemente besitzt. Danach prüft das Programm ob der Blattknoten mit dem linken oder rechten Nachbarknoten eine Rotation möglich ist. Ist dies nicht der Fall bedeutet das, dass
der Knoten entweder mit seinem linken oder rechten Nachbarknoten
zusammengefasst wirden. Falls eine Rotation möglich ist, sucht das Programm einen anderen Blattknoten, welcher die Bedingung erfüllt. Existiert kein Knoten welcher mit seinem Nachbarknoten zusammengefasst
werden kann, so generiert das Programm einen neuen Baum.
Bei der zweiten Variante wird erst geprüft ob der Blattknoten die minimale Anzahl an Elementen hat und danach ob der linke Nachbarknoten
auch die minimale Anzahl an Elementen besitzt. Ist kein linker Nachbarknoten vorhanden so wird der rechte Nachbarknoten auf die Anzahl
der Elemente überprüft. Da bei dieser Variante immer zuerst der linke Nachbarknoten betrachtet wird, wird der rechte Nachbarknoten nur
kontrolliert falls kein linker Nachbarknoten vorhanden ist. Existiert kein
solcher Knoten generiert das Programm einen anderen Zufallsbaum und
durchsucht diesen Baum nach einen solchen Knoten.
4.6.6
Löschen mit Unterlauf, welcher durch eine Rotation
auf Blattebene behoben wird
Beim Löschen mit Unterlauf, welcher durch eine Rotation auf Blattebene
behoben wird, wird ein Blattknoten gesucht, welcher mit dem Nachbarknoten bei Unterlauf eine Rotation durchführt.
Hier existieren ebenfalls zwei Varianten. Bei der ersten Variante hat
wieder die Rotation Priorität. Das Programm sucht einen Blattknoten,
welcher genau die minimale Anzahl an Elemente besitzt. Danach prüft
das Programm ob der Knoten mit dem linken oder rechten NachbarKarin Waldner
37
KAPITEL 4. IMPLEMENTIERUNG
knoten eine Rotation machen kann. Falls dies bei keinem Blattknoten
möglich ist, generiert das Programm einen neuen Baum.
Bei der zweiten Variante wird wieder zuerst der linke Nachbarknoten betrachtet. Die Bedingung ist nur dann erfüllt, wenn der Knoten mit dem
linken Nachbarknoten eine Rotation durchführen kann. Hat der linke
Nachbarknoten n Elemente und der rechte Nachbarknoten mehr als n,
so ist keine Rotation möglich da links Priorität hat. Falls kein linker
Nachbarknoten vorhanden ist, wird kontrolliert ob der rechte Nachbarknoten mehr als n Elementen hat und gegebenenfalls wird mit dem
rechten Nachbarknoten eine Rotation durchgeführt. Wird kein Knoten
mit diesen Eigenschaften gefunden, wird ein neuer Baum generiert.
4.6.7
Löschen mit Unterlauf, welche durch Rotation im
Inneren des Baumes behoben wird
Bei der Rotation im Inneren des Baumes, wird zuerst ein Element in
einem Blattknoten mit n gelöscht. Der Blattknoten wird mit dem Nachbarknoten zusammegefügt und der Elternknoten besitzt ebenfalls nur
die minimale Anzahl an Elementen. Der Unterlauf im Elternknoten wird
dann mit einer Rotation behoben.
Bei der ersten Variante prüft das Programm ob der Knoten, welcher
genau n Elemente besitzt, mit beiden Nachbarknoten zusammengefasst
werden kann. Falls nur ein Nachbarknoten vorhanden ist, wird überprüft
ob der Knoten mit diesem Nachbarknoten zusammengefasst werden kann.
Ist dies möglich wird der Vaterknoten auf seine Anzahl der Elemente
überprüft. Die Bedingung ist erfüllt wenn der Vaterknoten die minimale Anzahl an Elementen besitzt und eine Rotation mit einem seiner
Nachbarknoten möglich ist. Falls der Baum diese Eigenschaften nicht
aufweist, generiert das Programm einen neuen Baum.
Bei der zweiten Varianten wird nur der linke Nachbarknoten überprüft.
Der Knoten wird mit dem linken Nachbarknoten zusammengefasst, insofern der linke Nachbarknoten nicht zu viele Elemente enthält. Danach
erfolgt die Überprüfung ob der Vaterknoten nur die minimale Anzahl an
Elementen besitzt. Dann wird geprüft ob der Vaterknoten mit seinem
linken Nachbarknoten eine Rotation machen kann. Falls diese Bedingungen nicht erfüllt sind, sucht das Programm einen anderen Baum.
4.6.8
Löschen in einem Inneren Knoten
Beim Löschen im Inneren des Baumes wird ein Element gelöscht, welches
sich nicht in einem Blattknoten befindet.
Das Programm wählt zufällig ein Element aus einem Knoten im Inneren
des Baumes aus. Diese Bedingung ist ab einer Baumhöhe 2 erfüllt.
38
Karin Waldner
KAPITEL 4. IMPLEMENTIERUNG
4.7
Graphische Benutzeroberfläche
In den folgenden Abschnitten wird das Aussehen der graphischen Benutzeroberfläche beschrieben und wie einzelne Bereiche davon implementiert wurden.
4.7.1
Darstellung der Startseite
Die graphische Benutzeroberfläche (siehe Abbildung 4.12) ist in vier Teile aufgeteilt. Der erste Teil ganz oben, welcher die gesamte Länge des
Bildschirms einnimmt, beinhaltet den Titel. In der Mitte der Website befindet sich die Zeichnung des Baumes. Die Zeichnung nimmt den
größten Platz ein. Eine Einstellung ermöglicht dem Nutzer die Animation des Baumes einzuschalten. Ist die Animation eingeschalten werden
die Operationen schrittweise angezeigt und die beteiligten Knoten werden farblich hervorgehoben. In Abbildung 4.13(a), Abbildung 4.14(a)
und Abbildung 4.15(a) ist die Suchoperation animiert dargestellt. Alle
beteiligten Knoten werden in einer anderen Farbe dargestellt.
Ist die Animation ausgeschaltet, werden alle Knoten in der selben Farbe
dargestellt und das Element wird eingefügt bzw. gelöscht ohne die beteiligten Knoten hervorzuheben.
Abbildung 4.12: Graphische Benutzeroberfläche
Rechts von der Zeichnung befindet sich die Anleitung. Ist die Animation eingeschaltet, wird die gesamte Anleitung dargestellt, jedoch jener
Schritt der Anleitung wird farbig gekennzeichnet, in welchem sich die
Animation gerade befindet. Ein Beispiel für die animierte Anleitung ist
auf Abbildung 4.13(b), Abbildung 4.14(b) und Abbildung 4.15(b) dargestellt. Der jeweilige Block wird farblich gekennzeichnet.
Falls die Animation ausgeschaltet ist, wird die gesamte Anleitung ohne
farbliche Kennzeichnung dargestellt. Der Benutzer blendet die Anleitung
Karin Waldner
39
KAPITEL 4. IMPLEMENTIERUNG
(a) Suche Block 1 animiert
(b) Anleitung Block 1
animiert
Abbildung 4.13: Animierte Zeichnung und Anleitung
(a) Suche Block 2 animiert
(b) Anleitung Block 2
animiert
Abbildung 4.14: Animierte Zeichnung und Anleitung
(a) Suche Block 3 animiert
(b) Anleitung Block 3
animiert
Abbildung 4.15: Animierte Zeichnung und Anleitung
40
Karin Waldner
KAPITEL 4. IMPLEMENTIERUNG
aus, falls er die Anleitung nicht braucht.
Am unteren Rand befinden sich die Operationen. Dort sind alle B-Baum
Operationen aufgelistet. Ganz links befindet sich eine Liste aus der die
Ordnung ausgewählt wird. Standardmäßig ist die Ordnung 2 eingestellt.
Darunter befindet sich das Textfeld wo die Elemente eingegeben werden. Links davon befinden sich die Schaltfläche für Suchen, Einfügen
und Löschen. Darunter kann der Löschalgorithmus ausgewählt werden.
Der Nutzer wählt einen von drei Algorithmen aus.
Darunter befindet sich die Schaltfläche zum Ein- und Ausschalten der
Animation, außerdem die Schaltfläche für weitere Funktionen.
4.7.2
Darstellung des Funktionsfensters
Über die Schaltfläche Weitere Funktionen“ wird ein Fenster mit zusätzlichen
”
Funktionen geöffnet (siehe Abbildung 4.16).
Abbildung 4.16: Fenster für Weitere Funktionen“
”
Hier werden unter anderem die Zufallsbäume erstellt. Ganz oben wird
der Zufallsbaum mit Ordnung und Höhe erstellt. Darunter befindet sich
die Variante, bei welcher der Nutzer Ordnung und Anzahl der Elemente eingibt. Ganz unten befindet sich das Erstellen bzw. Bearbeiten von
Bäumen. Für das Erstellen von Bäumen wird noch über das Textfeld
die Ordnung eingegeben.
Die Spalte daneben enthält die Latex - Ausgabe, Aufgabenblatt und
Zoom. Der Benutzer lässt sich entweder den Latex-Code, welcher das
Qtree - Package oder das Tikz - Package nutzt, ausgeben. Standardmäßig
ist die Zeichnung auf den größten Zoom eingestellt. Das heißt der Nutzer kann zu Beginn nur den Baum verkleinern. Ganz unten in der Spalte
werden die Übungsblätter erstellt. Die Übungsblätter werden wiederum
in zwei verschiedenen Varianten zur Verfügung gestellt. Sie unterscheiden sich voneinander durchs Löschen. Die erste Variante kontrolliert ob
eine Rotation möglich ist. Erst wenn dies nicht der Fall ist werden Knoten zusammengefasst. Bei der zweiten Variante wird falls vorhanden der
linke Nachbarknoten hergenommen.
Karin Waldner
41
KAPITEL 4. IMPLEMENTIERUNG
4.7.3
Implementierung der Benutzeroberfläche
Die Implementierung der Oberfläche erfolgt mit dem Google Web Toolkit [6]. Für die Installation von GWT benötigten Pakete, werden in
Eclipse über Hilfe / Neue Software heruntergeladen. Nach der Installation ist die Menüleiste um den Menüpunkt Google Services and Develop”
ment Tools“ erweitert. Über den neuen Menüpunkt werden die Pakete
und Klassen für ein GWT-Projekt erstellt. Standardmäßig wird ein kleines Projekt mit bereits implementiertem Client erstellt. Die Klassen im
Client-Paket werden danach überschrieben. Installation und ein erstes
Beispiel ist in [8] beschrieben.
Bei GWT ist es nicht möglich die Java - Klassen für die Implementierung der Obefläche zu nutzen. GWT stellt eigene Elemente dafür zur
Verfügung. Werden komplexere Oberflächen erstellt, bietet GWT die Erweiterung GXT [10] an. Für dieses Projekt wird GXT verwendet. Damit
GXT benutzt werden kann, werden in der XML Datei die Zeilen
<inherits name=’com.sencha.gxt.ui.GXT’/>
<inherits name=’com.sencha.gxt.chart.Chart’/>
eingefügt. GXT besteht aus mehreren Paketen. Für die grundlegenden
Elemente reicht das erste Paket aus. Das zweite Paket wird in dieser
Arbeit für das Zeichnen des Baumes benötigt. Die Pakete können auf
[9] heruntergeladen werden.
GWT benötigt einen Einstiegspunkt und daher wird die Einstiegsklasse von der Klasse EntryPoint abgeleitet. Die Methode onModuleLoad()
wird überschrieben. Sie enthält das RootPanel und die Viewport. Das
RootPanel bildet die Grundlage auf welcher das Viewport gelegt wird.
Auf das Viewport wird daraufhin die eigentliche Benutzeroberfläche implementiert. Layouts, Schaltflächen, Textfelder usw. werden ähnlich zu
Java erstellt. Positionen der einzelnen Felder und das Aussehen kann
sowohl in der Java Klasse, als auch in der XML Datei festgelegt werden.
Die Beispiele für das Erstellen der Oberfläche sind auf [11] zu finden.
Für die Anleitung wird ein HTML Objekt benutzt. Der gesamte Text
für die Anleitung wird in HTML geschrieben, wobei auf Umlaute in
der deutschen Sprache aufgepasst wird. Für Textformatierungen, werden HTML Befehle benützt.
Für die Zeichnung des Baumes wird eine eigene Zeichenkomponente
(DrawComponent) benötigt. Auf der Zeichenkomponente werden vorgefertigte Komponenten (Sprites) gezeichnet. Die Knoten des Baumes
sind Rechtecke. Die Größe der Rechtecke wird aus der Ordnung und der
Ziffernzahl der Ziffern im Knoten berechnet. Danach werden die Elemente in dem Knoten gezeichnet und durch einen Trennstrich voneinander
getrennt. Falls der Knoten kein Blattknoten ist, wird vom linken unteren Eck bzw. vom rechten unteren Eck eine Linie zum Kindknoten
42
Karin Waldner
KAPITEL 4. IMPLEMENTIERUNG
gezogen. Die Verwendung der Zeichenkomponente zeigt [11] unter dem
Menüpunkt Draw“.
”
Damit die Operationen animiert werden können, wurde die Klasse AnimationTask eingeführt, welche von der Klasse DelayedTask1 erbt. DelayedTask ermöglicht ein sleep/wait in GWT zu realisieren. Der AnimationTask bekommt eine Liste von Zeichenkomponenten, welcher dieser
wie Bilder behandelt. Die Bilder entstehen in den einzelnen Operationen. Für jeden wichtigen Schritt einer jeden Operation wird ein neues
Bild erzeugt, wobei die betroffenen Knoten farblich hervorgehoben werden. Der AnimationTask bekommt nach jeder durchgeführten Operation
eine Liste der Bilder und spielt diese verlangsamt ab. Dadurch werden
die einzelnen Schritte der Operationen in der Zeichnung animiert dargestellt.
Bei der Animation wird neben der Zeichnung auch die Anleitung animiert. Der AnimationTask erhält zu jedem Bild die passende Anleitung.
In jedem Schritt wird die Zeichnung dargestellt und der dazugehörende
Teil der Anleitung farblich gekennzeichnet. In Abbildung 4.17 ist die
Animation ausgeschaltet. Weder die Knoten im Baum noch Teile der Anleitung werden farblich hervorgehoben. In Abbildung 4.18 ist die Animation eingeschaltet. Der an der Operation beteiligte Knoten wird farblich
gekennzeichnet. In der Anleitung wird jener Teil farblich hervorgehoben,
welcher den aktuellen Schritt der Animation beschreibt.
Abbildung 4.17: Animation ist ausgeschaltet
1
http://dev.sencha.com/deploy/gxt-3.0.0/javadoc/gxt/com/sencha/gxt/
core/client/util/DelayedTask.html
Karin Waldner
43
KAPITEL 4. IMPLEMENTIERUNG
Abbildung 4.18: Animation ist eingeschaltet
4.8
Internationalisierung
GWT bietet ähnlich zu Java eine Internationalisierung an. Jedoch wird
diese nicht über die Benutzerumgebung aufgerufen, da nicht jene von
Java, sondern eine eigene von GWT, genutzt wird.
Am Anfang ist zu überlegen in welchen Sprachen die Webseite angezeigt
wird. In dieser Arbeit wird die Webseite auch in die englische Sprache
übersetzt.
Für die Internationalisierung wird in der zum Projekt gehörenden XML
- Datei, die Erweiterung
<inherits name="com.google.gwt.i18n.I18N"/>
eingefügt. Für jede Sprache wird die Zeile
<extend-property name="locale" values="sprache"/>
eingefügt. In dieser Arbeit enthält die XML Datei folgende Zeilen:
<inherits name="com.google.gwt.i18n.I18N"/>
<extend-property name="locale" values="de"/>
<extend-property name="locale" values="en"/>
Der Eintrag in der XML Datei ermöglicht zwischen den einzelnen Sprachen zu wechseln, indem der URL - Parameter locale“ gesetzt wird.
”
Wird locale“ auf locale=de“ gesetzt, wird die deutsche Webseite an”
”
gezeigt, bei locale=en“ die englische Webseite.
”
Danach wird ein Interface mit den Namen Languages.java angelegt. In
diesem Interface befinden sich Typzuweisung und Variablennamen aller
44
Karin Waldner
KAPITEL 4. IMPLEMENTIERUNG
Zeichenketten welche in mehreren Sprachen angezeigt werden. Das Interface erbt von der Klasse Messages im Paket com.google.gwt.i18n.client.
Die eigentliche Übersetzung wird in Properties - Dateien festgelegt. Diese Datei enthält alle Zeichenketten, welche in mehreren Sprachen angezeigt werden. Der Aufbau ist simpel: links der Variablenname und rechts
die Zeichernkette. Da die Typzuweisung bereits im Interface erfolgte, ist
es nicht mehr notwendig in den Properties - Dateien den Variablentyp
anzugegeben. Die Languages.properties - Datei wird standardmäßig bei
Aufruf der Website verwendet. Quelltext 4.2 stellt einen Auszug aus der
deutschen Properties - Datei dar.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
b t r e e 0=
b t r e e 1=Beginnend b e i d e r Wurzel
b t r e e 1 0=\ k l e i n e r a l s das e r s t e Element i n dem B l a t t k n o t e n
b t r e e 1 0 0=\ wird i n den Vaterknoten v e r s c h o b e n .
b t r e e 1 0 1=Die neuen Knoten s i n d : Vaterknoten
b t r e e 1 0 2 =, l i n k e r Knoten
b t r e e 1 0 3 =, r e c h t e r Knoten
b t r e e 1 0 4 =.
b t r e e 1 0 5=Sind d i e Kindknoten k e i n e Bl&auml ; t t e r ,
s o m&uuml ; s s e n noch d e r e n Kindknoten an d i e r i c h t i g e P o s i t i o n
gegeben werden .
b t r e e 1 0 6=Da genau n Element im r e c h t e n Nachbarknoten vorhanden
s i n d , wird d e r Knoten
b t r e e 1 0 7=\ mit den r e c h t e n Knoten
b t r e e 1 0 8=\ zusammengefasst
Quelltext 4.2: Languages.properties: Standardmäßig wird die Website in
Deutsch aufgerufen.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
b t r e e 0=
b t r e e 1=S t a r t i n g a t t h e r o o t ,
b t r e e 1 0=\ i s s m a l l e r than t h e f i r s t e l e m e n t i n t h e l e a f node
b t r e e 1 0 0=\ i s moved t o t h e p a r e n t node .
b t r e e 1 0 1=The new nodes a r e : p a r e n t node
b t r e e 1 0 2 =, l e f t node
b t r e e 1 0 3 =, r i g h t node
b t r e e 1 0 4 =.
b t r e e 1 0 5=I f t h e c h i l d node d o e s not l e a f s s o nor i t s c h i l d
nodes must be g i v e n t o t h e c o r r e c t p o s i t i o n .
b t r e e 1 0 6=Because a r e e x a c t l y n e l e m e n t i n t h e r i g h t a d j a c e n t
node e x i s t s , t h e node
b t r e e 1 0 7=\ i s merged with t h e r i g h t node
b t r e e 1 0 8 =.
Quelltext 4.3: Languages en.properties: Übersetzung der Anleitung ins
englische.
Fürs Englische wird die Datei Languages en.properties erstellt. Die Zeichenketten werden in die angegebenen Sprachen übersetzt. Ein Beispiel
für die englische Übersetzung wird in Listing 4.3 dargestellt.
Karin Waldner
45
KAPITEL 4. IMPLEMENTIERUNG
Nach diesem Schritt sind die Übersetzungen vollständig, jedoch in den
Java Dateien noch nicht abrufbar. In der Java Datei wird durch
Language languages = GWT.create (Languages.class)
die Internationaliserung eingebunden. Zum Schluss werden noch alle
sprachenspezifischen Zeichenketten ausgetauscht. Dafür werden alle Zeichenketten durch den Variablennamen aus der Languages Datei ersetzt
(der Zugriff erfolgt über languages.variablenname). In Quelltext 4.4 ist
ein Auszug des Quellcodes vor der Internationalisierung zu sehen, in
Quelltext 4.5 nach der Internationalisierung.
2
3
4
5
i f ( r o o t != null ) \{
t h i s . t e x t = ” Beginnend b e i d e r Wurzel ” + r o o t + ” wird
nach d e r Zahl ” + key + ” g e s u c h t .< br>” ;
\}
Quelltext 4.4: Codeauszug vor der Internationalisierung
2
3
4
5
i f ( r o o t != null ) \{
this . text = languages . btree1 ( ) + root +
l a n g u a g e s . b t r e e 2 ( ) + key + l a n g u a g e s . b t r e e 3 ( ) ;
\}
Quelltext 4.5: Codeauszug nach der Internationalisierung
Nach der Internationalisierung wurde jede Zeichenkette durch einen Variablennamen ersetzt. Gegenüber Java und deren Benutzeroberfläche
stellt GWT keine automatisierte Internationalisierung zur Verfügung.
Der Programmierer muss die Einträge in die XML Datei, das Interface,
die Dateien mit der Übersetzung sowie den Austausch der Zeichenketten
in der Java Datei selbst erledigen2 .
2
Tutorial zur Erstellung von Internationalisierungen in GWT: http://sellfisch.
de/gwt-tutorial-4-internationalisierung/
46
Karin Waldner
Kapitel 5
Zusammenfassung
In dieser Arbeit wurden Struktur und Konzepte von B-Bäumen erklärt.
Grundlegende Operationen und die dazugehörenden Algorithmen wurden aufgezeigt und durch Beispiele verständlich erklärt.
Danach wurde festgelegt, welche Funktionen das Programm beherrschen
soll. Hierbei stand die Veranschaulichung der Operationen und eine genaue Anleitung im Mittelpunkt. Das webbasierte Tool zeigt die wichtigsten Schritte graphisch und der Benutzer sieht nebenbei die dazu passende Anleitung. Das Tool erzeugt zufällige Bäume und der Nutzer hat die
Möglichkeit, einen ihm bereits bekannten Baum zu erstellen. Somit kann
der Benutzer sofort an größeren und aufwendigeren Bäumen üben. Die
letzte wichtige Funktion ist die Erstellung von Übungsblättern. Durch
die Parametereingabe kann ausgewählt werden, welche Algorithmen durch
das darauffolgende Löschen/Einfügen benutzt werden und welche Zahlen
eingefügt/gelöscht werden um die Algorithmen zu nutzen. Anschließend
wird dieser Baum erzeugt und das Übungsblatt als Latex-Code ausgegeben.
Einzelne Teile des Tools können noch erweitert werden. Das Erstellen
von Zufallsbäumen durch Eingabe von Ordnung und Höhe kann um die
Angabe des Füllgrades erweitert werden. Für das Erstellen und Bearbeiten das Baumes kann noch eine graphische Oberfläche erstellt werden,
damit der zu erstellende oder bearbeitende Baum nicht textuell eingeben
werden muss, sondern vom Benutzer gezeichnet wird.
47
Handbuch
Standardmäßig wird die deutsche Webseite aufgerufen. Um auf die englische Webseite zu gelangen wird der URL-Parameter locale=en gesetzt.
Abbildung 1: Startseite Übungstool
Die Webseite wird in Abbildung 1 dargestellt. In der Mitte der Webseite
wird der Baum gezeichnet. Daneben befindet sich die Anleitung. Den
unteren Teil des Bildschirmes nehmen die Operationen und Funktionen
ein. Zu Beginn ist die Ordnung des Baumes auf 2 eingestellt, die Animation ist eingeschaltet und die Anleitung ist eingeblendet.
A.1
Anleitung
Die Anleitung wird schrittweise aufgebaut und erklärt jeden Schritt der
einzelnen Algorithmen. Die Anleitung ist nicht allgemein gehalten sondern beschreibt den Algorithmus anhand des gezeichneten Baumes. Die
Abbildung 2(a) zeigt eine eingeblendete Anleitung. Wird die Anleitung
nicht benötig, so wird sie über die Schaltfläche mit der doppelten Pfeilspitze nach rechts, welche sich neben der Überschrift Anleitung“ befin”
det, ausgeblendet. Abbildung 2(b) zeigt eine ausgeblendete Anleitung.
Nachdem die Anleitung ausgeblendet ist, befindet sich am rechten Rand
eine vertikale Leiste, an deren oberen Ende sich eine Schaltfläche mit einer doppelten Pfeilspitze befindet. Durch klicken auf diese Schaltfläche
wird die Anleitung wieder eingeblendet.
49
APPENDIX A.2. OPERATIONEN UND ANIMATION
(a) Anleitung ist eingeblendet
(b) Anleitung ist ausgeblentet
Abbildung 2: Anleitung
A.2
Operationen und Animation
In Abbildung 3 ist der untere Teil der Webseite dargestellt. Hier befinden
sich die Operationen.
Abbildung 3: Operationen
In der ersten Zeile wird die Ordnung ausgewählt. Das Auswahlmenü
beinhaltet die Ordnung 1 bis 5.
Darunter befindet sich das Textfeld zur Eingabe der Schlüssel und daneben die Schalftflächen für Einfügen, Löschen und Suchen. In dem Textfeld müssen ganzstellige positive Zahlen eingegeben werden. Wird ein
Buchstabe, negative Zahl oder Kommazahl eingegeben, erscheint eine
Meldung, die mitteilt dass dies eine ungültige Eingabe ist. Sobald auf
eine Operation gedrückt wird, wird der Baum gezeichnet bzw. die Animation gestartet.
In der Zeile darunter wird der Algorithmus zum Löschen von Schlüsseln
ausgewählt. ’R/Z’ bedeutet, dass bevorzugt eine Rotation gemacht wird.
Erst wenn keine Rotation möglich ist, werden Knoten zusammengefasst.
’L’ steht für Links und bedeutet, dass beim Löschen immer mit dem
linken Knoten zusammengefasst oder eine Rotation gemacht wird. Nur
falls links kein Knoten vorhanden ist, wird der Unterlauf mit Hilfe des
rechten Nachbarknotens behandelt. ’R’ steht für Rechts, das heißt bei
dieser Variante wird zu erst der rechte Nachbarknoten angeschaut. Falls
dieser nicht existiert wird der Unterlauf mit Hilfe des linken Nachbar50
Karin Waldner
APPENDIX A.3. WEITERE FUNKTIONEN
knotens behoben.
In der untersten Zeile ist das Menü für weitere Funktionen und die
Schaltflächen für die Animation. Die Animation wird über eine Box einund ausgeschaltet. Falls die Animation aktiviert ist, erscheint daneben
eine weitere Schaltfläche mit welcher die Animation angehalten bzw.
fortgesetzt wird. Ist die Animation eingeschaltet dann werden die einzelnen Operationen graphisch dargestellt. Abbildung 4 und Abbildung 5
zeigen die Animation für das Einfügen eines Elementes.
(a) Suche beginnt in der Wurzel
(b) Suche wird im rechtem Teilbaum fortgesetzt
Abbildung 4: Animation: Suche von 12
(a) 12 wird eingefügt
(b) Aufteilen der Knoten
Abbildung 5: Animation: Einfügen von 12
Die Animation wird mit der Start/Pause Schaltfläche angehalten. Zum
Fortsetzen wird nochmals auf die Start/Pause Schaltfläche gedrückt. Sobald die Operation durchgeführt wurde und die Animation beendet ist,
wird die Animation durch nochmaliges Drücken der Start/Pause Schaltfläche von Neuem gestartet.
A.3
Weitere Funktionen
Über die Schaltfläche Weitere Funktionen“ erscheint ein Fenster, in
”
dem weitere Funktionen aufgelistet sind. Abbildung 6 stellt das Fenster
Weitere Funktionen“ dar. Die einzelnen Funktionen werden im folgen”
den Kapitel beschrieben.
A.3.1
Erstellung von Zufallsbäumen
In der ersten Zeile wird durch Eingabe von Ordnung und Höhe ein Zufallsbaum erzeugt. Für beide Textfelder gilt, dass eine ganzstellige Zahl
Karin Waldner
51
APPENDIX A.3. WEITERE FUNKTIONEN
Abbildung 6: Weitere Funktionen
welche größer 0 ist eingegeben wird. Wird ein Buchstabe, negative Zahl
oder Kommazahl eingegeben erscheint eine Fehlermeldung. Nach Eingabe der Ordnung und Höhe wird auf die Schaltfläche Zufallsbaum
”
erstellen“ gedrückt und das Programm erstellt einen Zufallsbaum.
In der Zeile darunter wird ebenfalls ein Zufallsbaum generiert. Über die
Textfelder Ordnung“ und Anzahl Elemente“ werden die Ordnung und
”
”
die Anzahl der Elemente eingegeben. Auch hier gilt, dass die Zahlen
größer 0 sein müssen und ganzstellige Zahlen sind. Falls dies nicht der
Fall ist erscheint eine Fehlermeldung.
A.3.2
Erstellen eines Baumes
Ganz unten wird ein neuer Baum erstellt. Im Textfeld wird eine ganzstelliger Zahl welche größer 0 ist eingegeben. Nachdem auf die Schaltfläche
Baum erstellen“ gedrückt wurde, wird ein weiteres Fenster geöffnet. In
”
diesem Fenster ist der Baum einzugeben. Die Knoten werden in eckigen Klammern dargestellt und die Knoten sind durch kein Trennzeichen
getrennt. Die Schlüssel stehen in Klammern und werden durch einen Beistrich voneinander getrennt. Die Wurzel steht ganz oben, danach wird
jede Ebene von links nach recht und von oben nach unten eingetragen.
Die Abbildung 7 zeigt wie ein neuer Baum erstellt wird.
(a) Editor
(b) Eingabe
(c) Baum
Abbildung 7: Baum erstellen
Die Eingabe in das Textfeld erfolgt wie in Abbildung 7 dargestellt. Falls
52
Karin Waldner
APPENDIX A.3. WEITERE FUNKTIONEN
die Syntax nicht korrekt ist, der Baum nicht sortiert ist oder eine nicht
ganzstellige positive Zahl eingegeben wird, erscheint eine Fehlermeldung.
Für das Bearbeiten des B-Baumes steht unter Weitere Funktionen“ eine
”
Schaltfläche Bearbeiten“ zur Verfügung. Dabei öffnet sich dasselbe Fen”
ster wie für das Erstellen von Bäumen. Jedoch steht diesmal der aktuelle
Baum in dem Fenster. Nun werden Schlüssel oder Knoten hinzugefügt
bzw. Schlüssel und Knoten gelöscht.
A.3.3
Ausgabe des Latex-Codes
Eine weitere Funktion ist die Ausgabe des Baumes in Latex-Code. Durch
das Drücken der Schaltfläche Latex“ erscheint ein neues Fenster, der
”
den Baum als Latex-Code enthält. Bei dieser Variante wird der Baum
mit dem Usepackage Qtree“ (siehe Abbildung 8(a)) erstellt. Daneben
”
befindet sich die Schaltfläche Latex Tikz“, welche ebenfalls den Baum
”
als Latex-Code ausgibt. Jedoch wird hier das Usepackage Tikz“ benutzt
”
(siehe Abbildung 8(b)). Der Code muss herauskopiert, in einem Editor
abgespeichert und anschließend kompiliert werden.
(a) Ausgabe Latex-Code mit Usepackage Qtree
(b) Ausgabe Latex-Code mit Usepackage Tikz
Abbildung 8: Latex-Code
Die Bäume werden nur bis zu einer festgelegten Größe korrekt in Latex
dargestellt. Für den Latex-Code mit den Tikz Usepackage besteht die
Möglichkeit, die Skalierung, den Abstand zwischen den Ebenen und den
Abstand zwischen den Knoten einzustellen:
[scale=0.6,
Karin Waldner
53
APPENDIX A.3. WEITERE FUNKTIONEN
level
every
level
level
distance=50pt,
node/.style={inner sep=0pt,font=\small},
1/.style={sibling distance=400pt},
2/.style={sibling distance=100pt}]
Durch scale“ wird die Größe der Zeichnung verändert. Mit level distan”
”
ce“ der Abstand zwischen den einzelnen Ebenen. Bei level 1/.style=sibling
”
distance=400pt“ wird durch level“ die Ebene angegeben und durch
”
sibling distance=“ der Abstand zwischen den Knoten.
”
A.3.4
Größe der Zeichnung ändern
Unter den Schaltflächen für die Ausgabe des Latex-Codes befinden sich
die Schaltflächen für das Vergrößern und Verkleinern der Zeichnung.
Über Zoom + “ wird die Zeichnung vergrößert und über Zoom - wird
”
”
”
die Zeichnung verkleinert. Zu Beginn ist der Baum bei der maximalen
Größe gezeichnet. Das heißt die Zeichnung kann zu Beginn nur verkleinert werden. Ein Beispiel für den Zoom zeigt Abbildung 9.
(a) Zoom +
(b) Zoom -
Abbildung 9: Zoom
A.3.5
Erstellung von Übungsblättern
Die letzte Funktion ist die Erstellung von Übungsblättern. Über die
Schaltfläche Aufgabe“ wird ein Aufgabenblatt erstellt bei welchen der
”
Löschalgorithmus R/Z“ entspricht. Sobald auf die Schaltfläche gedrückt
”
wird, erscheint ein weiteres Fenster. Abbildung 10 stellt das Fenster für
die Erstellung von Übungsblättern dar. In diesem Fenster befinden sich
zwei Textfelder, in welchen die Ordnung und die Anzahl der Elemente
eingegeben werden. Gültig sind ganzstellige positive Zahlen, die größer
0 sind. Bei ungültiger Eingabe erscheint eine Fehlermeldung. Darunter
befindet sich eine Liste, in der ausgewählt wird, welche Operationen
enthalten sein sollen.
Danach erstellt das Programm ein Übungsblatt mit den gewünschten
Operationen. Die Ausgabe erfolgt über ein neues Fenster in dem der
Latex-Code des Baumes angezeigt wird. Im Latex-Code werden unter
54
Karin Waldner
APPENDIX A.3. WEITERE FUNKTIONEN
Abbildung 10: Eingabe und Liste zum Erstellen von Aufgabenblättern
dem Baum die Operationen, welche ausgewählt wurden, hinzugefügt.
Neben jeder Operation steht als Kommentar durch welchen Algorithmus die Operation gelöst wird. Ein Beispiel für die Ausgabe des LatexCodes ist in Abbildung 11(a) dargestellt. Die Operationen werden dabei
immer auf den Ursprungsbaum, und nicht auf den durch Einfügen oder
Löschen neu entstandenen Baum, durchgeführt. Zum Schluss wird noch
der Zufallsbaum, wie in Abbildung 11(b), gezeigt.
(a) Ausgabe der Aufgabe
(b) Zeichnung des Baumes
Abbildung 11: Aufgabe erstellen
Karin Waldner
55
Literaturverzeichnis
[1]
Bayer Rudolf, McCreight Edward: Organization and Maintenance of Large Ordered Indexes. In: Acta Informatica 1 (1972),
S. 173–189
[2]
Ottmann Thomas, Widmayer Peter:
Algorithmen und
Datenstrukturen. 4. Auflage. Heidelberg, Berlin : Spektrum Akademischer Verlag, 2002. – 331–339 S.
[3]
Kemper Alfons, Eickler André: Datenbanksysteme Eine
Einführung. 6. Auflage. München : Oldenbourg Verlag, 2006. –
211–217 S.
[4]
Comer Douglas: The Ubiquitous B-Tree. In: Computing Surveys
11 (1979), S. 123–137
[5]
Knuth Donald: The Art of Computer Programming. Bd. III:
Sorting and Searching. Massachusetts : Addison-Wesley, 1973. –
476–479 S.
[6]
Google: GWT Project. http://www.gwtproject.org/, 2014. –
Zugriff: 09-04-2014
[7]
Google: GWT Project Overview. http://www.gwtproject.org/
overview.html, 2014. – Zugriff: 09-04-2014
[8]
Google: GWT Project - Using Eclipse. http://www.gwtproject.
org/usingeclipse.html, 2014. – Zugriff: 09-04-2014
[9]
Sencha: Java Component UI Library. http://www.sencha.com/
products/gxt/, 2014. – Zugriff: 09-04-2014
[10] Google: Using Ext GWT (GXT). https://developers.google.
com/web-toolkit/tools/gwtdesigner/features/gwt/gxt?hl=
de, 2014. – Zugriff: 09-04-2014
[11] Sencha: Sencha GXT Explorer Demo. http://www.sencha.com/
examples/#, 2014. – Zugriff: 09-04-2014
57
Herunterladen