1. 程式人生 > >[收藏]時間複雜度 O(log n) 意味著什麼?

[收藏]時間複雜度 O(log n) 意味著什麼?

 

友情提示:如果圖片掛了,請翻牆或者點選原文地址閱讀。

 

預先知道演算法的複雜度是一回事,瞭解其後的原理是另一件事情。

不管你是計算機科班出身還是想有效解決最優化問題,如果想要用自己的知識解決實際問題,你都必須理解時間複雜度。

先從簡單直觀的 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 的確是有意義的,不是嗎?沒有其他什麼可以表示這種行為。

就這樣吧,我希望我講得這些你都搞懂了。在從事電腦科學相關的工作時,瞭解這類知識總是有用的(而且很有趣)。說不定就因為你知道演算法的原理,你成了小組裡能找出問題的最優解的人呢,誰知道呢。祝好運!