- 原文地址:What does the time complexity O(log n) actually mean?
- 原文作者: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 的確是有意義的,不是嗎?沒有其他什么可以表示這種行為。
就這樣吧,我希望我講得這些你都搞懂了。在從事計算機科學相關的工作時,了解這類知識總是有用的(而且很有趣)。說不定就因為你知道算法的原理,你成了小組里能找出問題的最優解的人呢,誰知道呢。祝好運!