0Pricing
DSA Interview Prep · Ders

Döngüleri ve İç İçe Döngüleri İnceleme

Tekli döngüler, iç içe döngüler ve ikili aramadaki ya da üçgen yinelemelerindeki gibi aralığı küçülen döngüler için zaman karmaşıklığını hesaplayın.

Döngüleri ve İç İçe Döngüleri İnceleme, CoddyKit'te ücretsiz bir DSA Interview Prep dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, DSA Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. DSA Interview Prep kursu toplamda 4 dersten oluşur.

Tek Döngü: O(n)

En basit döngü gövdesini n kez çalıştırır, dolayısıyla O(n) değerindedir. Adımın daha büyük olması sayıyı değiştirir, ancak sınıfı değiştirmez. Her zaman gövdenin kaç kez çalıştığını sayarak başlayın. Kodu inceleyin.

# 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)

İç İçe Döngüler: O(n²) ve Ötesi

Her biri n kez çalışan iki iç içe döngü n x n = O(n^2) verir; üç döngü O(n^3) verir. Ancak iç döngü sabit sayıda çalışıyorsa, bütün yapı doğrusal kalır.

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)

Üçgensel Döngü: O(n²/2) = O(n²)

İç döngü i+1'den başladığında yinelemeler bir üçgen oluşturur: n(n-1)/2. Yarıyı göz ardı ettikten sonra sonuç hâlâ O(n^2) olur. Tüm çiftlerin benzersiz olması gereken problemler bu yapıya benzer.

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

Küçülen Aralık Döngüsü: O(log n)

Döngü değişkeni her adımda yarıya indirildiğinde O(log n) elde edersiniz. Temel soru şudur: Aralık çarpımsal olarak mı küçülüyor (log n), yoksa toplamsal olarak mı daralıyor (n)? Kodu inceleyin.

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

Küçülen İç Döngülü İç İçe Döngü: O(n log n)

n kez çalışan bir dış döngü ile O(log n) değerindeki bir iç döngü birlikte O(n log n) verir; bu, birleştirmeli sıralamanın yapısıdır. O(log n) değerindeki bir iç adımı fark etmek, sıralama algoritmalarını analiz etmenin anahtarıdır.

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}')

Bağımlı İç Döngüler

İç döngünün aralığı dış döngünün indisine bağlı olduğunda, adım başına sayıyı değil toplam yineleme sayısını hesaplayın. 0..i aralığında çalışan bir iç döngünün toplamı n(n-1)/2 = O(n^2) olur. Kodu inceleyin.

# 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

Kabarcık Sıralamasını Adım Adım Analiz Etme

Kabarcık sıralaması n(n-1)/2 karşılaştırma yapar, dolayısıyla O(n^2) değerindedir. Erken çıkış kullanılsa bile, ters sıralanmış bir girdi her karşılaştırmayı gerektirir. Büyük girdiler için fazla yavaştır.

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

Dizeler ve Alt Dizeler Üzerinde Döngüler

Dikkat edin: Python'da dilimleme O(k) değerindedir, ücretsiz değildir; döngü içinde + ile dize birleştirmek ise her seferinde kopyalama yapıldığı için O(n^2) olur. Bunun yerine ''.join(parts) kullanın. Kodu inceleyin.

# 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'

Birden Çok Girdi Parametresi

İki girdi olduğunda karmaşıklık her ikisini de kullanabilir: ayrı işler için O(m + n), iç içe işler için O(m x n). Graflar genellikle O(V + E) olarak ifade edilir. Her değişkene açık bir ad verin.

# 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

İç İçe Döngü ile Sıralı Çağrılar Arasındaki Fark

Bir işlev çağrısı ücretsiz değildir; içindeki döngü de hesaba katılır. O(n) değerindeki bir yardımcıyı n kez çağırırsanız O(n^2) elde edersiniz. Analiz yaparken kara kutu çağrılarının içini her zaman inceleyin.

# 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]

Uygulama: Karmaşıklığı Bir Bakışta Belirleme

Bir alışkanlık geliştirin: döngülerin iç içe olup olmadığını sayın, iç döngünün dış döngüye bağlı olup olmadığını kontrol edin ve işlev çağrıları ile dilimlemenin gizli maliyetlerine dikkat edin. Kod, deneyebileceğiniz bir bulmacadır.

# 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)

Hızlı Kontrol

Hızlı kontrol — döngü analizi yöntemlerinin ne kadar aklınızda kaldığını görün. Burada kendi akıl yürütmenize güvenin. 💪

Ders Özeti

Özet: iç içe döngüler çarpılır, bağımsız döngüler toplanır, yarıya inen bir iç döngü O(n log n) verir ve çağrıların ve dilimlemenin içindeki gizli maliyetler de hesaba katılmalıdır.

Sıkça Sorulan Sorular

“Döngüleri ve İç İçe Döngüleri İnceleme” dersi ücretsiz mi?

Evet — “Döngüleri ve İç İçe Döngüleri İnceleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve DSA Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. DSA Interview Prep kursu toplamda 4 dersten oluşur.

“Döngüleri ve İç İçe Döngüleri İnceleme” dersinde ne öğreneceğim?

Tekli döngüler, iç içe döngüler ve ikili aramadaki ya da üçgen yinelemelerindeki gibi aralığı küçülen döngüler için zaman karmaşıklığını hesaplayın. DSA Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

DSA Interview Prep öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te DSA Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Döngüleri ve İç İçe Döngüleri İnceleme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu DSA Interview Prep dersinde kod yazıp çalıştırabilir miyim?

Evet. Her DSA Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Big-O Gösterimine Sıfırdan Başlama
  2. Döngüleri ve İç İçe Döngüleri İnceleme
  3. Özyineleme ve Özyineleme Ağacı Yöntemi
  4. Alan Karmaşıklığı ve Ödünleşimler
← DSA Interview Prep Sayfasına Dön