Prof. Dr. V. Linnemann Ho Ngoc Duc Lübeck, den 27. April 2006 Universität zu Lübeck Institut für Informationssysteme Einführung in die Informatik II Informatik B Sommersemester 2006 4. Übungsblatt Aufgabe 1: Hashtabellen mit Kollisionsbehandlung Fügen Sie die Schlüsselfolge 17, 42, 22, 4, 20, 29, 48, 35, 26, 38 in eine zu Beginn leere Hashtabelle der Länge ein und verwenden Sie die /Hashfunktion mit . Als Kollisionsstrategie wird quadratisches Sondieren angewandt, d.h. . (6 Punkte) Aufgabe 2: B-Bäume a) Fügen Sie in den folgenden Ausgangs-B-Baum der Ordnung 2 in der gegebenen ! !" Reihenfolge die Zahlen nacheinander ein. Verwenden Sie für das Einfügen den Algorithmus mit Anleihe beim linken Nachbarn. Zeichnen Sie nach jedem Zwischenschritt den B-Baum, markieren Sie Überläufe. (4 Punkte) 30 50 70 130 2 5 20 23 32 34 40 41 60 63 b) Folgender B-Baum der Ordnung 2 sei gegeben: 1/4 80 90 100 120 131 140 30 20 25 1 3 4 21 22 40 50 26 28 32 33 34 44 45 52 55 " Löschen Sie in diesem B-Baum die Zahlen nacheinander in dieser Reihenfolge. Falls ein Element in einem Nichtblattknoten gelöscht wird, soll auf den linken Subbaum zurückgegriffen werden. Zeichnen Sie den B-Baum nach jedem Zwischenschritt. Markieren Sie auftretende Unterläufe und Anleihen. (5 Punkte) c) Das Laden eines Knotenblockes des B-Baumes vom Hintergrundspeicher soll 100 Zeiteinheiten (ZE) dauern, der sequentielle Zugriff in einem Block 1 ZE pro Schlüs in dem Ausgangs-B-Baum sel. Wieviele ZE werden für die Suche nach der vom letzten Aufgabenteil (b) benötigt, wenn zu Beginn kein Block geladen ist? (1 Punkt) Aufgabe 3: Implementierung von B-Bäumen Entwickeln Sie eine Java-Anwendung zur Verwaltung von B-Bäumen beliebiger Ordnung. Auf der Web-Seite der Übung wird Ihnen die Klasse BBaum zur Verfügung gestellt, die einen B-Baum teilweise implementiert. Die Baumknoten werden durch die Klasse BKnoten repräsentiert. Das folgende Listing zeigt einen Teil dieser Klasse: import java.util.*; public class BKnoten { private int ordnung; private BBaum baum; private BKnoten vater; private List schluessel; private List kinder; public BKnoten(BBaum baum, BKnoten vater, int ordnung) { this.baum = baum; this.vater = vater; this.ordnung = ordnung; this.schluessel = new ArrayList(); this.kinder = new java.util.ArrayList(); } // ... } 2/4 In einem Knoten werden die Schlüssel in der Liste schluessel gespeichert. Die in den Knoten gespeicherten Schlüssel müssen das Interface Comparable implementieren. Die Verweise auf Kinderknoten befinden sich in der Liste kinder. Ist der Knoten ein Blatt, dann ist die Liste kinder leer. Die Variable baum verweist auf das BaumObjekt, zu dem der Knoten gehört. Die Variable enthält die Referenz auf den Vaterknoten bzw. null wenn der Knoten die Wurzel des B-Baumes ist. a) Implementieren Sie die Methode public Comparable suchen(Comparable key) in BKnoten. Diese Methode soll rekursiv in dem Knoten und in den Nachfahren nach dem gegebenen Schlüssel suchen. Ist der Schlüssel im Baum enthalten, wird das im Baum gespeicherte Objekt zurückgegeben. Andernfalls gibt die Methode null zurück. (14 Punkte) b) Schreiben Sie eine Hilfsmethode int einfuegePosition(Comparable key, List ls) in Klasse BKnoten. Diese Methode berechnet die Stelle, in die der Schlüssel key in die sortierte Liste ls eingefügt werden muss, damit die Ergeb . nisliste sortiert bleibt. Der Rückgabewert ist also eine Zahl mit ! Wenn z.B. ls die Elemente enthält, dann ist die Einfügeposition 0 für Schlüssel kleiner als 20; sie ist 1 für Schlüsselwerte zwischen 20 und 30 usw. (4 Punkte) c) Wenn ein Schlüssel in einen B-Baum eingefügt werden soll, muss zunächst festgestellt werden, in welchen Teilbaum dieser Schlüssel einzufügen ist. Implementieren Sie zu diesem Zweck eine Methode BKnoten getTeilbaumFuer(Comparable key) in BKnoten, die für einen Nicht-Blatt-Knoten den Kindknoten zurückgibt, der die Wurzel des Teilbaumes bildet, in den der Schlüssel key einzufügen ist. (6 Punkte) Testen Sie Ihre Implementierung mit der Klasse BBaumTest, die ebenfalls auf der Übungsseite bereitgestellt wird. 3/4 Hinweise Kommentieren Sie Ihre Lösungen ! Falls Implementierungen auf dem Blatt gefordert werden, sind diese in gezippter Form mit dem Betreff: Blatt und der entsprechenden Nummer an [email protected] zu schicken, wobei das X durch Ihre Gruppennummer zu ersetzen ist. Die Gruppeneinteilung für das Sommersemester befindet sich auf der Übungsseite zur Vorlesung und ist bitte unbedingt zu beachten. Falls dennoch ein Tausch erforderlich sein sollte, kann dieser nur innerhalb der Gruppen des eigenen Studiengangs stattfinden. Die erste Seite soll oben rechts die Namen der beiden Abgebenden und die Übungsgruppennummer (wichtig!) enthalten. Besteht eine Lösung aus mehreren Zetteln, so sind diese zusammen zu heften. Bitte keine Hüllen, Mappen, o.ä. Zertifikat/Scheinkriterium: Für den Schein/das Zertifikat sind 50% der erreichbaren Punkte von jedem Übungsblatt, zweimaliges Vorrechnen in der Übung und das Bestehen der Klausur am Ende des Semesters erforderlich. Abgabetermin: Donnerstag, 4. Mai 2006, nach der Vorlesung 4/4