[收藏]時間複雜度 O(log n) 意味著什麼?
- 原文地址:https://github.com/xitu/gold-miner/blob/master/TODO/what-does-the-time-complexity-o-log-n-actually-mean.md
- 原文作者:Maaz
- 譯文出自:掘金翻譯計劃
- 譯者:cdpath
- 校對者:zaraguo (zaraguo), whatbeg (Qiu Hu)
友情提示:如果圖片掛了,請翻牆或者點選原文地址閱讀。
預先知道演算法的複雜度是一回事,瞭解其後的原理是另一件事情。
不管你是計算機科班出身還是想有效解決最優化問題,如果想要用自己的知識解決實際問題,你都必須理解時間複雜度。
先從簡單直觀的 O(1) 和 O(n) 複雜度說起。O(1) 表示一次操作即可直接取得目標元素(比如字典或雜湊表),O(n) 意味著先要檢查 n 個元素來搜尋目標,但是 O(log n) 是什麼意思呢?
你第一次聽說 O(log n) 時間複雜度可能是在學二分搜尋演算法的時候。二分搜尋一定有某種行為使其時間複雜度為 log n。我們來看看是二分搜尋是如何實現的。
因為在最好情況下二分搜尋的時間複雜度是 O(1),最壞情況(平均情況)下 O(log n),我們直接來看最壞情況下的例子。已知有 16 個元素的有序陣列。
舉個最壞情況的例子,比如我們要找的是數字 13。
十六個元素的有序陣列
選中間的元素作為中心點(長度的一半)
13 小於中心點,所以不用考慮陣列的後一半
重複這個過程,每次都尋找子陣列的中間元素
每次和中間元素比較都會使搜尋範圍減半。
所以為了從 16 個元素中找到目標元素,我們需要把陣列平均分割 4 次,也就是說,
簡化後的公式
類似的,如果有 n 個元素,
歸納一下
分子和分母代入指數
等式兩邊同時乘以 2^k
最終結果
現在來看看「對數」的定義:
為使某數(底數)等於一給定數而必須取的乘冪的冪指數。
也就是說可以寫成這種形式
對數形式
所以 log n 的確是有意義的,不是嗎?沒有其他什麼可以表示這種行為。
就這樣吧,我希望我講得這些你都搞懂了。在從事電腦科學相關的工作時,瞭解這類知識總是有用的(而且很有趣)。說不定就因為你知道演算法的原理,你成了小組裡能找出問題的最優解的人呢,誰知道呢。祝好運!