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 Coding 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, Coding Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Coding 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 droppedKüçü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) closelyKüçü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 = 384Kabarcı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/2Dizeler 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 Coding Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Coding 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. Coding 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.
Coding Interview Prep öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Coding 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 Coding Interview Prep dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Coding 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
- Big-O Gösterimine Sıfırdan Başlama
- Döngüleri ve İç İçe Döngüleri İnceleme
- Özyineleme ve Özyineleme Ağacı Yöntemi
- Alan Karmaşıklığı ve Ödünleşimler