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.
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)) # 5050Ruang 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 nAlgoritma 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)) # 55Ruang 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 FalseTemplat 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.
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
- Notasi Big-O dari Asas
- Menganalisis Gelung dan Gelung Bersarang
- Rekursi dan Kaedah Pepohon Rekursi
- Kerumitan Ruang dan Pertukaran