Leere Bereiche, Randtreffer und Duplikate unterscheiden
Verständlich erklärt
Unsere binäre Suche benötigt eine aufsteigend sortierte Folge. links = 0 und rechts = len(a)−1 begrenzen den aktiven Bereich einschließlich beider Randpositionen. Solange links ≤ rechts gilt, wird mitte = (links+rechts)//2 berechnet; bei zwei mittleren Positionen wählen wir also die linke. Eine Suchprobe ist hier ein Besuch dieser Mittelposition mit der Entscheidung kleiner, gleich oder größer; sie ist nicht die Anzahl einzelner Python-Vergleichsoperatoren.
Ist a[mitte] das Ziel, wird mitte zurückgegeben. Ist a[mitte] kleiner, folgt links = mitte+1; sonst rechts = mitte−1. Die schon geprüfte Position wird ausgeschlossen, damit sich der Bereich wirklich verkleinert. Bei links > rechts gibt es keinen Treffer und die Funktion liefert −1. Für eine leere Folge ist rechts von Anfang an −1.
Bei Duplikaten garantiert die einfache Variante irgendeinen passenden Index, nicht den ersten; die normalen Implementierungsaufgaben verwenden deshalb ausdrücklich verschiedene Werte. Als Transfer bestimmen wir außerdem die untere Grenze: den ersten Index mit a[i] ≥ ziel oder len(a), falls es keinen gibt. Dafür startet ein gemerkter Kandidat bei len(a). Bei a[mitte] ≥ ziel merken wir mitte und suchen links davon weiter; bei kleinerem Wert rechts davon. Diese Variante behandelt auch Duplikate eindeutig. Halbieren lohnt sich nur bei passender Ordnung; das vorherige Sortieren einer ungeordneten Folge ist zusätzliche Arbeit und kann Positionsbedeutungen verändern.
binäre Suche
sortierte Folge
linke Grenze
rechte Grenze
Mittelindex
Suchprobe
Beispiel
a = [3, 6, 10, 15, 21], ziel = 6
links rechts mitte Wert
0 4 2 10 -> rechts = 1
0 1 0 3 -> links = 1
1 1 1 6 -> Treffer an Index 1
Drei Suchproben, ohne die Liste zu verändern.
Untere Grenze von 8 in derselben Liste: Index 2.
Bei Duplikaten ungeprüft den ersten Trefferindex versprechen
Kurz zusammengefasst
Sortierung erlaubt einen begründeten Ausschluss ganzer Bereiche. Eindeutige Intervallregeln sichern Fortschritt und korrekte Randfälle.
Abi-Bezug
Führe eine Tabelle mit links, rechts, mitte und Mittelwert. Erkläre, warum die ausgeschlossene Hälfte das Ziel nicht enthalten kann.
Jetzt selbst ausprobieren
Prüfe deine Lösung automatisch. Bei Bedarf helfen dir ein Tipp und anschließend die Musterlösung.
BPE 7J21 Punkteleicht
Binärsuche bis zum Treffer
Noch nicht begonnen
Aufgabenstellung
Suche 23 in [2, 5, 8, 12, 17, 23, 31]. Starte mit links=0, rechts=6; verwende inklusive Grenzen und mitte=(links+rechts)//2. Bei kleinerem Mittelwert folgt links=mitte+1, bei größerem rechts=mitte-1. Welcher Trefferindex wird zurückgegeben? Antworte nur mit einer ganzen Zahl.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Die erste Mitte ist Index 3; ihr Wert 12 ist kleiner als 23.
Berechne die zweite Mitte aus den neuen Grenzen 4 und 6, nicht erneut aus 0 und 6.
Lösung anzeigen
Zuerst ist mitte=3 mit Wert 12; der neue Bereich lautet [4,6]. Danach ist mitte=5 mit Wert 23: Trefferindex 5 nach zwei Suchproben.
BPE 7J21 Punkteleicht
Ein leeres Suchintervall erkennen
Noch nicht begonnen
Aufgabenstellung
Suche 7 in [2, 6, 10, 14] mit inklusiven Grenzen links=0, rechts=3 und linker Mitte (links+rechts)//2. Bei kleinerem Mittelwert setze links=mitte+1, sonst bei größerem rechts=mitte-1. Welche Werte haben links,rechts, sobald die erfolglose Suche endet? Antworte mit zwei kommagetrennten Zahlen in dieser Reihenfolge; eckige Klammern sind optional.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Der bereits geprüfte Mittelindex wird bei jedem Schritt ausgeschlossen.
Nach dem Wert 6 wird links zu 2; nach dem Wert 10 wird rechts zu 1.
Lösung anzeigen
mitte=1 liefert 6 < 7, also links=2. mitte=2 liefert 10 > 7, also rechts=1. Nun ist links=2 > rechts=1: Der Bereich ist leer.
BPE 7J22 Punktemittel
Bei gerader Länge die linke Mitte wählen
Noch nicht begonnen
Aufgabenstellung
Suche 1 in [1, 4, 6, 9, 13, 18]. Binärsuche verwendet inklusive Grenzen und mitte=(links+rechts)//2. Bei größerem Mittelwert wird rechts=mitte-1 gesetzt. Gib alle besuchten Mittelindizes bis zum Treffer in ihrer Reihenfolge an, kommagetrennt; eckige Klammern sind optional.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
// ist Ganzzahldivision: (0+5)//2 ergibt 2.
Nach rechts=1 ergibt (0+1)//2 den Index 0, nicht 1.
Lösung anzeigen
Im Bereich [0,5] ist die linke Mitte 2 mit Wert 6. Danach bleibt [0,1]; dessen linke Mitte 0 enthält bereits das Ziel 1. Besuchte Indizes: 2,0.
BPE 7J22 Punktemittel
Binäre Suche mit inklusiven Grenzen
Noch nicht begonnen
Aufgabenstellung
binaer(a, ziel) erhält eine aufsteigend sortierte Liste verschiedener ganzer Zahlen. Gib den Trefferindex zurück, sonst -1. Verwende inklusive Grenzen, die linke Mitte (links+rechts)//2 und schließe die geprüfte Mitte beim Eingrenzen aus. Auch [] ist erlaubt; Eingabe unverändert lassen.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Solange links <= rechts gilt, enthält der Bereich noch mindestens eine Position.
Verwende mitte+1 bzw. mitte−1; ohne den Ausschluss der Mitte kann die Schleife stehen bleiben.
Lösung anzeigen
def binaer(a, ziel):
links = 0
rechts = len(a) - 1
while links <= rechts:
mitte = (links + rechts) // 2
if a[mitte] == ziel:
return mitte
if a[mitte] < ziel:
links = mitte + 1
else:
rechts = mitte - 1
return -1
BPE 7J22 Punktemittel
Binäre Suchproben zählen
Noch nicht begonnen
Aufgabenstellung
binaer_proben(a, ziel) verwendet auf einer aufsteigend sortierten Liste verschiedener ganzer Zahlen inklusive Grenzen und mitte=(links+rechts)//2. Liefere die Anzahl besuchter Mittelpositionen bis zum ersten Treffer oder leeren Bereich. Ein Mittelbesuch zählt genau eine Suchprobe, unabhängig von der Zahl der Vergleichsoperatoren im Code. Eingabe nicht ändern.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Erhöhe proben einmal pro while-Durchlauf, unmittelbar bei der mittleren Probe.
Auch die letzte erfolglose Mittelprobe zählt; ein schon zu Beginn leerer Bereich hat dagegen 0 Proben.
Lösung anzeigen
def binaer_proben(a, ziel):
links, rechts = 0, len(a) - 1
proben = 0
while links <= rechts:
mitte = (links + rechts) // 2
proben += 1
if a[mitte] == ziel:
return proben
if a[mitte] < ziel:
links = mitte + 1
else:
rechts = mitte - 1
return proben
BPE 7J22 Punktemittel
Transfer: die untere Grenze finden
Noch nicht begonnen
Aufgabenstellung
untere_grenze(a, ziel) erhält eine aufsteigend sortierte Zahlenliste, diesmal auch mit Duplikaten. Liefere den ersten Index mit a[i] ≥ ziel; existiert keiner, liefere len(a). Für [] ist das 0. Verwende binäres Eingrenzen und einen Kandidaten, der anfangs len(a) ist. Eingabe unverändert lassen.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Ein passender Mittelwert ist ein Kandidat, aber links davon könnte ein früherer passender Wert stehen.
Bei a[mitte] >= ziel merke mitte und setze rechts = mitte−1; bei kleinerem Wert gehe mit links = mitte+1 nach rechts.
Lösung anzeigen
def untere_grenze(a, ziel):
links, rechts = 0, len(a) - 1
kandidat = len(a)
while links <= rechts:
mitte = (links + rechts) // 2
if a[mitte] >= ziel:
kandidat = mitte
rechts = mitte - 1
else:
links = mitte + 1
return kandidat
BPE 7J23 Punkteanspruchsvoll
Warum Halbieren erlaubt ist
Noch nicht begonnen
Aufgabenstellung
Welche Aussagen über die hier gelehrte aufsteigende binäre Suche sind richtig? Wähle alle richtigen Antworten.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Das Vergleichen der Mitte liefert nur mit bekannter Ordnung Informationen über andere Positionen.
Die Variante „untere Grenze“ sucht nach einem Treffer weiter links; die einfache Binärsuche tut das nicht.
Lösung anzeigen
Die Sortierung begründet den Ausschluss: Links vom zu kleinen Mittelwert können keine größeren Zielwerte liegen. Ohne Ordnung gilt das nicht; die einfache Variante verspricht bei Duplikaten keinen ersten Treffer.
BPE 7J23 Punkteanspruchsvoll
Erfolglose Binärsuche protokollieren
Noch nicht begonnen
Aufgabenstellung
Suche das nicht vorhandene Ziel 15 in der sortierten Liste [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]. Nutze inklusive Grenzen, linke Mitte (links+rechts)//2 und bei kleinerem Mittelwert links=mitte+1. Wie viele Mittelpositionen werden besucht? Antworte nur mit einer ganzen Zahl; ein Besuch ist eine Suchprobe.
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Alle gelesenen Werte sind kleiner als 15, deshalb wandert jedes Mal die linke Grenze nach rechts.
Notiere die Bereiche [0,14], [8,14], [12,14] und [14,14].
Lösung anzeigen
Die besuchten Mittelindizes sind 7, 11, 13 und 14. Danach ist links=15 größer als rechts=14. Das sind vier Suchproben.