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