Von vorn nach hinten durchsehen
Nach einem Stadtlauf stehen die Startnummern in der Reihenfolge des Zieleinlaufs in der Reihung startnr. Auf welchem Platz ist die Nummer 15 ins Ziel gekommen?
- Suchproblem:gegeben eine Reihung
aund ein Suchwertx— gesucht ist der Index, an demxsteht. - Prinzip:die Elemente der Reihe nach ab Index 0 mit
xvergleichen (auch sequenzielle Suche). - Treffer:sofort abbrechen und den Index zurückgeben — hier 3.
- Kein Treffer:nach dem letzten Element −1 zurückgeben; −1 ist nie ein gültiger Index.
- Doppelte Werte:geliefert wird das erste Vorkommen: die Suche nach 8 ergibt 1, nicht 4.
- Voraussetzung:keine — die Reihung darf unsortiert sein.
static int lineareSuche(int[] a, int x) {
for (int i = 0; i < a.length; i++) {
if (a[i] == x) {
return i; // erster Treffer: Methode endet sofort
}
}
return -1; // alle Elemente geprüft, x nicht dabei
}
Wie viele Vergleiche?
Den Aufwand misst man an der Zahl der Vergleiche a[i] == x. Für eine Reihung der Länge \(n\) gilt:
- Bester Fall:
xsteht an Index 0 — 1 Vergleich. - Ungünstigster Fall:
xsteht ganz hinten oder fehlt — \(n\) Vergleiche. - Treffer an Index i:genau i + 1 Vergleiche.
- Beispiel:in
startnrbraucht die Suche nach 15 vier, nach 8 zwei und nach 50 sechs Vergleiche (Ergebnis −1).
Tippe zuerst: Klicke den Index an, den die Suche liefern wird (oder das Feld −1), und stelle die Zahl der Vergleiche ein. Starte dann die Suche und vergleiche. Spiele alle Runden durch — auch die mit doppelten und fehlenden Werten.
Halte fest: Die lineare Suche liefert den Index des ersten Treffers nach Index + 1 Vergleichen; fehlt der Wert, prüft sie alle \(n\) Elemente und liefert −1.
Lineare Suche: mindestens 1, höchstens \(n\) Vergleiche · Rückgabe: Index des ersten Treffers oder −1
Allgemeine Hinweise
−1 erst nach der Schleife
Ein else { return -1; } in der Schleife beendet die Suche schon nach dem ersten Element. Erst wenn alle Elemente geprüft sind, steht fest, dass x fehlt.
Ergebnis vor dem Zugriff prüfen
Mit int p = lineareSuche(a, x); und if (p != -1) vermeidest du a[-1] — das würde mit ArrayIndexOutOfBoundsException abbrechen.
Texte mit equals vergleichen
Bei einer String-Reihung heißt die Bedingung a[i].equals(x). Das == prüft nur, ob es dasselbe Objekt ist, nicht ob der Text gleich ist.
