每個程式設計師都應該收藏的演算法複雜度速查表
演算法複雜度這件事
這篇文章覆蓋了電腦科學裡面常見演算法的時間和空間的大 O(Big-O)複雜度。我之前在參加面試前,經常需要花費很多時間從網際網路上查詢各種搜尋和排序演算法的優劣,以便我在面試時不會被問住。最近這幾年,我面試了幾家矽谷的初創企業和一些更大一些的公司,如 Yahoo、eBay、LinkedIn 和 Google,每次我都需要準備這個,我就在問自己,“為什麼沒有人建立一個漂亮的大 O 速查表呢?”所以,為了節省大家的時間,我就建立了這個,希望你喜歡!
— Eric
圖例
絕佳 | 不錯 | 一般 | 不佳 | 糟糕 |
資料結構操作
資料結構 | 時間複雜度 | 空間複雜度 | |||||||
---|---|---|---|---|---|---|---|---|---|
平均 | 最差 | 最差 | |||||||
訪問 | 搜尋 | 插入 | 刪除 | 訪問 | 搜尋 | 插入 | 刪除 | ||
Array | O(1) | O(n) | O(n) | O(n) | O(1) | O(n) | O(n) | O(n) | O(n) |
Stack | O(n) | O(n) | O(1) | O(1) | O(n) | O(n) | O(1) | O(1) | O(n) |
Singly-Linked List | O(n) | O(n) | O(1) | O(1) | O(n) | O(n) | O(1) | O(1) | O(n) |
Doubly-Linked List | O(n) | O(n) | O(1) | O(1) | O(n) | O(n) | O(1) | O(1) | O(n) |
Skip List | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(n) | O(n) | O(n) | O(n) | O(n log(n)) |
Hash Table | - | O(1) | O(1) | O(1) | - | O(n) | O(n) | O(n) | O(n) |
Binary Search Tree | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(n) | O(n) | O(n) | O(n) | O(n) |
Cartesian Tree | - | O(log(n)) | O(log(n)) | O(log(n)) | - | O(n) | O(n) | O(n) | O(n) |
B-Tree | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(n) |
Red-Black Tree | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(n) |
Splay Tree | - | O(log(n)) | O(log(n)) | O(log(n)) | - | O(log(n)) | O(log(n)) | O(log(n)) | O(n) |
AVL Tree | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(n) |
陣列排序演算法
演算法 | 時間複雜度 | 空間複雜度 | ||
---|---|---|---|---|
最佳 | 平均 | 最差 | 最差 | |
Quicksort | O(n log(n)) | O(n log(n)) | O(n^2) | O(log(n)) |
Mergesort | O(n log(n)) | O(n log(n)) | O(n log(n)) | O(n) |
Timsort | O(n) | O(n log(n)) | O(n log(n)) | O(n) |
Heapsort | O(n log(n)) | O(n log(n)) | O(n log(n)) | O(1) |
Bubble Sort | O(n) | O(n^2) | O(n^2) | O(1) |
Insertion Sort | O(n) | O(n^2) | O(n^2) | O(1) |
Selection Sort | O(n^2) | O(n^2) | O(n^2) | O(1) |
Shell Sort | O(n) | O((nlog(n))^2) | O((nlog(n))^2) | O(1) |
Bucket Sort | O(n+k) | O(n+k) | O(n^2) | O(n) |
Radix Sort | O(nk) | O(nk) | O(nk) | O(n+k) |
圖操作
節點 / 邊界管理 | 儲存 | 增加頂點 | 增加邊界 | 移除頂點 | 移除邊界 | 查詢 |
---|---|---|---|---|---|---|
Adjacency list | O(|V|+|E|) | O(1) | O(1) | O(|V| + |E|) | O(|E|) | O(|V|) |
Incidence list | O(|V|+|E|) | O(1) | O(1) | O(|E|) | O(|E|) | O(|E|) |
Adjacency matrix | O(|V|^2) | O(|V|^2) | O(1) | O(|V|^2) | O(1) | O(1) |
Incidence matrix | O(|V| ⋅ |E|) | O(|V| ⋅ |E|) | O(|V| ⋅ |E|) | O(|V| ⋅ |E|) | O(|V| ⋅ |E|) | O(|E|) |
堆操作
型別 | 時間複雜度 | ||||||
---|---|---|---|---|---|---|---|
Heapify | 查詢最大值 | 分離最大值 | 提升鍵 | 插入 | 刪除 | 合併 | |
Linked List (sorted) | - | O(1) | O(1) | O(n) | O(n) | O(1) | O(m+n) |
Linked List (unsorted) | - | O(n) | O(n) | O(1) | O(1) | O(1) | O(1) |
Binary Heap | O(n) | O(1) | O(log(n)) | O(log(n)) | O(log(n)) | O(log(n)) | O(m+n) |
Binomial Heap | - | O(1) | O(log(n)) | O(log(n)) | O(1) | O(log(n)) | O(log(n)) |
Fibonacci Heap | - | O(1) | O(log(n)) | O(1) | O(1) | O(log(n)) | O(1) |
大 O 複雜度圖表
推薦閱讀
- Cracking the Coding Interview: 150 Programming Questions and Solutions
- Introduction to Algorithms, 3rd Edition
- Data Structures and Algorithms in Java (2nd Edition)
- High Performance JavaScript (Build Faster Web Application Interfaces)
貢獻者
- Eric Rowell, creator of Concrete.js, an HTML5 Canvas Framework
- Quentin Pleple
- Michael Abed
- Nick Dizazzo
- Adam Forsyth
- David Dorfman
- Jay Engineer
- Jennifer Hamon
- Josh Davis
- Nodir Turakulov
- Bart Massey
- Vinnie Magro
- Miguel Amigot
- Drew Bailey
- Aneel Nazareth
- Rahul Chowdhury
- Robert Burke
- steven41292
- Brandon Amos
- Mike Davis
- Casper Van Gheluwe
- Joel Friedly
- Oleg
- Renfred Harper
- Piper Chester
- Eric Lefevre-Ardant
- Jonathan McElroy
- Si Pham
- mcverry
- Max Hoffmann
- Alejandro Ramirez
- Damon Davison
- Alvin Wan
- Alan Briolat
- Drew Hannay
- Andrew Rasmussen
- Dennis Tsang
- Bahador Saket
相關文章
- 每個程式設計師都應該學會分解複雜的方法程式設計師
- 每個程式設計師都應該讀的書程式設計師
- 每個程式設計師都應該成為架構師程式設計師架構
- 每個程式設計師都應該讀《Unix程式設計藝術》程式設計師
- 每個程式設計師都應該知道的 15 個最佳 PHP 庫程式設計師PHP
- 每個程式設計師都應該知道的基礎數論程式設計師
- 國外程式設計師推薦:每個程式設計師都應該讀的非程式設計書程式設計師
- Rework:每個程式設計師都應該讀的一本書程式設計師
- 每個程式設計師都應該瞭解的硬體知識程式設計師
- 每個程式設計師都應該參加一次 GDD程式設計師
- 每個程式設計師都應該知道的下一個程式語言——Kotlin程式設計師Kotlin
- 每個程式設計師都應該瞭解的記憶體知識程式設計師記憶體
- 每個程式設計師都應該學習使用Python或Ruby程式設計師Python
- 每個程式設計師都該閱讀的10本書程式設計師
- 每個程式設計師都該知道的編碼準則程式設計師
- 每個黑帶大師都應該知道的10件事(建議收藏)
- 每個程式設計師應該知道的12個API程式設計師API
- 每個Python新手都應該知道的程式設計技巧Python程式設計
- 每個程式設計師都應該瞭解的一件事程式設計師
- 每個程式設計師應該知道12件事程式設計師
- 為什麼每個程式設計師都應該懂點前端知識?程式設計師前端
- 每個程式設計師都應該經歷一次軟考薦程式設計師
- 每個程式設計師都該知道的五大定律程式設計師
- 國外程式設計師推薦:每個程式設計師都應讀的書程式設計師
- 每個程式設計師都應該瞭解的“虛擬記憶體”知識程式設計師記憶體
- 為什麼說每個程式設計師都應該有臺Mac電腦程式設計師Mac
- 每個程式設計師都該知道的10大編碼原則程式設計師
- 每個人都應該學習程式設計嗎?程式設計
- 書單推薦:每個程式設計師的程式設計之路上都應該看這11本書程式設計師
- 程式設計師都應該知道的福利程式設計師
- 每個Android程式設計師應該知道的KotlinAndroid程式設計師Kotlin
- 討厭演算法的程式設計師 4 - 時間複雜度演算法程式設計師時間複雜度
- 為SSD程式設計(6):總結—每個程式設計師都應該瞭解的固態硬碟知識程式設計師硬碟
- 為什麼每個程式設計師都應該學習程式碼編譯器知識程式設計師編譯
- StackOverflow程式設計師推薦:每個程式設計師都應讀的30本書(轉載)程式設計師
- 每個程式設計師都必須遵守的程式設計原則程式設計師
- 每一個程式設計師都應當瞭解的11句話程式設計師
- 關於時間,每個程式設計師都應瞭解的事程式設計師