[Python]空間複雜度(Space Complexity)

更新於 發佈於 閱讀時間約 5 分鐘

讓我們從 空間複雜度(Space Complexity) 的基本概念開始,並搭配 Python 程式 來幫助理解。


1️⃣ 什麼是空間複雜度?

空間複雜度指的是 演算法在運行時所需的記憶體量,通常用 大O符號(Big-O notation) 來表示,例如:

  • O(1) → 只使用固定的額外空間(常數空間)
  • O(n) → 需要與輸入大小成正比的空間
  • O(n²) → 需要平方級別的空間

2️⃣ Python 範例:不同空間複雜度的程式

我們用 Python 來示範 不同的空間複雜度,從 O(1) 到 O(n)

(1) O(1) 空間複雜度:只使用固定變數

def sum_two_numbers(a, b):
result = a + b # 只使用了一個變數 (result),所以是 O(1)
return result

print(sum_two_numbers(5, 10))

分析:不管 ab 的值多大,程式只使用一個變數 result,所以空間複雜度是 O(1)


(2) O(n) 空間複雜度:建立一個新列表

def create_list(n):
lst = [] # 需要額外的空間來存儲 n 個元素
for i in range(n):
lst.append(i)
return lst

print(create_list(5)) # [0, 1, 2, 3, 4]

分析

這個函式建立了一個長度為 n 的列表 lst,需要額外的記憶體來存放 n 個數字,所以空間複雜度是 O(n)


(3) O(n²) 空間複雜度:建立一個 2D 矩陣

def create_matrix(n):
matrix = [[0] * n for _ in range(n)] # 創建一個 n×n 的二維陣列
return matrix

print(create_matrix(3))

分析

這裡建立了一個 n x n 的矩陣(2D 陣列),總共需要 個空間,因此空間複雜度是 O(n²)


3️⃣ 空間優化技巧

當你寫程式時,如何降低空間複雜度呢?這裡有幾種技巧:

1. 原地修改(In-place Modification)

  • 避免創建新變數,直接修改原始輸入資料
  • 範例:反轉列表(O(n) → O(1))
    def reverse_list_inplace(lst):
    left, right = 0, len(lst) - 1
    while left < right:
    lst[left], lst[right] = lst[right], lst[left] # 交換元素
    left += 1
    right -= 1
    return lst

    print(reverse_list_inplace([1, 2, 3, 4, 5])) # [5, 4, 3, 2, 1]

2. 使用迭代代替遞歸

  • 遞歸通常會佔用大量的函式呼叫堆疊(stack),導致 O(n) 或 O(n²) 空間
  • 範例:費波那契數列(遞歸 → 迭代,降低空間)
    def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
    a, b = b, a + b # 只使用兩個變數 (O(1))
    return a

    print(fibonacci(10)) # 55

總結

raw-image

時間複雜度(Time Complexity)空間複雜度(Space Complexity) 是兩個非常相關的概念,因為演算法在執行時,通常需要在「時間」和「空間」之間做取捨(trade-off)。


raw-image

通常:

  • 如果我們 希望節省時間,可能會使用額外的空間(例如快取動態規劃)。
  • 如果我們 希望節省空間,可能會 重複計算,但會花費更多時間。
avatar-img
134會員
222內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
什麼是時間複雜度? 時間複雜度(Time Complexity)是用來衡量演算法執行時間隨著輸入大小變化的增長速度。通常使用 Big-O 表示法(O 記號)來描述,目的是估算最壞情況下的運行時間。 時間複雜度的計算主要基於以下幾個原則: 忽略常數係數:O(2n) 與 O(n) 視為相同,因為增
什麼是時間複雜度? 時間複雜度(Time Complexity)是用來衡量演算法執行時間隨著輸入大小變化的增長速度。通常使用 Big-O 表示法(O 記號)來描述,目的是估算最壞情況下的運行時間。 時間複雜度的計算主要基於以下幾個原則: 忽略常數係數:O(2n) 與 O(n) 視為相同,因為增
你可能也想看
Google News 追蹤
提問的內容越是清晰,強者、聰明人越能在短時間內做判斷、給出精準的建議,他們會對你產生「好印象」,認定你是「積極」的人,有機會、好人脈會不自覺地想引薦給你
ITS python認證內容含蓋六大主題
Thumbnail
本文介紹了各種運算符的用法和優先級,包括算術運算符、比較運算符、賦值運算符、邏輯運算符、位元運算符、成員運算符和身份運算符。每種運算符都有詳細的描述和示例程式碼,幫助理解其功能和用法。
Thumbnail
本文詳細介紹了Python中的各種資料型別,包括整數、字串、清單、元組、集合和字典,並提供了相關的操作範例。此外,還解釋了如何在Python中定義和操作變數,包括如何同時對多個變數進行賦值。
Thumbnail
Python語法包括條件語句、迴圈、函數和變數的使用。條件語句如if、elif和else用於進行條件判斷,for和while是兩種主要的迴圈,def用於定義函數。變數可以被賦予數字或字符串,並可使用類型提示來指定變數的類型。註解可以是單行或多行,並可用於解釋函數或類的用途和作用。
※ 認識變數: 變數(variable)是在程式裡面把東西存起來的概念。 基於不讓電腦每次都需要重新運算,把需要花時間運算的東西先存起來,之後再直接拿出來使用,所以我們需要變數。 變數儲存的位置在電腦裡的記憶體。變數就像是一個箱子,記憶體就像是一個倉庫。箱子的名稱就是變數名稱,箱子的內容物就是
Thumbnail
在程式中,了解資料型態是相當重要的。 為什麽? 因為許多error,常常都是因為資料型態不正確所導致的。 舉個例子,在python中: a = 1 + 2 print(a) 結果就是3 a = = "1"+"2" print(a) 結果就是12 是不是差很多? 所以今天我來介
Thumbnail
解決電腦上遇到的問題、證明正確性、探討效率 並且很著重溝通,說服別人你做的事是正確且有效率的。 內容: 計算模型、資料結構介紹、演算法介紹、時間複雜度介紹。
Thumbnail
宣告變數 變數是程式中用來儲存和表示數據的標識符號​,並將變數存放在某個記憶體位子 可以用ID的方法查找變數存在哪個記憶體,此方法有利於以後查找問題用。 在大多數程式語言中,變數需要事先聲明(宣告)並賦值。 而Python是一種動態類型語言,不需要顯式宣告變數類型,而是在賦值時自動進行推斷。
提問的內容越是清晰,強者、聰明人越能在短時間內做判斷、給出精準的建議,他們會對你產生「好印象」,認定你是「積極」的人,有機會、好人脈會不自覺地想引薦給你
ITS python認證內容含蓋六大主題
Thumbnail
本文介紹了各種運算符的用法和優先級,包括算術運算符、比較運算符、賦值運算符、邏輯運算符、位元運算符、成員運算符和身份運算符。每種運算符都有詳細的描述和示例程式碼,幫助理解其功能和用法。
Thumbnail
本文詳細介紹了Python中的各種資料型別,包括整數、字串、清單、元組、集合和字典,並提供了相關的操作範例。此外,還解釋了如何在Python中定義和操作變數,包括如何同時對多個變數進行賦值。
Thumbnail
Python語法包括條件語句、迴圈、函數和變數的使用。條件語句如if、elif和else用於進行條件判斷,for和while是兩種主要的迴圈,def用於定義函數。變數可以被賦予數字或字符串,並可使用類型提示來指定變數的類型。註解可以是單行或多行,並可用於解釋函數或類的用途和作用。
※ 認識變數: 變數(variable)是在程式裡面把東西存起來的概念。 基於不讓電腦每次都需要重新運算,把需要花時間運算的東西先存起來,之後再直接拿出來使用,所以我們需要變數。 變數儲存的位置在電腦裡的記憶體。變數就像是一個箱子,記憶體就像是一個倉庫。箱子的名稱就是變數名稱,箱子的內容物就是
Thumbnail
在程式中,了解資料型態是相當重要的。 為什麽? 因為許多error,常常都是因為資料型態不正確所導致的。 舉個例子,在python中: a = 1 + 2 print(a) 結果就是3 a = = "1"+"2" print(a) 結果就是12 是不是差很多? 所以今天我來介
Thumbnail
解決電腦上遇到的問題、證明正確性、探討效率 並且很著重溝通,說服別人你做的事是正確且有效率的。 內容: 計算模型、資料結構介紹、演算法介紹、時間複雜度介紹。
Thumbnail
宣告變數 變數是程式中用來儲存和表示數據的標識符號​,並將變數存放在某個記憶體位子 可以用ID的方法查找變數存在哪個記憶體,此方法有利於以後查找問題用。 在大多數程式語言中,變數需要事先聲明(宣告)並賦值。 而Python是一種動態類型語言,不需要顯式宣告變數類型,而是在賦值時自動進行推斷。