[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

總結

vocus|新世代的創作平台

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


vocus|新世代的創作平台

通常:

  • 如果我們 希望節省時間,可能會使用額外的空間(例如快取動態規劃)。
  • 如果我們 希望節省空間,可能會 重複計算,但會花費更多時間。
留言
avatar-img
螃蟹_crab的沙龍
169會員
322內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。 興趣是攝影,踏青,探索未知領域。 人生就是不斷的挑戰及自我認清,希望老了躺在床上不會後悔自己什麼都沒做。
你可能也想看
Thumbnail
這一節談的是向量的定義,以及如何運用向量來建立模擬物體運動時,關於位置和速度間的關係式。
Thumbnail
這一節談的是向量的定義,以及如何運用向量來建立模擬物體運動時,關於位置和速度間的關係式。
Thumbnail
當代名導基里爾.賽勒布倫尼科夫身兼電影、劇場與歌劇導演,其作品流動著強烈的反叛與詩意。在俄烏戰爭爆發後,他持續以創作回應專制體制的壓迫。《傳奇:帕拉贊諾夫的十段殘篇》致敬蘇聯電影大師帕拉贊諾夫。本文作者透過媒介本質的分析,解構賽勒布倫尼科夫如何利用影劇雙棲的特質,在荒謬世道中尋找藝術的「生存之道」。
Thumbnail
當代名導基里爾.賽勒布倫尼科夫身兼電影、劇場與歌劇導演,其作品流動著強烈的反叛與詩意。在俄烏戰爭爆發後,他持續以創作回應專制體制的壓迫。《傳奇:帕拉贊諾夫的十段殘篇》致敬蘇聯電影大師帕拉贊諾夫。本文作者透過媒介本質的分析,解構賽勒布倫尼科夫如何利用影劇雙棲的特質,在荒謬世道中尋找藝術的「生存之道」。
Thumbnail
什麼是時間複雜度? 時間複雜度(Time Complexity)是用來衡量演算法執行時間隨著輸入大小變化的增長速度。通常使用 Big-O 表示法(O 記號)來描述,目的是估算最壞情況下的運行時間。 時間複雜度的計算主要基於以下幾個原則: 忽略常數係數:O(2n) 與 O(n) 視為相同,因為增
Thumbnail
什麼是時間複雜度? 時間複雜度(Time Complexity)是用來衡量演算法執行時間隨著輸入大小變化的增長速度。通常使用 Big-O 表示法(O 記號)來描述,目的是估算最壞情況下的運行時間。 時間複雜度的計算主要基於以下幾個原則: 忽略常數係數:O(2n) 與 O(n) 視為相同,因為增
Thumbnail
見諸參與鄧伯宸口述,鄧湘庭於〈那個大霧的時代〉記述父親回憶,鄧伯宸因故遭受牽連,而案件核心的三人,在鄧伯宸記憶裡:「成立了成大共產黨,他們製作了五星徽章,印刷共產黨宣言——刻鋼板的——他們收集中共空飄的傳單,以及中國共產黨中央委員會有關文化大革命決議文的英文打字稿,另外還有手槍子彈十發。」
Thumbnail
見諸參與鄧伯宸口述,鄧湘庭於〈那個大霧的時代〉記述父親回憶,鄧伯宸因故遭受牽連,而案件核心的三人,在鄧伯宸記憶裡:「成立了成大共產黨,他們製作了五星徽章,印刷共產黨宣言——刻鋼板的——他們收集中共空飄的傳單,以及中國共產黨中央委員會有關文化大革命決議文的英文打字稿,另外還有手槍子彈十發。」
Thumbnail
說明 重點 △定義變數 △文字的定義 △文字與數字的差別 △整數與浮點數 △signed(有號)與unsigned(無號)的區別 △e是什麼符號? 分類 △字元 △字串 △短整數 △整數 △長整數 △超長整數 △單精度浮點數 △雙精度浮點數 △長雙精度浮點數 應用 宣告與輸出 運算符 結論
Thumbnail
說明 重點 △定義變數 △文字的定義 △文字與數字的差別 △整數與浮點數 △signed(有號)與unsigned(無號)的區別 △e是什麼符號? 分類 △字元 △字串 △短整數 △整數 △長整數 △超長整數 △單精度浮點數 △雙精度浮點數 △長雙精度浮點數 應用 宣告與輸出 運算符 結論
Thumbnail
資料型態-變數概念 上面這張圖片傳傳達了三個概念, 常值:可以是數值、浮點數、字串、布林等資料, 變數名稱:這邊也很好理解,就是好記得名稱,這邊使用中文是方便初學者入門, 盒子:代表在Python底層運作的狀況,Python創建變數時,會先在記憶體創建型態物件,這邊是數字型態,所以創建數字物件。
Thumbnail
資料型態-變數概念 上面這張圖片傳傳達了三個概念, 常值:可以是數值、浮點數、字串、布林等資料, 變數名稱:這邊也很好理解,就是好記得名稱,這邊使用中文是方便初學者入門, 盒子:代表在Python底層運作的狀況,Python創建變數時,會先在記憶體創建型態物件,這邊是數字型態,所以創建數字物件。
Thumbnail
數學為我們提供了豐富多彩的素材用以學習程式設計:從讀者已掌握的知識(例如繪製一個抛物線,計算一個函數的導數)到未知的領域(如求一個複雜函數的極值),這期間有驗證的快樂,也有探索的艱辛,在不斷重複這些活動的過程中學會熟練運用這一工具,工具的熟練使用反過來也會幫助我們對特定問題進行更為深入的探討與研究。
Thumbnail
數學為我們提供了豐富多彩的素材用以學習程式設計:從讀者已掌握的知識(例如繪製一個抛物線,計算一個函數的導數)到未知的領域(如求一個複雜函數的極值),這期間有驗證的快樂,也有探索的艱辛,在不斷重複這些活動的過程中學會熟練運用這一工具,工具的熟練使用反過來也會幫助我們對特定問題進行更為深入的探討與研究。
Thumbnail
直觀理解 導數:考慮的是單一變數的函數,描述的是函數在某點的斜率或變化率。 偏導數:考慮的是多變數函數,描述的是函數在某個變數變化時的變化率,其他變數保持不變。  (針對各維度的調整 或者稱變化 你要調多少) 應用 導數:在物理學中應用廣泛,例如描述速度和加速度。 偏導數:在多變量分析、優
Thumbnail
直觀理解 導數:考慮的是單一變數的函數,描述的是函數在某點的斜率或變化率。 偏導數:考慮的是多變數函數,描述的是函數在某個變數變化時的變化率,其他變數保持不變。  (針對各維度的調整 或者稱變化 你要調多少) 應用 導數:在物理學中應用廣泛,例如描述速度和加速度。 偏導數:在多變量分析、優
Thumbnail
5 月,方格創作島正式開島。這是一趟 28 天的創作旅程。活動期間,每週都會有新的任務地圖與陪跑計畫,從最簡單的帳號使用、沙龍建立,到帶著你從一句話、一張照片開始,一步一步找到屬於自己的創作節奏。不需要長篇大論,不需要完美的文筆,只需要帶上你今天的日常,就可以出發。征服創作島,抱回靈感與大獎!
Thumbnail
5 月,方格創作島正式開島。這是一趟 28 天的創作旅程。活動期間,每週都會有新的任務地圖與陪跑計畫,從最簡單的帳號使用、沙龍建立,到帶著你從一句話、一張照片開始,一步一步找到屬於自己的創作節奏。不需要長篇大論,不需要完美的文筆,只需要帶上你今天的日常,就可以出發。征服創作島,抱回靈感與大獎!
Thumbnail
Python是一種廣泛使用的程式語言,它有許多內建的模組可以幫助我們進行各種數學運算,其中一個就是math模組,它提供了許多標準的數學函數,例如三角函數、對數函數、指數函數等,在這篇文章中,我們將介紹如何使用math模組。 導入math模組並計算圓周率的值: # 計算圓周率的值 math模組中
Thumbnail
Python是一種廣泛使用的程式語言,它有許多內建的模組可以幫助我們進行各種數學運算,其中一個就是math模組,它提供了許多標準的數學函數,例如三角函數、對數函數、指數函數等,在這篇文章中,我們將介紹如何使用math模組。 導入math模組並計算圓周率的值: # 計算圓周率的值 math模組中
Thumbnail
介紹邏輯運算的觀念,包含布林值、運算子與運算式的介紹。並說明如何使用 Python 撰寫這些觀念。
Thumbnail
介紹邏輯運算的觀念,包含布林值、運算子與運算式的介紹。並說明如何使用 Python 撰寫這些觀念。
Thumbnail
當時間變少之後,看戲反而變得更加重要——這是在成為母親之後,我第一次誠實地面對這一件事:我沒有那麼多的晚上,可以任性地留給自己了。看戲不再只是「今天有沒有空」,而是牽動整個週末的結構,誰應該照顧孩子,我該在什麼時間回到家,隔天還有沒有精神帶小孩⋯⋯於是,我不得不學會一件以前並不擅長的事:挑選。
Thumbnail
當時間變少之後,看戲反而變得更加重要——這是在成為母親之後,我第一次誠實地面對這一件事:我沒有那麼多的晚上,可以任性地留給自己了。看戲不再只是「今天有沒有空」,而是牽動整個週末的結構,誰應該照顧孩子,我該在什麼時間回到家,隔天還有沒有精神帶小孩⋯⋯於是,我不得不學會一件以前並不擅長的事:挑選。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News