1. 程式人生 > >每個程式設計師都應該收藏的演算法複雜度速查表

每個程式設計師都應該收藏的演算法複雜度速查表

這篇文章覆蓋了計算機科學裡面常見演算法的時間和空間的大複雜度。我之前在參加面試前,經常需要花費很多時間從網際網路上查詢各種搜尋和排序演算法的優劣,以便我在面試時不會被問住。最近這幾年,我面試了幾家矽谷的初創企業和一些更大一些的公司,如 Yahoo、eBay、LinkedIn 和 Google,每次我都需要準備這個,我就在問自己,“為什麼沒有人建立一個漂亮的大 O 速查表呢?”所以,為了節省大家的時間,我就建立了這個,希望你喜歡!

圖例

絕佳 不錯 一般 不佳 糟糕

資料結構操作

資料結構 時間複雜度 空間複雜度
平均 最差 最差
訪問 搜尋 插入 刪除 訪問 搜尋 插入 刪除
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)
O(n) O(n) O(1) O(1) O(n) O(n) O(1) O(1) O(n)
O(n) O(n) O(1) O(1) O(n) O(n) O(1) O(1) O(n)
O(log(n)) O(log(n)) O(log(n)) O(log(n)) O(n) O(n) O(n) O(n) O(n log(n))
O(1) O(1) O(1) O(n) O(n) O(n) O(n)
O(log(n)) O(log(n)) O(log(n)) O(log(n)) O(n) O(n) O(n) O(n) O(n)
O(log(n)) O(log(n)) O(log(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(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(log(n)) O(log(n)) O(log(n)) O(log(n)) O(log(n)) O(log(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 log(n)) O(n log(n)) O(n^2) O(log(n))
O(n log(n)) O(n log(n)) O(n log(n)) O(n)
O(n) O(n log(n)) O(n log(n)) O(n)
O(n log(n)) O(n log(n)) O(n log(n)) O(1)
O(n) O(n^2) O(n^2) O(1)
O(n) O(n^2) O(n^2) O(1)
O(n^2) O(n^2) O(n^2) O(1)
O(n) O((nlog(n))^2) O((nlog(n))^2) O(1)
O(n+k) O(n+k) O(n^2) O(n)
O(nk) O(nk) O(nk) O(n+k)

圖操作

節點 / 邊界管理 儲存 增加頂點 增加邊界 移除頂點 移除邊界 查詢
O(|V|+|E|) O(1) O(1) O(|V| + |E|) O(|E|) O(|V|)
O(|V|+|E|) O(1) O(1) O(|E|) O(|E|) O(|E|)
O(|V|^2) O(|V|^2) O(1) O(|V|^2) O(1) O(1)
O(|V| ⋅ |E|) O(|V| ⋅ |E|) O(|V| ⋅ |E|) O(|V| ⋅ |E|) O(|V| ⋅ |E|) O(|E|)

堆操作

型別 時間複雜度
HEAPIFY 查詢最大值 分離最大值 提升鍵 插入 刪除 合併
O(1) O(1) O(n) O(n) O(1) O(m+n)
O(n) O(1) O(log(n)) O(log(n)) O(log(n)) O(log(n)) O(m+n)
O(1) O(log(n)) O(log(n)) O(1) O(log(n)) O(log(n))
O(1) O(log(n)) O(1) O(1) O(log(n)) O(1)

大 O 複雜度圖表

Big O Complexity Graph

Big O Complexity Graph