0Pricing
Coding Interview Prep · Ders

Alan Karmaşıklığı ve Ödünleşimler

Çağrı yığınları ile yardımcı veri yapıları için ek alanı ölçün; not alma ve yerinde çalışan algoritmalardaki zaman-alan ödünleşimlerini tanıyın.

Alan Karmaşıklığı ve Ödünleşimler, CoddyKit'te ücretsiz bir Coding Interview Prep dersidir. Bu, 4 dersinin 4. 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.

Uzay Karmaşıklığı Neyi Ölçer?

Uzay karmaşıklığı, girdinin dışında kalan ve yardımcı alan olarak adlandırılan ek belleği ölçer. Birkaç değişken O(1), sonuç dizisi veya karma tablosu ise O(n) değerindedir. Kodu inceleyin.

# O(1) auxiliary space
def sum_array(nums):
    total = 0       # one integer variable
    for n in nums:
        total += n  # constant extra space
    return total

# O(n) auxiliary space
def copy_array(nums):
    return list(nums)  # allocates n slots

print(sum_array([1, 2, 3, 4]))  # 10
print(copy_array([1, 2, 3, 4]))  # [1, 2, 3, 4]

Özyinelemede Çağrı Yığını Alanı

Her özyinelemeli çağrı bir yığın çerçevesi ekler; dolayısıyla alanı derinlik belirler. Doğrusal özyineleme O(n), dengeli ağaçta DFS ise O(log n) değerindedir. Yinelemeli bir sürüm bunu daha iyi denetleyebilir.

import sys

def recursive_sum(n):
    if n == 0: return 0
    return n + recursive_sum(n - 1)
# Space: O(n) stack frames

def iterative_sum(n):
    total = 0
    while n > 0:
        total += n
        n -= 1
    return total
# Space: O(1)

print(recursive_sum(100))   # 5050
print(iterative_sum(100))   # 5050

Birleştirmeli Sıralamanın Alanı: O(n)

Birleştirmeli sıralama, geçici dizileri için O(n) ek alan gerektirir. Bu, kararlı bir O(n log n) sıralamanın bedelidir; yığın sıralaması alan kazandırır, ancak kararlı değildir. Kodu inceleyin.

import tracemalloc

tracemalloc.start()

def merge_sort(arr):
    if len(arr) <= 1: return arr
    m = len(arr) // 2
    l = merge_sort(arr[:m])    # new list
    r = merge_sort(arr[m:])    # new list
    out, i, j = [], 0, 0
    while i < len(l) and j < len(r):
        if l[i] <= r[j]: out.append(l[i]); i+=1
        else:             out.append(r[j]); j+=1
    return out + l[i:] + r[j:]

data = list(range(1000, 0, -1))
merge_sort(data)
_, peak = tracemalloc.get_traced_memory()
print(f'Peak memory: {peak} bytes')  # proportional to n

Yerinde Algoritmalar: O(1) Alan

Yerinde bir algoritma, orantılı ek depolama kullanmadan girdiyi doğrudan değiştirir; örneğin bir diziyi iki işaretçiyle tersine çevirir. Böylece alan kullanımı O(1) olur. Kodu inceleyin.

def reverse_inplace(arr):
    l, r = 0, len(arr) - 1
    while l < r:
        arr[l], arr[r] = arr[r], arr[l]  # swap
        l += 1
        r -= 1
    # Space: O(1) -- only two pointer variables

def rotate_right(arr, k):
    '''Rotate array right by k positions in-place.'''
    n = len(arr)
    k %= n
    arr.reverse()          # O(1) space
    arr[:k] = arr[:k][::-1]
    arr[k:]  = arr[k:][::-1]

a = [1, 2, 3, 4, 5]
rotate_right(a, 2)
print(a)  # [4, 5, 1, 2, 3]

Zaman-Alan Değiş Tokuşu: İki Toplam

Zaman-alan değiş tokuşu her yerde karşımıza çıkar. İki toplam, O(1) alanla O(n^2) zaman veya karma tablo kullanarak O(n) alanla O(n) zaman gerektirir. Her ikisini de belirtin ve hangisinin daha önemli olduğunu sorun.

# O(n^2) time, O(1) space
def two_sum_slow(nums, target):
    for i in range(len(nums)):          # O(n)
        for j in range(i+1, len(nums)): # O(n)
            if nums[i] + nums[j] == target:
                return [i, j]
    return []

# O(n) time, O(n) space
def two_sum_fast(nums, target):
    seen = {}                    # O(n) space
    for i, n in enumerate(nums):
        comp = target - n
        if comp in seen:         # O(1) lookup
            return [seen[comp], i]
        seen[n] = i
    return []

print(two_sum_fast([2, 7, 11, 15], 9))  # [0, 1]

Önbellekleme ile Tablo Oluşturmanın Alan Kullanımı

Yukarıdan aşağıya önbellekleme O(n) önbellek ve O(n) yığın maliyeti getirir; aşağıdan yukarıya tablo oluşturma ise yığını kullanmaz. Yalnızca son birkaç satırı tutarak bunu O(1)'e indirebilirsiniz; buna alanı optimize edilmiş DP denir.

# Fibonacci: O(n) space with full table
def fib_table(n):
    dp = [0] * (n + 1)
    dp[1] = 1
    for i in range(2, n + 1):
        dp[i] = dp[i-1] + dp[i-2]
    return dp[n]

# O(1) space: keep only last two values
def fib_optimal(n):
    if n <= 1: return n
    a, b = 0, 1
    for _ in range(2, n + 1):
        a, b = b, a + b
    return b

print(fib_table(10))    # 55
print(fib_optimal(10))  # 55

Karma Tablosu Alanı: O(n)

Karma tablosu, çözümlerdeki yaygın O(n) alan maliyetidir: ziyaret edilenleri izlemek için görülenler kümesi, sayım yapmak için sıklık tablosu kullanılır. Bunu her zaman belirtin; "O(n) zaman, O(n) alan" tam cevaptır.

def contains_duplicate(nums):
    # O(n) time, O(n) space
    seen = set()
    for n in nums:
        if n in seen: return True
        seen.add(n)
    return False

def group_anagrams(words):
    # O(n*m) time, O(n) space  (m = avg word length)
    from collections import defaultdict
    groups = defaultdict(list)
    for w in words:
        groups[tuple(sorted(w))].append(w)
    return list(groups.values())

print(contains_duplicate([1,2,3,1]))  # True
print(group_anagrams(['eat','tea','tan','ate','nat','bat']))

Graf Algoritmaları İçin Alan Analizi

Graflar gerçekten alan kullanır: bir komşuluk listesi O(V + E), BFS'nin ziyaret edilenler kümesi ve kuyruğu O(V), DFS özyinelemesi ise derinlik bakımından O(V) değerindedir. Graf alanını V ve E cinsinden belirtin.

from collections import deque

def bfs(graph, start):
    # Space: O(V) for visited set + O(V) for queue
    visited = set()      # O(V)
    queue = deque([start])  # O(V) max
    order = []
    while queue:
        node = queue.popleft()
        if node in visited: continue
        visited.add(node)
        order.append(node)
        for nb in graph.get(node, []):
            queue.append(nb)
    return order

g = {0:[1,2], 1:[3], 2:[3], 3:[]}
print(bfs(g, 0))  # [0, 1, 2, 3]

Dize ve Dizi Ayırma Tuzakları

Gizli bellek ayırmaları O(n) alan kullanımına yol açabilir: dilimleme yeni bir liste oluşturur ve döngü içinde dizelerde + kullanmak O(n^2) değerindedir. Sıralama yapan sorted() işlevi kopya oluşturur, ancak lst.sort() yerinde çalışır. Kodu inceleyin.

# Hidden allocations:
nums = [1, 2, 3, 4, 5]

# Creates a NEW list -- O(n) space
slice_copy = nums[1:4]  # [2, 3, 4]

# Creates a NEW sorted list -- O(n) space
sorted_copy = sorted(nums)  # nums unchanged

# Sorts IN PLACE -- O(1) extra space
nums.sort()

print(slice_copy)   # [2, 3, 4]
print(sorted_copy)  # [1, 2, 3, 4, 5]
print(nums)         # [1, 2, 3, 4, 5]

Mülakatlarda Alan Değiş Tokuşlarını Tanıma

Alan karmaşıklığınızı en başta belirtin. Mülakatçı daha az alan isterse yaygın seçenekler, önbellek yerine aşağıdan yukarıya DP kullanmak veya karma tablo yerine yerinde sıralama yapmaktır. Kodu inceleyin.

# Problem: find if array has duplicates
# Option 1: O(1) time-per-check, O(n) space
def has_dup_hash(nums):
    return len(nums) != len(set(nums))

# Option 2: O(n log n) time, O(1) extra space
def has_dup_sort(nums):
    nums_copy = sorted(nums)  # O(n) space -- still!
    for i in range(1, len(nums_copy)):
        if nums_copy[i] == nums_copy[i-1]:
            return True
    return False

# Option 3: truly O(1) extra -- sort in-place
def has_dup_inplace(nums):
    nums.sort()               # modifies original
    for i in range(1, len(nums)):
        if nums[i] == nums[i-1]: return True
    return False

Toplam Karmaşıklık İfadesi Şablonu

Her zaman tam ifadeyi verin; zaman ve alanı birlikte belirtin: "O(n) zaman, O(1) ek alan." Varsa değiş tokuşlardan söz edin. Kıdemli adayları diğerlerinden ayıran şey budur.

# Complete complexity example: Merge Intervals
def merge_intervals(intervals):
    # Time: O(n log n) for sort + O(n) for merge = O(n log n)
    # Space: O(n) for output (could be n/2 to n intervals)
    intervals.sort(key=lambda x: x[0])  # O(n log n)
    merged = [intervals[0]]
    for start, end in intervals[1:]:
        if start <= merged[-1][1]:
            merged[-1][1] = max(merged[-1][1], end)
        else:
            merged.append([start, end])
    return merged

print(merge_intervals([[1,3],[2,6],[8,10],[15,18]]))
# [[1,6],[8,10],[15,18]]

Hızlı Kontrol

Hızlı kontrol — alan karmaşıklığı fikirlerinin ne kadar iyi anlaşıldığını görelim. Buna hazırsınız. ✅

Ders Özeti

Özet: yardımcı alan girdiden ayrı olarak sayılır, özyineleme O(derinlik) yığın alanı kullanır ve zaman-alan değiş tokuşu çoğu algoritma tasarımı seçiminin temelini oluşturur.

Sıkça Sorulan Sorular

“Alan Karmaşıklığı ve Ödünleşimler” dersi ücretsiz mi?

Evet — “Alan Karmaşıklığı ve Ödünleşimler” 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.

“Alan Karmaşıklığı ve Ödünleşimler” dersinde ne öğreneceğim?

Çağrı yığınları ile yardımcı veri yapıları için ek alanı ölçün; not alma ve yerinde çalışan algoritmalardaki zaman-alan ödünleşimlerini tanıyı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 4. dersidir.

“Alan Karmaşıklığı ve Ödünleşimler” 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

  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
← Coding Interview Prep Sayfasına Dön