Die Mediathek
AFB I–IIDie Mediathek einer Schule verwaltet ihre Medien in einem binären Suchbaum vom Typ BinTree<Medium>. Geordnet wird nach der Mediennummer; jede Nummer kommt höchstens einmal vor. Die Klasse Medium bietet die Operationen getNummer(): Ganzzahl und getTitel(): Zeichenkette.
- Beschreiben Sie die Eigenschaft, die einen binären Suchbaum auszeichnet, und zeigen Sie an zwei Knoten des Materials, dass sie erfüllt ist. 3 BE
- Stellen Sie die Suche nach den Nummern 3100 und 8500 jeweils in einer Tabelle mit den Spalten Knoten, Vergleich und weiter dar. 4 BE
- Implementieren Sie die Methode
static String titelZu(BinTree<Medium> b, int nr), die den Titel des Mediums mit der Nummernrliefert oder den leeren Text, falls es keines gibt. 5 BE - Die Kreismediathek hat 100 000 Medien. Schätzen Sie ab, wie viele Vergleiche eine Suche im ungünstigsten Fall braucht, wenn der Baum ausgeglichen ist bzw. wenn die Medien in der Reihenfolge ihrer Nummern eingefügt wurden. 4 BE
Insgesamt 16 BE
Hinweise
Hinweis zu Aufgabe a)
Hinweis zu Aufgabe b)
Hinweis zu Aufgabe c)
nr mit getItem().getNummer().Hinweis zu Aufgabe d)
Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
Für jeden Knoten gilt: Alle Nummern im linken Teilbaum sind kleiner, alle im rechten Teilbaum größer als seine Nummer. Beispiel 2840: links 1570 < 2840, rechts 3920 und 3100 > 2840. Beispiel 5230: links stehen nur Nummern unter 5230 (höchstens 3920), rechts nur Nummern über 5230 (ab 6010).
Erwartungshorizont zu Aufgabe b)
Suche nach 3100:
| Knoten | Vergleich | weiter |
|---|---|---|
| 5230 | 3100 < 5230 | links |
| 2840 | 3100 > 2840 | rechts |
| 3920 | 3100 < 3920 | links |
| 3100 | 3100 = 3100 | gefunden |
Suche nach 8500:
| Knoten | Vergleich | weiter |
|---|---|---|
| 5230 | 8500 > 5230 | rechts |
| 7460 | 8500 > 7460 | rechts |
| 8850 | 8500 < 8850 | links |
| 8120 | 8500 > 8120 | rechts |
| leerer Baum | — | nicht vorhanden |
Erwartungshorizont zu Aufgabe c)
static String titelZu(BinTree<Medium> b, int nr) {
while (!b.isEmpty()) {
Medium m = b.getItem();
if (nr == m.getNummer()) {
return m.getTitel();
}
if (nr < m.getNummer()) {
b = b.getLeft();
} else {
b = b.getRight();
}
}
return "";
}Eine rekursive Lösung mit dem leeren Baum als Abbruch ist gleichwertig.
Erwartungshorizont zu Aufgabe d)
Ausgeglichen: Aus \(100\,000\le 2^h-1\) folgt \(h\ge\log_2(100\,001)\approx 16{,}6\), also h = 17 — höchstens 17 Vergleiche. Nach Nummern sortiert eingefügt, wird jede neue Nummer rechts an die vorige gehängt: Der Baum ist eine Kette der Höhe 100 000, im ungünstigsten Fall sind 100 000 Vergleiche nötig — nicht besser als die lineare Suche.
Das Wörterbuch
AFB II–IIIEin Rechtschreibprogramm speichert alle bekannten Wörter (nur Kleinbuchstaben) in einem binären Suchbaum vom Typ BinTree<String>. Geordnet wird lexikographisch mit compareTo: a.compareTo(b) ist negativ, wenn a vor b steht, 0 bei Gleichheit und sonst positiv. Ein Praktikant hat folgende Prüfmethode geschrieben:
static boolean pruefe(BinTree<String> b) {
if (b.isEmpty() || b.isLeaf()) {
return true;
}
String w = b.getItem();
if (!b.getLeft().isEmpty() && b.getLeft().getItem().compareTo(w) >= 0) {
return false;
}
if (!b.getRight().isEmpty() && b.getRight().getItem().compareTo(w) <= 0) {
return false;
}
return pruefe(b.getLeft()) && pruefe(b.getRight());
}
- Erläutern Sie, wie beim Suchen eines Wortes mit
compareToentschieden wird, in welchem Teilbaum weitergesucht wird. 3 BE - Entwerfen Sie eine Methode
static String kleinstesWort(BinTree<String> b), die für einen nicht leeren Suchbaum das alphabetisch erste Wort liefert, ohne alle Knoten zu betrachten. 3 BE - Widerlegen Sie mithilfe des Baums w die Behauptung,
pruefeerkenne jeden fehlerhaften Suchbaum, und erweitern Sie die Prüfung zu einer korrekten Methodestatic boolean istSuchbaum(BinTree<String> b, String min, String max). 6 BE - Alternativ könnten die Wörter sortiert in einer dynamischen Reihung stehen und mit der binären Suche gesucht werden. Beurteilen Sie beide Lösungen für ein Wörterbuch, das beim Schreiben ständig um neue Wörter ergänzt wird. 4 BE
Insgesamt 16 BE
Hinweise
Hinweis zu Aufgabe a)
Hinweis zu Aufgabe b)
Hinweis zu Aufgabe c)
pruefe gar nicht miteinander? Für den Baum w: Wo steht „tisch“ im Verhältnis zu „mond“? Für die Korrektur: Jeder Teilbaum hat einen erlaubten Bereich (min, max); beim Abstieg wird er enger.Hinweis zu Aufgabe d)
Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
Das gesuchte Wort x wird mit dem Wort der Wurzel verglichen: x.compareTo(b.getItem()). Ist das Ergebnis 0, ist das Wort gefunden. Ist es negativ, steht x alphabetisch vor dem Wurzelwort und kann nur im linken Teilbaum stehen; ist es positiv, nur im rechten. Ist der Teilbaum leer, ist das Wort unbekannt.
Erwartungshorizont zu Aufgabe b)
static String kleinstesWort(BinTree<String> b) {
while (!b.getLeft().isEmpty()) {
b = b.getLeft(); // immer links hinab
}
return b.getItem();
}Es wird nur der linke Rand des Baums betrachtet — höchstens h Knoten.
Erwartungshorizont zu Aufgabe c)
Im Baum w vergleicht pruefe nur „haus“ mit „mond“ (richtig: haus < mond) und „tisch“ mit „haus“ (richtig: tisch > haus). Sie liefert true. „tisch“ steht aber im linken Teilbaum von „mond“, obwohl tisch > mond — w ist kein Suchbaum. Die Behauptung ist widerlegt: Die Methode prüft nur direkte Kinder, nicht ganze Teilbäume.
static boolean istSuchbaum(BinTree<String> b, String min, String max) {
if (b.isEmpty()) {
return true;
}
String w = b.getItem();
if (min != null && w.compareTo(min) <= 0) {
return false; // zu klein für diesen Teilbaum
}
if (max != null && w.compareTo(max) >= 0) {
return false; // zu groß für diesen Teilbaum
}
return istSuchbaum(b.getLeft(), min, w) && istSuchbaum(b.getRight(), w, max);
}Aufruf mit istSuchbaum(w, null, null); null steht für „keine Grenze“. Für w liefert sie false.
Erwartungshorizont zu Aufgabe d)
Suchen: Beide brauchen im günstigen Fall etwa \(\log_2 n\) Vergleiche; die binäre Suche garantiert das, der Suchbaum nur, wenn er ausgeglichen ist. Einfügen: In der sortierten Reihung muss nach der Suche mit insertAt eingefügt werden — im Mittel rücken n/2 Wörter nach. Im Suchbaum wird das Wort ohne Verschieben als Blatt angehängt (etwa \(\log_2 n\) Schritte). Da ständig neue Wörter hinzukommen, ist der Suchbaum vorzuziehen — solange die Wörter nicht alphabetisch sortiert eintreffen, denn dann entartet er. Sinnvoll wäre, den Baum gelegentlich neu ausgeglichen aufzubauen.
