Alle Tabs der Lerneinheit (Erklärung · Interaktiv · Quiz) als durchgehender Text. Ideal zum Wiederholen vor der Klausur, und für Suchmaschinen wie Google, Bing und KI-Suche (ChatGPT, Perplexity).
Erklärung
Lineare Suche prüft jedes Element der Reihe nach, bis sie das Gesuchte findet oder das Ende des Arrays erreicht. Funktioniert auf jedem Array, sortiert oder unsortiert. Du lernst hier die Komplexität (O(n) Worst Case, O(1) Best Case, im Durchschnitt ∼ n/2 Vergleiche bei erfolgreicher Suche und gleichverteiltem Treffer), die typische Klausur-Falle beim return-Verhalten bei Duplikaten (Standard liefert ersten Treffer, z. B. [4, 2, 4] mit Target 4 → Index 0), die Implementierung in Java und Python, wann lineare Suche besser ist als binäre Suche (unsortierter Input, sehr kleines n, einmalige Suche ohne Sortier-Vorlauf) und die Stop-Bedingung (Worst Case voller Durchlauf wenn nicht gefunden, Best Case Treffer am Anfang).
Was du in der Klausur können musst:
- Idee: vom ersten Element bis zum letzten durchlaufen, jedes mit dem Suchwert vergleichen
- Komplexität: O(n) Worst-Case und Average-Case, O(1) Best-Case (Treffer am Anfang)
- Voraussetzung: keine, funktioniert auf unsortierten Daten
- Anwendung: Standard wenn Daten unsortiert sind oder die Liste klein ist
In Klausuren oft gefragt: wann ist Lineare Suche die richtige Wahl?. Antwort: bei unsortierten Daten oder wenn Sortieren teurer wäre als die einmalige Suche. Bei sortierten Daten und mehrfachen Suchen lohnt sich Binäre Suche stattdessen.
Die Idee
Geh durchs Array, prüf jedes Element ob es das gesuchte ist. Stopp bei Treffer, oder am Ende wenn nichts gefunden.
Das ist genau das, was du auch machst, wenn du eine Telefonnummer in einer unsortierten Liste suchst: von oben nach unten durchgehen.
Inline-Trace für [3, 8, 1, 7, 5]
Target 7 (Treffer an Index 3):
| i | arr[i] | arr[i] == 7? | Aktion |
|---|---|---|---|
| 0 | 3 | nein | weiter |
| 1 | 8 | nein | weiter |
| 2 | 1 | nein | weiter |
| 3 | 7 | ja | return 3 |
Target 99 (nicht im Array, erfolglose Suche):
| i | arr[i] | arr[i] == 99? | Aktion |
|---|---|---|---|
| 0 | 3 | nein | weiter |
| 1 | 8 | nein | weiter |
| 2 | 1 | nein | weiter |
| 3 | 7 | nein | weiter |
| 4 | 5 | nein | Schleife endet |
Nach Schleife: return -1. Bei erfolgreicher Suche stoppt die Schleife sofort beim Treffer, bei erfolgloser Suche müssen alle n Elemente geprüft werden.
Implementierung
public static int linearSearch(int[] arr, int target) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == target) return i;
}
return -1;
}In Java gibst du den Index bei Treffer zurück, sonst -1 für 'nicht gefunden'.
def linear_search(arr, target):
for i, value in enumerate(arr):
if value == target:
return i
return -1Python: enumerate() liefert Index und Wert in einem. Logik identisch zur Java-Variante.
Komplexität
| Fall | Vergleiche |
|---|---|
| Best Case (Element ist erstes) | 1 |
| Average Case (Element gleichverteilt im Array, garantiert vorhanden) | (n+1)/2 ≈ n/2 |
| Worst Case (Element ist letztes oder fehlt) | n |
→ O(n) im Worst und Average Case. Die Average-Formel (n+1)/2 gilt unter der Annahme, dass das Element garantiert im Array vorhanden ist und jede Position gleich wahrscheinlich ist. Bei erfolgreicher Suche mit gleichverteiltem Treffer im Schnitt etwa n/2 Vergleiche. Bei erfolgloser Suche werden alle n Elemente geprüft, also genau n Vergleiche. Bei Trefferwahrscheinlichkeit p < 1 liegt der Erwartungswert irgendwo dazwischen, formal p · (n+1)/2 + (1-p) · n.
Klausur-Trace: lineare Suche Schritt für Schritt
Zwei typische Aufgabenstellungen aus echten Algorithmen-Klausuren:
Beispiel A: Treffer in der Mitte
Array [7, 2, 9, 4, 11] (Indizes 0..4), gesucht Target 9.
| Iter | i | arr[i] | arr[i] == 9? | Vergleiche bisher |
|---|---|---|---|---|
| 1 | 0 | 7 | nein | 1 |
| 2 | 1 | 2 | nein | 2 |
| 3 | 2 | 9 | ja → return 2 | 3 |
Drei Vergleiche, Index 2 zurück. Bei Target an Position k braucht lineare Suche genau k+1 Vergleiche.
Beispiel B: erfolglose Suche (Worst Case)
Gleiches Array, gesucht Target 5.
| Iter | i | arr[i] | arr[i] == 5? | Vergleiche bisher |
|---|---|---|---|---|
| 1 | 0 | 7 | nein | 1 |
| 2 | 1 | 2 | nein | 2 |
| 3 | 2 | 9 | nein | 3 |
| 4 | 3 | 4 | nein | 4 |
| 5 | 4 | 11 | nein | 5 |
Nach Schleifen-Ende: return -1. Fünf Vergleiche, das ist der Worst Case bei n=5. Bei jeder erfolglosen Suche werden alle Elemente angefasst, der Aufwand ist exakt n Vergleiche, anders als bei der binären Suche gibt es keine Abbruchbedingung vor dem Array-Ende, weil ein unsortiertes Array keine Garantien über die Position des Targets liefert. Selbst wenn das Target an der vorletzten Position stehen würde, müsste man die letzte trotzdem prüfen.
Beispiel C: Klausur-Klassiker, erster Treffer bei Duplikaten
Array [4, 2, 4, 7, 4], gesucht Target 4. Standard-Variante liefert Index 0, nicht 2 oder 4. Die Schleife bricht beim ersten Match ab. Wenn die Klausur den letzten Treffer will, brauchst du eine angepasste Schleife (rückwärts iterieren oder Index in einer Variablen merken statt sofort zu returnen).
Eigenschaften
- ✅ Funktioniert auf JEDER Liste, sortiert oder unsortiert
- ✅ Einfach zu implementieren: 3 Zeilen Code
- ✅ Kein Vorbereitungs-Aufwand: kein Sortieren nötig
- ❌ Lineare Skalierung: bei einer Million Einträgen bis zu eine Million Vergleiche
Wann sinnvoll?
- Bei kleinen Arrays: Overhead anderer Verfahren lohnt sich nicht. Die genaue Schwelle ist hardware-abhängig, in der Praxis liegt sie oft bei
n < 10–30(Cache-Lokalität und kleine Konstanten von linearer Suche schlagen den Overhead von binärer Suche). - Bei unsortierten Daten ohne Zusatzindex: Standard-Option ohne vorher zu sortieren. Mit Hash-Tabelle/Map auf den Daten geht's auch schneller.
- Bei einmaligen Suchen: lohnt sich kein Sortier-Aufwand
- Wenn das erste Vorkommen gesucht wird, nicht ein beliebiges
In der Praxis nutzen verschiedene Standard-Bibliotheken lineare Suche für Listen ohne Index, weil dort Random-Access nicht O(1) ist. Beispiele:
- Java:
List.contains(),List.indexOf()auf einerArrayList/LinkedListsind linear. Für primitive Arrays: eigene Schleife oderStream/Arrays.asList. - JavaScript:
Array.prototype.indexOf()undArray.prototype.includes()sind linear. - Python:
x in listundlist.index(x)sind linear. Achtung:x in setundx in dictsind hash-basiert und durchschnittlichO(1), also nicht linear.
Interaktiv
Lineare Suche live
Schau zu, wie der Algorithmus Element für Element durchgeht. Der orange Highlight wandert von links nach rechts, bis er das Target findet (oder das Array zu Ende ist).
Probier folgendes:
- Setz das Target auf einen Wert ganz vorne im Array: wenig Vergleiche
- Setz das Target auf einen Wert ganz hinten im Array: viele Vergleiche
- Setz das Target auf einen Wert außerhalb (z.B. 99): n Vergleiche, nicht gefunden
In dieser Visualisierung liegen kleinere Werte links und größere rechts, das ist nur eine Anzeigewahl. Allgemein hängt die Anzahl Vergleiche bei linearer Suche nur von der Position des Treffers ab, nicht vom Wert selbst.
Interaktive Visualisierung
Vergleicht lineare und binäre Suche mit Schritt-Counter pro Algorithmus.
Faustregel zum Mitnehmen: Lineare Suche ist O(n). Der Aufwand wächst genau proportional zur Eingabe-Größe. Bei 100 Elementen maximal 100 Vergleiche, bei einer Million entsprechend.
Code-Stepper: Lineare Suche Zeile für Zeile
Wir suchen die 7 im Array [3, 8, 1, 7, 5]. Du siehst den Index i wandern und nach jedem Vergleich den Counter vergleiche mitzählen. So wird sichtbar warum der Aufwand vom Index des Treffers abhängt, nicht vom Wert.
Interaktive Visualisierung
Interaktive Komponente: probiere sie im Topic-Player oben aus.
Quiz
Klausurfragen mit Lösungen (6)
- F1.Welche Komplexität hat die lineare Suche im Worst Case?
Antwort: O(n)
Erklärung: Im Worst Case ist das Element ganz hinten oder gar nicht im Array. Dann muss jedes der n Elemente einmal geprüft werden: O(n).
- F2.Welche Voraussetzung hat die lineare Suche?
Antwort: Keine Voraussetzung: funktioniert auf jedem Array
Erklärung: Lineare Suche funktioniert auf jedem Array, sortiert oder nicht. Genau das ist ihr großer Vorteil gegenüber binärer Suche, die ein sortiertes Array verlangt.
- F3.Du hast ein Array mit 1.000.000 Elementen, der gesuchte Wert ist ganz am Ende. Wie viele Vergleiche macht lineare Suche?
Antwort: Etwa 1.000.000
Erklärung: Im Worst Case: alle n Elemente werden einmal geprüft. Bei 1 Million Elementen sind das 1 Million Vergleiche. Genau deshalb skaliert lineare Suche schlecht für große Datenmengen.
- F4.Was passiert bei diesem Code, wenn target NICHT im Array ist?
Antwort: Gibt -1 zurück
Erklärung: Wenn die Schleife durchläuft ohne `return i` zu erreichen, kommt das `return -1` am Ende dran. Das ist die Konvention für 'nicht gefunden'.
- F5.Bei einem Array der Länge 50, wie viele Vergleiche macht lineare Suche im Average Case (Element gleichverteilt im Array, garantiert vorhanden)?
Antwort: 25 (Toleranz ±1)
Erklärung: Exakt `(n+1)/2 = 25,5`, gerundet ca. 25. Heuristik in Klausuren: `n/2 = 25`. Worst Case wäre 50, Best Case 1. Wenn das Element fehlen kann, hängt der Erwartungswert von der Trefferwahrscheinlichkeit ab.
Typ: Zahlen-Eingabe
- F6.Lineare Suche kann auf einem unsortierten Array Werte finden.
Antwort: Wahr
Erklärung: Genau das ist ihr Hauptvorteil: keine Sortierung nötig. Sie prüft jedes Element der Reihe nach. Binäre Suche dagegen braucht zwingend ein sortiertes Array.
Typ: Wahr/Falsch
for (int i = 0; i < arr.length; i++) {
if (arr[i] == target) return i;
}
return -1;