經常使用算法--複雜度速查表

複雜度速查表

本篇基本上是原做的翻譯。轉載請保留本段文字。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 複雜度曲線

俗話說,投資效率是最好的投資。 若是您感受個人文章質量不錯,讀後收穫很大,預計能爲您提升 10% 的工做效率,不妨小額捐助我一下,讓我有動力繼續寫出更多好文章。
相關文章
相關標籤/搜索