MINT üben

Binäre Suche rekursiv

Zwei Aufgaben im Abiturformat — von der Mitgliederliste bis zur Wurzel durch Halbieren.

Dein Fortschritt:
0 / 0 Aufgaben
1

Die Mitgliederliste

AFB I–II

Ein Sportverein speichert die Nachnamen seiner Mitglieder alphabetisch sortiert in einer Reihung namen. Die Suche verwendet compareTo: s.compareTo(t) ist negativ, wenn s alphabetisch vor t steht, 0 bei Gleichheit und sonst positiv.

Material 1: Ausschnitt der Reihung (Länge 10)
Material 2: Methode suche
static int suche(String[] namen, String gesucht, int links, int rechts) {
    if (links > rechts) {
        return -1;
    }
    int mitte = (links + rechts) / 2;
    int v = namen[mitte].compareTo(gesucht);
    if (v == 0) {
        return mitte;
    }
    if (v < 0) {
        return suche(namen, gesucht, mitte + 1, rechts);
    }
    return suche(namen, gesucht, links, mitte - 1);
}
  1. Beschreiben Sie die Rolle von v in der Methode und nennen Sie die Voraussetzung, unter der die Suche korrekt arbeitet. 3 BE
  2. Stellen Sie die Aufrufe von suche(namen, "Hoppe", 0, 9) und suche(namen, "Brandt", 0, 9) jeweils mit links, rechts, mitte und namen[mitte] dar. 5 BE
  3. Ändern Sie die Methode so ab, dass sie bei erfolgloser Suche nicht −1, sondern \(-(p + 1)\) liefert, wobei \(p\) die Position ist, an der der Name einsortiert werden müsste. 4 BE
  4. Schätzen Sie für einen Landesverband mit 80 000 Mitgliedern ab, wie viele Vergleiche eine Suche höchstens braucht und wie viele Rahmen dabei höchstens auf dem Aufrufstapel liegen. 3 BE

Insgesamt 15 BE

Hinweise

Hinweis zu Aufgabe a)
Vergleichen Sie mit der Suche auf Zahlen: Was entspricht dort a[mitte] < x?
Hinweis zu Aufgabe b)
Für „Brandt“: B-r kommt nach B-e, aber vor C.
Hinweis zu Aufgabe c)
Wo stehen links und rechts, wenn der Bereich leer wird?
Hinweis zu Aufgabe d)
Nutzen Sie \(\lfloor \log_2 n \rfloor + 1\) und berücksichtigen Sie den Aufruf mit leerem Bereich.