1. 程式人生 > 其它 >O(log(N))是什麼意思

O(log(N))是什麼意思

這裡借用那個著名故事《國王賞麥》來直觀的解釋O(log(N))。

傳說西塔發明了國際象棋而使國王十分高興,他決定要重賞西塔。西塔說:“我不要你的重賞,陛下,只要你在我的棋盤上賞一些麥子就行了。在棋盤的第1個格子裡放1粒,在第2個格子裡放2粒,在第3個格子裡放4粒,在第4個格子裡放8粒,依此類推,以 後每一個格子裡放的麥粒數都是前一個格子裡放的麥粒數的2倍,直到放滿第64個格子就行了”。區區小數,幾粒麥子,這有何難,“來人”,國王令人如數付給西塔。計數麥粒的工作開始了,第一格內放1粒,第二格內放2粒,第三格內放4粒。還沒有到第二十格,一袋麥子已經空了。一袋又一袋的麥子被扛到國王面前來。但是,麥粒數一格接一格飛快增長著,國王很快就看出,即便拿出全國的糧食,也兌現不了他對西塔的諾言。

從西塔的角度看,每多一個格子他就可以多獲得一倍的麥粒,這是個冪運算。而對數計算是冪運算的逆運算,想要直觀的理解它,我們可以從西塔對面的視角,也就是國王的角度來看這次賞麥是一個什麼樣的遊戲——我每多提供一倍的麥子,他只多消耗一個格子。而這其實就是O(log(N))的本質:輸入規模翻倍,操作次數只增加一。所以這真的是一個非常非常低的時間複雜度。比起O(N)它更接近O(1).

如何達到O(log(N))

如果要設計一個演算法,讓其具有O(log(N))的時間複雜度,從正面思考是困難的。我們不妨想一想有沒有什麼操作是每操作一次,需要處理的規模就小一半的對,特別經典的例子就是二分搜尋。每次取中位數,在其左或其右繼續搜尋目標值。其本質就是每搜尋一次,就把待搜尋的資料量減小了一半。在這之上還有二分搜尋樹,

O(log(N))其實就是二分搜尋樹的高度。

總結:

  1. 時間複雜度指的是隨著輸入大小的增長,執行時間會以怎樣的速度擴張
  2. O(log(N))指的是 該演算法隨著輸入規模翻倍,操作次數只增加一。