Big O-Notation: Der ultimative Interview-Leitfaden

In this article

In technischen Interviews ist die Big O-Notation die wichtigste Sprache, um Ihre Fähigkeit zu bewerten, skalierbaren Code zu schreiben. Es geht nicht nur um Mathematik, sondern darum, Abwägungen zwischen Geschwindigkeit und Speicher zu treffen. Dieser Leitfaden deckt alles ab, was Sie wissen müssen, um souverän in Ihr nächstes Interview zu gehen.


1. Das Kernkonzept: Worst-Case-Analyse

Die Big O-Notation beschreibt die obere Schranke der Wachstumsrate eines Algorithmus. Während wir oft den “Average Case” erwähnen, interessieren sich Interviewer fast immer für das Worst-Case-Szenario.

  • Zeitkomplexität: Wie viele Operationen führt der Algorithmus aus, wenn nn wächst?
  • Speicherkomplexität: Wie viel zusätzlichen Speicher (RAM) verbraucht der Algorithmus im Verhältnis zu nn?

Big O Komplexitätsdiagramm mit O(1), O(log n), O(n), O(n log n), O(n^2) und O(2^n)


2. Gängige Komplexitäten (Rangfolge)

NotationNameGeschwindigkeitPraxisbeispiel
O(1)O(1)KonstantExzellentZugriff auf einen Array-Index oder einen Hash Map-Schlüssel.
O(logn)O(\log n)LogarithmischGroßartigBinäre Suche in einer sortierten Sammlung.
O(n)O(n)LinearGutFinden des maximalen Elements in einer unsortierten Liste.
O(nlogn)O(n \log n)LinearithemischAkzeptabelDie effizientesten Sortieralgorithmen (Merge Sort).
O(n2)O(n^2)QuadratischSchwachVerschachtelte Schleifen (Überprüfung jedes Paares in einer Liste).
O(2n)O(2^n)ExponentiellSchrecklichRekursives Fibonacci oder Generierung einer Potenzmenge.
O(n!)O(n!)FaktoriellKatastrophalLösung des Problems des Handlungsreisenden mittels Brute-Force.

3. Speicherkomplexität: Der stille Killer

Interviewer “warten” oft darauf, dass Sie den Speicherbedarf erwähnen. Wenn Sie die Zeit durch Verwendung einer Hash Map optimieren, tauschen Sie Speicher gegen Zeit.

  • O(1)O(1) Speicher: Sie verwenden nur wenige Variablen, unabhängig von der Eingabegröße.
  • O(n)O(n) Speicher: Sie erstellen ein neues Array oder eine Map der Größe nn.
  • O(logn)O(\log n) Speicher: Häufig bei rekursiven Aufrufen (Tiefe des Call Stacks).

4. Big O berechnen wie ein Profi

Befolgen Sie diese drei Regeln während Ihrer Whiteboard-Session:

Regel 1: Konstanten weglassen

O(n+100)O(n + 100) ist einfach O(n)O(n). O(2n)O(2n) ist einfach O(n)O(n). Konzentrieren Sie sich auf den Trend, nicht auf die exakte Anzahl.

Regel 2: Nicht-dominante Terme weglassen

In O(n2+n)O(n^2 + n) wächst der n2n^2-Term so viel schneller, dass das nn irrelevant wird.

  • O(n2+500n+logn)O(n2)O(n^2 + 500n + \log n) \rightarrow O(n^2)

Regel 3: Verschiedene Eingaben, verschiedene Variablen

Wenn Ihre Funktion zwei verschiedene Listen verarbeitet, gehen Sie nicht davon aus, dass sie die gleiche Größe haben.

  • listA und listB O(a+b)\rightarrow O(a + b) oder O(a×b)O(a \times b), wenn verschachtelt.

5. Datenstrukturen Cheat Sheet

Prägen Sie sich diese für O(1)O(1)- vs. O(n)O(n)-Entscheidungen ein. Vertiefende Informationen und Implementierungen finden Sie in unserem Leitfaden für Datenstrukturen.

DatenstrukturZugriffSucheEinfügenLöschen
ArrayO(1)O(1)O(n)O(n)O(n)O(n)O(n)O(n)
Hash Map / Setn/aO(1)O(1)O(1)O(1)O(1)O(1)
Linked ListO(n)O(n)O(n)O(n)O(1)O(1)O(1)O(1)
Stack / QueueO(n)O(n)O(n)O(n)O(1)O(1)O(1)O(1)
Binary Search TreeO(logn)O(\log n)O(logn)O(\log n)O(logn)O(\log n)O(logn)O(\log n)
Graphn.v.O(V+E)O(V+E)O(1)O(1)O(1)O(1)

6. Die BUD-Methode zur Optimierung

Wenn ein Interviewer fragt: “Können wir es besser machen als O(n2)O(n^2)?”, nutzen Sie BUD:

  1. Bottlenecks (Engpässe): Welcher Teil dauert am längsten? (z. B. ein verstecktes indexOf innerhalb einer Schleife).
  2. Unnecessary Work (Unnötige Arbeit): Verarbeiten Sie Elemente, die Sie nicht benötigen?
  3. Duplicated Work (Doppelte Arbeit): Berechnen Sie Werte mehrfach? (Nutzen Sie Memoization).

7. Praktische Implementierung: Duplikate finden

Suboptimaler Ansatz (O(n²) Zeit, O(1) Speicher)

function hasDuplicates(arr: number[]): boolean {
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] === arr[j]) return true; // Verschachtelte Schleife!
}
}
return false;
}

Optimaler Ansatz (O(n) Zeit, O(n) Speicher)

Wir tauschen Speicher (das Set) gegen eine deutlich schnellere Ausführung.

function hasDuplicatesOptimized(arr: number[]): boolean {
const seen = new Set<number>();
for (const num of arr) {
if (seen.has(num)) return true; // Set-Lookup ist O(1)
seen.add(num);
}
return false;
}

8. Interview-Strategie: Komplexität kommunizieren

Nennen Sie nicht nur das Ergebnis. Erklären Sie das “Warum”:

  1. Nennen Sie die Komplexität sofort, nachdem Sie Ihre Lösung geschrieben haben.
  2. Schlüsseln Sie es auf: “Die äußere Schleife läuft nn-mal, und darin machen wir einen Set-Lookup, der O(1)O(1) ist, was zu einer Gesamtzeit von O(n)O(n) führt.”
  3. Erwähnen Sie den Speicher: “Da wir Elemente in einem Set speichern, beträgt die Speicherkomplexität O(n)O(n) im Worst-Case, wenn alle Elemente eindeutig sind.”
  4. Diskutieren Sie Abwägungen: “Ich habe O(n)O(n) Zeit gegenüber O(n2)O(n^2) gewählt, da wir Eingaben mit hohem Verkehrsaufkommen erwarten. Wäre der Speicher jedoch extrem begrenzt, könnten wir eine vorherige Sortierung in Betracht ziehen (O(nlogn)O(n \log n) Zeit, O(1)O(1) Speicher).“

9. Zusammenfassung

Bei Big O geht es nicht darum, ein Mathe-Genie zu sein; es geht darum, ein Optimierungs-Architekt zu sein. Suchen Sie immer nach Wegen, von O(n2)O(n^2) zu O(nlogn)O(n \log n) oder O(n)O(n) zu gelangen, und seien Sie bereit, die Kosten des Speichers zu erklären, den Sie dafür einsetzen.