【LeetCode】刷題前的準備-深入淺出時間與空間複雜度
為什麼要學時間與空間複雜度?
在寫程式時,除了讓程式正確運作,還要考慮執行速度和記憶體使用量。
這就是時間複雜度(Time Complexity
和 空間複雜度(Space Complexity)
的概念。
時間複雜度
的意義
當資料量很小時,任何演算法看起來都可能表現得很好。
但當輸入 n 變大(例如上百萬筆數據)時,使用到不好的演算法會非常慢很沒有效率。範例:
搜尋一個數字
暴力搜尋(O(n)):每次都從頭找,資料量大時超慢。
二分搜尋(O(log n)):資料有排序時,搜尋超快。空間複雜度
的意義
有些演算法為了快,會多開陣列來存資料(佔空間)。
有些則是盡量用少量記憶體,但可能會比較慢。範例:
開一個新陣列來存排序結果(O(n) 空間)
直接在原陣列排序,不開新陣列(O(1) 空間)
時間 vs. 空間的權衡
有些演算法速度快,但需要更多記憶體,有些則相反。
例如:
- 用 Hash Table(字典)加速搜尋,會用更多記憶體
- 不用陣列、直接在原資料上排序(In-Place Sorting),會比較慢,但省記憶體
- 遞迴函式可能很慢,還會佔用大量記憶體堆疊
什麼是時間複雜度(Time Complexity)
時間複雜度:
即演算法的執行時間如何隨輸入大小變化,通常用 Big O notation 來表示。
常見的時間複雜度
時間複雜度 | 名稱 | 範例 |
---|---|---|
O(1) | 常數時間 | 直接存取 arr[0] |
O(log n) | 對數時間 | 二分搜尋 |
O(n) | 線性時間 | 遍歷陣列 |
O(n log n) | 準線性時間 | 快速排序 |
O(n²) | 平方時間 | 巢狀迴圈 |
O(2ⁿ) | 指數時間 | 遞迴解費氏數列 |
O(n!) | 階乘時間 | 排列組合問題 |
什麼是空間複雜度(Space Complexity)
空間複雜度
即演算法運行時需要的額外記憶體。
常見空間複雜度
符號 | 名稱 | 例子 |
---|---|---|
O(1) | 常數空間 | 只用幾個變數 |
O(n) | 線性空間 | 用一個陣列來存結果 |
O(n²) | 平方空間 | 二維矩陣 |
Big O notation
Big O :
用來描述演算法執行時間或記憶體使用量隨輸入大小(n)變化,評價演算法好壞的一種基準。
- 只看最壞情況
- 忽略常數與低階項
Big O 評價:
O(1)最好 O(n!)最差,如下方圖片所示:
總結
時間複雜度(Time Complexity) 決定程式跑多快
空間複雜度(Space Complexity) 決定程式吃多少記憶體
時間複雜度好的情況,可能會比較佔空間
空間複雜度好的情況,可能會比較慢
本部落格所有文章除特別聲明外,均採用CC BY-NC-SA 4.0 授權協議。轉載請註明來源 QuL's Technical Blog!