本篇基本上是原做的翻譯。轉載請保留本段文字。git
複雜度一般會使用大-O 記號來表示,好比快速排序的平均時間複雜度是 O(nlog(n))O(nlog(n))。雖然我是「理解派」,可是雖然每一個算法/數據結構都理解了,不時仍有可能忘記具體某個算法/數據結構的複雜度(特別是在最好、最壞和平均情形下的複雜度)。所以製做一個速查表是蠻有必要的。算法
動手前先看看是否已經有輪子是一個好習慣,果不其然,我找到了原做。數組
圖例
抽象數據結構的操做複雜度
數據結構 |
時間複雜度 |
空間複雜度 |
|
平均 |
最差 |
最差 |
|
訪問 |
搜索 |
插入 |
刪除 |
訪問 |
搜索 |
插入 |
刪除 |
|
順序表 |
O(1)O(1) |
O(n)O(n) |
O(n)O(n) |
O(n)O(n) |
O(1)O(1) |
O(n)O(n) |
O(n)O(n) |
O(n)O(n) |
O(n)O(n) |
棧 |
O(n)O(n) |
O(n)O(n) |
O(1)O(1) |
O(1)O(1) |
O(n)O(n) |
O(n)O(n) |
O(1)O(1) |
O(1)O(1) |
O(n)O(n) |
單鏈表 |
O(n)O(n) |
O(n)O(n) |
O(1)O(1) |
O(1)O(1) |
O(n)O(n) |
O(n)O(n) |
O(1)O(1) |
O(1)O(1) |
O(n)O(n) |
雙鏈表 |
O(n)O(n) |
O(n)O(n) |
O(1)O(1) |
O(1)O(1) |
O(n)O(n) |
O(n)O(n) |
O(1)O(1) |
O(1)O(1) |
O(n)O(n) |
跳錶 |
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)O(n) |
O(n)O(n) |
O(n)O(n) |
O(n)O(n) |
O(nlog(n))O(nlog(n)) |
散列表 |
- |
O(1)O(1) |
O(1)O(1) |
O(1)O(1) |
- |
O(n)O(n) |
O(n)O(n) |
O(n)O(n) |
O(n)O(n) |
二叉搜索樹 |
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)O(n) |
O(n)O(n) |
O(n)O(n) |
O(n)O(n) |
O(n)O(n) |
笛卡爾樹 |
- |
O(log(n))O(log(n)) |
O(log(n))O(log(n)) |
O(log(n))O(log(n)) |
- |
O(n)O(n) |
O(n)O(n) |
O(n)O(n) |
O(n)O(n) |
B-樹 |
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(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)O(n) |
紅黑樹 |
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(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)O(n) |
伸展樹 |
- |
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(log(n))O(log(n)) |
O(log(n))O(log(n)) |
O(n)O(n) |
AVL 樹 |
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(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)O(n) |
數組排序
算法 |
時間複雜度 |
空間複雜度 |
|
最佳 |
平均 |
最差 |
最差 |
快速排序 |
O(nlog(n))O(nlog(n)) |
O(nlog(n))O(nlog(n)) |
O(n2)O(n2) |
O(log(n))O(log(n)) |
歸併排序 |
O(nlog(n))O(nlog(n)) |
O(nlog(n))O(nlog(n)) |
O(nlog(n))O(nlog(n)) |
O(n)O(n) |
Timsort |
O(n)O(n) |
O(nlog(n))O(nlog(n)) |
O(nlog(n))O(nlog(n)) |
O(n)O(n) |
堆排序 |
O(nlog(n))O(nlog(n)) |
O(nlog(n))O(nlog(n)) |
O(nlog(n))O(nlog(n)) |
O(1)O(1) |
冒泡排序 |
O(n)O(n) |
O(n2)O(n2) |
O(n2)O(n2) |
O(1)O(1) |
插入排序 |
O(n)O(n) |
O(n2)O(n2) |
O(n2)O(n2) |
O(1)O(1) |
選擇排序 |
O(n2)O(n2) |
O(n2)O(n2) |
O(n2)O(n2) |
O(1)O(1) |
希爾排序 |
O(n)O(n) |
O((nlog(n))2)O((nlog(n))2) |
O((nlog(n))2)O((nlog(n))2) |
O(1)O(1) |
桶排序 |
O(n+k)O(n+k) |
O(n+k)O(n+k) |
O(n2)O(n2) |
O(n)O(n) |
基數排序 |
O(nk)O(nk) |
O(nk)O(nk) |
O(nk)O(nk) |
O(n+k)O(n+k) |
圖操做
節點 / 邊界管理 |
存儲 |
增長頂點 |
增長邊界 |
移除頂點 |
移除邊界 |
查詢 |
鄰接表 |
O(|V|+|E|)O(|V|+|E|) |
O(1)O(1) |
O(1)O(1) |
O(|V|+|E|)O(|V|+|E|) |
O(|E|)O(|E|) |
O(|V|)O(|V|) |
鄰接矩陣 |
O(|V|2)O(|V|2) |
O(|V|2)O(|V|2) |
O(1)O(1) |
O(|V|2)O(|V|2) |
O(1)O(1) |
O(1)O(1) |
堆操做
類型 |
時間複雜度 |
|
建堆 |
查找最大值 |
分離最大值 |
提高鍵 |
插入 |
刪除 |
合併 |
(排好序的)鏈表 |
- |
O(1)O(1) |
O(1)O(1) |
O(n)O(n) |
O(n)O(n) |
O(1)O(1) |
O(m+n)O(m+n) |
(未排序的)鏈表 |
- |
O(n)O(n) |
O(n)O(n) |
O(1)O(1) |
O(1)O(1) |
O(1)O(1) |
O(1)O(1) |
二叉堆 |
O(n)O(n) |
O(1)O(1) |
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(m+n)O(m+n) |
二項堆 |
- |
O(1)O(1) |
O(log(n))O(log(n)) |
O(log(n))O(log(n)) |
O(1)O(1) |
O(log(n))O(log(n)) |
O(log(n))O(log(n)) |
斐波那契堆 |
- |
O(1)O(1) |
O(log(n))O(log(n)) |
O(1)O(1) |
O(1)O(1) |
O(log(n))O(log(n)) |
O(1)O(1) |
大-O 複雜度曲線
