空間複雜度

常見

簡介

空間複雜度(Space Complexity)是指演算法執行時所需的記憶體空間。一般來說,複雜度高的演算法會消耗更多的記憶體空間,反之,複雜度低的演算法則消耗較少的記憶體空間。

不過實際上在任何的競賽獲 APCS 考試中,空間複雜度的重要性通常不如時間複雜度來得高,因為大部分的題目都不會特別太嚴格的限制記憶體空間的使用,不過還是建議在解題時可以稍微了解一下空間複雜度的概念。

計算方式

空間複雜度的計算方式和時間複雜度類似,也是使用 big-O 表示法來表示。不過空間複雜度的計算方式通常比較簡單,只需要計算演算法執行時所需要的額外空間即可。

考慮以下的例子:

cin >> n;

vector<int> a(n); // 宣告一個長度為 n 的陣列

for (int i = 0; i < n; i++) {
    cin >> a[i]; // 讀入 n 個數字
}

這個程式碼的空間複雜度是 O(n)O(n),因為宣告了一個長度為 nn 的陣列,而這個陣列所佔用的空間就是 O(n)O(n)

再來考慮以下的程式碼:

cin >> n;

vector<vector<int>> a(n, vector<int>(n)); // 宣告一個 n x n 的二維陣列

for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        cin >> a[i][j]; // 讀入 n x n 個數字
    }
}

這個程式碼的空間複雜度是 O(n2)O(n^2),因為宣告了一個 n×nn \times n 的二維陣列,而這個陣列所佔用的空間就是 O(n2)O(n^2)

就是這麼的簡單,只要計算演算法執行時所需要的額外空間即可。