MINT lernen

Abituraufgaben: Lineare und binäre Suche

Zwei Aufgaben im Abiturformat — von der Ticketkontrolle bis zur Bereichsabfrage in sortierten Messwerten.

Dein Fortschritt:
0 / 0 Aufgaben
1

Ticketkontrolle beim Festival

13 BEAFB I–II

Am Einlass eines Festivals wird jedes Ticket gescannt. Die gültigen Ticketnummern stehen aufsteigend sortiert in der Reihung tickets. Geprüft wird mit der binären Suche aus dem Unterricht, die den Index oder −1 liefert.

Ausschnitt: Reihung tickets (Länge 16)
  1. Beschreiben Sie das Vorgehen der binären Suche und nennen Sie ihre Voraussetzung. (3 BE)
  2. Stellen Sie die Suche nach x = 5270 in einer Tracetabelle mit den Spalten links, rechts, mitte und tickets[mitte] dar. Geben Sie an, wie sich der Ablauf für x = 5100 unterscheidet. (4 BE)
  3. Erläutern Sie, warum die binäre Suche für die 16 Tickets höchstens 5 Vergleiche benötigt. (3 BE)
  4. Schätzen Sie ab, wie viele Vergleiche eine Prüfung bei 60 000 Tickets im ungünstigsten Fall mit binärer bzw. linearer Suche braucht und was das bei 2000 Scans pro Stunde bedeutet. (3 BE)

Hinweise

Hinweis zu Aufgabe a)
Suchbereich, Mitte, Vergleich, Verkleinern, Abbruch — in dieser Reihenfolge.
Hinweis zu Aufgabe b)
Die erste Mitte ist (0 + 15) / 2 = 7. Bei 5100 verlaufen die ersten drei Zeilen gleich.
Hinweis zu Aufgabe c)
Wie viele Elemente bleiben nach jedem erfolglosen Vergleich höchstens übrig?
Hinweis zu Aufgabe d)
\(2^{15} = 32\,768\), \(2^{16} = 65\,536\).

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)

Der Suchbereich umfasst anfangs alle Indizes (links = 0, rechts = Länge − 1). In jedem Schritt wird das mittlere Element mitte = (links + rechts) / 2 mit x verglichen: bei Gleichheit wird mitte zurückgegeben; ist tickets[mitte] kleiner, wird rechts weitergesucht (links ← mitte + 1), sonst links (rechts ← mitte − 1). Ist der Bereich leer (links > rechts), wird −1 geliefert. Voraussetzung: Die Reihung ist aufsteigend sortiert.

Erwartungshorizont zu Aufgabe b)
linksrechtsmittetickets[mitte]Entscheidung
01573925< x → links ← 8
815115613> x → rechts ← 10
81094876< x → links ← 10
1010105270gefunden → 10

Rückgabe 10 nach 4 Vergleichen (linear wären es 11). Für 5100 sind die ersten drei Zeilen identisch; in Zeile 4 gilt 5270 > 5100, also rechts ← 9. Wegen links = 10 > rechts = 9 endet die Suche mit −1 — ebenfalls nach 4 Vergleichen.

Erwartungshorizont zu Aufgabe c)

Jeder erfolglose Vergleich schließt die Mitte und eine Hälfte aus; übrig bleiben höchstens \(\lfloor n/2 \rfloor\) Elemente: 16 → 8 → 4 → 2 → 1. Nach vier erfolglosen Vergleichen ist höchstens ein Element übrig, der fünfte Vergleich entscheidet endgültig. Allgemein: \(\lfloor\log_2 16\rfloor + 1 = 5\).

Erwartungshorizont zu Aufgabe d)

Binär: \(\lfloor\log_2 60\,000\rfloor + 1 = 15 + 1 = 16\) Vergleiche; linear: 60 000. Pro Stunde also höchstens 32 000 gegen 120 Millionen Vergleiche — die binäre Suche ist rund 3750-mal sparsamer; auch bei doppelt so vielen Tickets käme nur ein Vergleich hinzu.

2

Messwerte über einer Schwelle

16 BEAFB II–III

Ein Labor speichert Messwerte (in µg/l) aufsteigend sortiert in einer Reihung a; Werte können mehrfach vorkommen. Für Auswertungen wird der abgebildete Algorithmus ersterAb(a, g) verwendet. Beispiel:

Algorithmus ersterAb
  1. Analysieren Sie den Algorithmus, indem Sie ihn für das Beispiel mit g = 21 in einer Tracetabelle durchlaufen. Geben Sie an, was der Rückgabewert allgemein bedeutet — auch für g = 40. (5 BE)
  2. Begründen Sie, dass der Algorithmus für jede Eingabe endet und höchstens \(\lfloor\log_2 n\rfloor + 1\) Schleifendurchläufe benötigt. (3 BE)
  3. Implementieren Sie eine Methode static int anzahlImBereich(int[] a, int von, int bis), die zurückgibt, wie viele Werte w mit von ≤ w ≤ bis in a stehen. Sie dürfen eine Java-Methode ersterAb als gegeben voraussetzen. Geben Sie das Ergebnis für das Beispiel mit von = 15, bis = 21 an. (4 BE)
  4. Beurteilen Sie, ob anzahlImBereich oder ein einfaches Durchzählen aller Werte besser geeignet ist, wenn eine Messreihe mit \(10^6\) Werten vorliegt und täglich 10 000 Bereichsabfragen gestellt werden. (4 BE)

Hinweise

Hinweis zu Aufgabe a)
Anders als die binäre Suche bricht der Algorithmus bei Gleichheit nicht ab.
Hinweis zu Aufgabe b)
Betrachten Sie die Anzahl \(r - l + 1\) der Elemente im Bereich.
Hinweis zu Aufgabe c)
Alle Werte im Bereich stehen lückenlos hintereinander. Wo beginnt der Block, wo beginnt der erste Wert größer als bis?
Hinweis zu Aufgabe d)
Vergleichen Sie beide Verfahren je Abfrage und hochgerechnet auf einen Tag. Denken Sie auch an die Voraussetzung.

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)
linksrechtsmittea[mitte]a[mitte] ≥ 21erg
09421wahr4
03115falsch4
23215falsch4
33318falsch4

Danach gilt links = 4 > rechts = 3; Rückgabe 4. Der Algorithmus liefert den kleinsten Index mit a[i] ≥ g, also die Position des ersten Werts ab der Schwelle. Gibt es keinen solchen Wert (z. B. g = 40), bleibt erg bei der Länge 10 — die Stelle, an der g einzufügen wäre.

Erwartungshorizont zu Aufgabe b)

In jedem Durchlauf wird entweder rechts auf mitte − 1 oder links auf mitte + 1 gesetzt; die Mitte liegt im Bereich, also verliert er mindestens ein Element und behält höchstens die größere Hälfte \(\lfloor m/2 \rfloor\) von \(m\) Elementen. Die Anzahl sinkt streng, deshalb endet die Schleife. Wie bei der binären Suche sind nach \(\lfloor\log_2 n\rfloor\) Durchläufen höchstens ein Element und nach einem weiteren keines mehr übrig.

Erwartungshorizont zu Aufgabe c)
static int anzahlImBereich(int[] a, int von, int bis) {
    // Werte sind ganzzahlig: "größer als bis" heißt "mindestens bis + 1"
    return ersterAb(a, bis + 1) - ersterAb(a, von);
}

Beispiel: ersterAb(a, 22) = 7 und ersterAb(a, 15) = 1, also 6 Werte (15, 15, 18, 21, 21, 21).

Erwartungshorizont zu Aufgabe d)

Durchzählen: je Abfrage \(10^6\) Vergleiche, am Tag \(10^{10}\). anzahlImBereich: zwei Aufrufe mit je höchstens \(\lfloor\log_2 10^6\rfloor + 1 = 20\) Durchläufen, also etwa 40 je Abfrage und 400 000 am Tag — um den Faktor 25 000 weniger. Voraussetzung ist die Sortierung, die hier gegeben ist; kämen ständig neue Werte hinzu, müsste die Sortierung erhalten werden (einfügen statt anhängen). Fazit: Für viele Abfragen auf einer sortierten Messreihe ist anzahlImBereich klar vorzuziehen; das Durchzählen lohnt nur bei unsortierten Daten und sehr wenigen Abfragen.