0Pricing
DSA Interview Prep · Lektion

Schleifen und verschachtelte Schleifen analysieren

Berechnen Sie die Zeitkomplexität einzelner und verschachtelter Schleifen sowie von Schleifen mit schrumpfenden Bereichen, etwa bei der binären Suche oder Dreiecksiterationen.

Schleifen und verschachtelte Schleifen analysieren ist eine kostenlose DSA Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des DSA Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der DSA Interview Prep-Kurs umfasst insgesamt 4 Lektionen.

Eine Schleife: O(n)

Die einfachste Schleife führt ihren Rumpf n-mal aus und ist daher O(n). Ein größerer Schritt verändert die Anzahl, aber nicht die Klasse. Beginnen Sie immer damit zu zählen, wie oft der Rumpf ausgeführt wird. Sehen Sie sich den Code an.

# O(n): body runs n times
def count_ops_linear(n):
    ops = 0
    for i in range(n):
        ops += 1     # constant work
    return ops

print(count_ops_linear(100))  # 100

# Still O(n): step=2 halves count but same class
def count_ops_half(n):
    ops = 0
    for i in range(0, n, 2):
        ops += 1
    return ops

print(count_ops_half(100))    # 50  => O(n)

Verschachtelte Schleifen: O(n²) und darüber hinaus

Zwei verschachtelte Schleifen, die jeweils n-mal ausgeführt werden, ergeben n × n = O(n^2); drei ergeben O(n^3). Wenn die innere Schleife jedoch nur eine feste Anzahl von Malen ausgeführt wird, bleibt das Ganze linear.

def count_pairs(n):
    ops = 0
    for i in range(n):          # n iterations
        for j in range(n):      # n iterations each
            ops += 1
    return ops

print(count_pairs(10))   # 100 = 10^2
print(count_pairs(100))  # 10000 = 100^2
# Doubling n quadruples ops: classic O(n^2)

Dreiecksschleife: O(n²/2) = O(n²)

Wenn die innere Schleife bei i+1 beginnt, bilden die Iterationen ein Dreieck: n(n-1)/2, was nach dem Weglassen der Hälfte weiterhin O(n^2) ist. Probleme mit allen eindeutigen Paaren sehen so aus.

def count_unique_pairs(n):
    ops = 0
    for i in range(n):          # n iterations
        for j in range(i+1, n): # n-1, n-2, ..., 0
            ops += 1
    return ops

print(count_unique_pairs(10))  # 45 = 10*9/2
print(count_unique_pairs(100)) # 4950
# Still O(n^2) -- constant factor 1/2 dropped

Schleife mit schrumpfendem Bereich: O(log n)

Wenn die Schleifenvariable in jedem Schritt halbiert wird, erhalten Sie O(log n). Die entscheidende Frage lautet: Schrumpft der Bereich multiplikativ (log n) oder additiv (n)? Sehen Sie sich den Code an.

def count_log_ops(n):
    ops = 0
    i = n
    while i >= 1:
        ops += 1
        i //= 2   # halve each iteration
    return ops

import math
for n in [8, 16, 64, 1024]:
    ops = count_log_ops(n)
    print(f'n={n}, ops={ops}, log2={int(math.log2(n))}')
# ops tracks log2(n) closely

Verschachtelte Schleife mit schrumpfender innerer Schleife: O(n log n)

Eine n-mal ausgeführte äußere Schleife mit einer inneren Schleife von O(log n) ergibt O(n log n) — die Struktur von Merge Sort. Eine innere Schleife mit O(log n) zu erkennen, ist der Schlüssel zur Analyse von Sortierverfahren.

import math

def count_n_log_n(n):
    ops = 0
    for i in range(n):    # n iterations
        j = n
        while j >= 1:     # log n iterations
            ops += 1
            j //= 2
    return ops

for n in [8, 32, 128]:
    ops = count_n_log_n(n)
    predicted = int(n * math.log2(n))
    print(f'n={n}: actual={ops}, n*log2(n)~={predicted}')

Abhängige innere Schleifen

Wenn der Bereich der inneren Schleife vom äußeren Index abhängt, zählen Sie die gesamten Iterationen, nicht die Iterationen pro Schritt. Eine innere Schleife von 0..i ergibt insgesamt n(n-1)/2 = O(n^2). Sehen Sie sich den Code an.

# Inner loop runs i times: total = 0+1+2+...+(n-1) = n(n-1)/2 => O(n^2)
def sum_inner_i(n):
    ops = 0
    for i in range(n):
        for j in range(i):   # runs 0,1,2,...,n-1 times
            ops += 1
    return ops

print(sum_inner_i(10))  # 45 = 10*9/2  => O(n^2)

# Inner loop runs n/i times (i doubles): sum ≈ n*log n => O(n log n)
def sum_inner_n_over_i(n):
    ops = 0
    i = 1
    while i <= n:
        for j in range(n // i):
            ops += 1
        i *= 2
    return ops
print(sum_inner_n_over_i(64))  # ~ 64*6 = 384

Bubble Sort Schritt für Schritt analysieren

Bubble Sort führt n(n-1)/2 Vergleiche aus und ist daher O(n^2). Selbst mit vorzeitigem Abbruch erfordert eine umgekehrt sortierte Eingabe jeden Vergleich. Für große Eingaben ist das zu langsam.

def bubble_sort(arr):
    n = len(arr)
    comparisons = 0
    for i in range(n):
        swapped = False
        for j in range(0, n - i - 1):
            comparisons += 1
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
                swapped = True
        if not swapped:  # early exit if sorted
            break
    return comparisons

arr = list(range(10, 0, -1))  # worst case: reversed
ops = bubble_sort(arr)
print(f'Sorted: {arr}')
print(f'Comparisons: {ops}')  # 45 = 10*9/2

Schleifen über Strings und Teilstrings

Vorsicht: Python-Slicing ist O(k) und nicht kostenlos, und die String-Verkettung mit + in einer Schleife ist O(n^2), weil jedes Mal kopiert wird. Verwenden Sie stattdessen ''.join(parts). Sehen Sie sich den Code an.

# O(n^2): string concat in loop
def build_bad(n):
    s = ''
    for i in range(n):
        s += str(i)  # copies s each time!
    return s

# O(n): join is a single pass
def build_good(n):
    parts = []
    for i in range(n):
        parts.append(str(i))
    return ''.join(parts)

print(build_good(10))  # '0123456789'

Mehrere Eingabeparameter

Bei zwei Eingaben kann die Komplexität beide berücksichtigen: O(m + n) für getrennte Arbeit und O(m × n) für verschachtelte Arbeit. Graphen werden häufig als O(V + E) angegeben. Benennen Sie jede Variable eindeutig.

# O(m + n): two independent loops
def independent(m, n):
    a = sum(range(m))  # O(m)
    b = sum(range(n))  # O(n)
    return a + b       # total O(m + n)

# O(m * n): nested
def nested(m, n):
    count = 0
    for i in range(m):     # O(m)
        for j in range(n): # O(n) each
            count += 1
    return count  # O(m * n)

print(independent(5, 10))  # 10 + 45 = 55
print(nested(5, 10))       # 50

Verschachtelte Schleifen vs. sequenzielle Aufrufe

Ein Funktionsaufruf ist nicht kostenlos — auch seine innere Schleife muss mitgezählt werden. Rufen Sie eine O(n)-Hilfsfunktion n-mal auf, erhalten Sie O(n^2). Schauen Sie bei der Analyse immer in Aufrufe von Black-Box-Funktionen hinein.

# Naive string matching: O(n*m)
def naive_search(text, pattern):
    n, m = len(text), len(pattern)
    matches = []
    for i in range(n - m + 1):  # O(n)
        if text[i:i+m] == pattern:  # O(m) comparison + O(m) slice
            matches.append(i)
    return matches
# Total: O(n*m)

print(naive_search('abcabcabc', 'abc'))  # [0, 3, 6]

Praxis: Komplexität auf einen Blick erkennen

Entwickeln Sie eine Gewohnheit: Zählen Sie die Verschachtelung von Schleifen, prüfen Sie, ob die innere Schleife von der äußeren abhängt, und achten Sie auf versteckte Kosten in Funktionsaufrufen und beim Slicing. Der Code ist ein Rätsel zum Ausprobieren.

# What is the complexity of this function?
def mystery(nums):
    result = []
    for i in range(len(nums)):          # O(n)
        for j in range(i, len(nums)):   # O(n) worst
            if sum(nums[i:j+1]) == 0:   # O(n) slice + sum!
                result.append((i, j))
    return result
# Answer: O(n^3)  -- three nested n-proportional ops
# Outer O(n) x inner O(n) x sum/slice O(n) = O(n^3)

Schnelltest

Schnelltest — sehen Sie, wie gut die Tricks zur Schleifenanalyse hängen geblieben sind. Vertrauen Sie hier auf Ihre Überlegungen. 💪

Zusammenfassung der Lektion

Zusammenfassung: Verschachtelte Schleifen werden multipliziert und unabhängige Schleifen addiert. Eine innere Schleife, die halbiert, ergibt O(n log n), und versteckte Kosten in Aufrufen und beim Slicing müssen ebenfalls mitgezählt werden.

Häufig gestellte Fragen

Ist die Lektion „Schleifen und verschachtelte Schleifen analysieren“ kostenlos?

Ja — der vollständige Text von „Schleifen und verschachtelte Schleifen analysieren“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des DSA Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der DSA Interview Prep-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Schleifen und verschachtelte Schleifen analysieren“?

Berechnen Sie die Zeitkomplexität einzelner und verschachtelter Schleifen sowie von Schleifen mit schrumpfenden Bereichen, etwa bei der binären Suche oder Dreiecksiterationen. Du übst DSA Interview Prep mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um DSA Interview Prep zu starten?

Keine Vorkenntnisse erforderlich. DSA Interview Prep auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „Schleifen und verschachtelte Schleifen analysieren“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser DSA Interview Prep-Lektion Code schreiben und ausführen?

Ja. Jede DSA Interview Prep-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Big-O-Notation von Grund auf
  2. Schleifen und verschachtelte Schleifen analysieren
  3. Rekursion und die Rekursionsbaum-Methode
  4. Platzkomplexität und Abwägungen
← Zurück zu DSA Interview Prep