Persediaan Temu Duga Pengaturcaraan · Pelajaran

Kerumitan Ruang dan Pertukaran

Ukur ruang tambahan untuk tindanan panggilan dan struktur data tambahan, serta kenali pertukaran masa-ruang dalam memoization dan algoritma dalam tempat.

Pelajaran 4 daripada 413 langkah

Kerumitan Ruang dan Pertukaran ialah pelajaran Persediaan Temu Duga Pengaturcaraan percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Persediaan Temu Duga Pengaturcaraan, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.

Apakah yang Diukur oleh Kerumitan Ruang?

Kerumitan ruang mengukur memori tambahan selain input, yang dipanggil ruang bantuan. Beberapa pemboleh ubah ialah O(1); tatasusunan hasil atau peta cincang ialah O(n). Lihat kod.

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

Ruang Timbunan Panggilan dalam Rekursi

Setiap panggilan rekursif menambah bingkai timbunan, jadi kedalaman menentukan ruang. Rekursi linear ialah O(n); DFS pokok seimbang ialah O(log n). Versi berlelar boleh mengawalnya dengan lebih baik.

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

Ruang Merge Sort: O(n)

Merge sort memerlukan ruang tambahan O(n) untuk tatasusunan sementaranya. Itulah harga bagi pengisihan stabil O(n log n) — heap sort menjimatkan ruang tetapi tidak stabil. Lihat kod.

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

Algoritma Dalam Tempat: Ruang O(1)

Algoritma dalam tempat mengubah input secara terus tanpa storan tambahan berkadar — seperti membalikkan tatasusunan dengan dua penuding. Ini mengekalkan ruang pada O(1). Lihat kod.

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]

Pertukaran Masa-Ruang: Two-Sum

Pertukaran masa-ruang wujud di mana-mana. Two-sum menggunakan masa O(n^2) dengan ruang O(1), atau masa O(n) dengan ruang O(n) melalui peta cincang. Nyatakan kedua-duanya dan tanyakan perkara yang lebih penting.

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

Ruang Memoization berbanding Tabulation

Memoization atas-ke-bawah menggunakan memo O(n) serta timbunan O(n); tabulation bawah-ke-atas tidak menggunakan timbunan. Dengan menyimpan hanya beberapa baris terakhir, ruang boleh dikecilkan kepada O(1) — DP yang dioptimumkan ruang.

# 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

Ruang Peta Cincang: O(n)

Peta cincang ialah kos ruang O(n) yang lazim dalam penyelesaian: set yang telah dilihat untuk menjejaki lawatan, dan peta kekerapan untuk pengiraan. Sentiasa laporkannya — "masa O(n), ruang O(n)" ialah jawapan lengkap.

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

Analisis Ruang untuk Algoritma Graf

Graf memerlukan ruang sebenar: senarai kejiranan ialah O(V + E), set yang telah dilawati serta baris gilir BFS ialah O(V), dan rekursi DFS mempunyai kedalaman O(V). Laporkan ruang graf dalam V dan E.

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]

Perangkap Peruntukan Rentetan dan Tatasusunan

Peruntukan tersembunyi boleh menyelinap masuk dan menggunakan ruang O(n): penghirisan menghasilkan senarai baharu, manakala + pada rentetan dalam gelung ialah O(n^2). sorted() menyalin, tetapi lst.sort() kekal dalam tempat. Lihat kod.

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

Mengenal Pasti Pertukaran Ruang dalam Temu Duga

Nyatakan kerumitan ruang anda dari awal. Jika penemuduga mahukan penggunaan ruang yang lebih rendah, pilihan lazim ialah DP bawah-ke-atas berbanding memo, atau pengisihan dalam tempat berbanding peta cincang. Lihat kod.

# 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

Templat Pernyataan Kerumitan Keseluruhan

Sentiasa berikan pernyataan yang lengkap — masa dan ruang: "masa O(n), ruang tambahan O(1)." Nyatakan pertukaran apabila wujud. Itulah yang membezakan calon berpengalaman.

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

Semakan Pantas

Semakan pantas — mari lihat sejauh mana idea kerumitan ruang telah anda fahami. Anda sudah bersedia untuk ini. ✅

Ulang Kaji Pelajaran

Ulang kaji: ruang bantuan dikira secara berasingan daripada input, rekursi menggunakan ruang timbunan O(kedalaman), dan pertukaran masa-ruang mendorong kebanyakan pilihan reka bentuk algoritma.

Percuma untuk bermula

Pelajari Persediaan Temu Duga Pengaturcaraan dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
90
Pelajaran
360

Soalan Lazim

Adakah pelajaran “Kerumitan Ruang dan Pertukaran” percuma?

Ya — teks penuh “Kerumitan Ruang dan Pertukaran” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Persediaan Temu Duga Pengaturcaraan, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Kerumitan Ruang dan Pertukaran”?

Ukur ruang tambahan untuk tindanan panggilan dan struktur data tambahan, serta kenali pertukaran masa-ruang dalam memoization dan algoritma dalam tempat. Anda berlatih Persediaan Temu Duga Pengaturcaraan menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Persediaan Temu Duga Pengaturcaraan?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga Pengaturcaraan di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Kerumitan Ruang dan Pertukaran” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Persediaan Temu Duga Pengaturcaraan ini?

Ya. Setiap pelajaran Persediaan Temu Duga Pengaturcaraan menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Notasi Big-O dari Asas
  2. Menganalisis Gelung dan Gelung Bersarang
  3. Rekursi dan Kaedah Pepohon Rekursi
  4. Kerumitan Ruang dan Pertukaran
← Kembali ke Persediaan Temu Duga Pengaturcaraan