奇葩面試題,O(logn)的底數是多少? O(logn)是有底數的! O(logn)底數意義不大!

大家好,我是老三,最近裸辭了,在面試。

前兩天一個面試,只面了十分鐘就結束了——

事情是這樣的:

面試官:你能說說HashMap的數據結構嗎?

老三:數組+鏈表+紅黑樹,阿巴阿巴……

面試官:那你說說紅黑樹的查找複雜度是多少?

老三:O(logn)。

面試官:那這個複雜度的底數是多少?

老三:時間複雜度O(logn)有底數?

面試官:沒有嗎?

尬住……

面試官:那你再說一下快速排序的時間複雜度?底數是多少?

老三露出智(尷)慧(尬)的微笑……

面試官:好了,我沒什麼要問的了,這次面試到這結束吧。


結束面試之後,老三意難平,趕緊查一下。

O(logn)是有底數的!

看一下時間複雜度的定義:

在進行算法分析時, 語句中的執行次說 T ( n ) 是關於問題規模 n 的 函 數 。 金 而 分 析 T ( n ) 隨 n 的變化情況並確定 T ( n ) 的 說 量級。 算法的時間複雜度,也就是算法的時間量度, 記者: T ( n )= O(f(n))。它表示隨問題規模 n 的增大, 算法執行時間的增長率和f ( n ) 的增長率相同, 稱作算法的漸近時間複雜度, 簡稱爲時間複雜度。 其中 f ( n ) 是問題規模 n 的某個函數。

有點抽象對不對,直接上例子,我們來意會一下。

複製代碼

        int n=10;
        int count=1;
        while (count<n){
            count=count*2;
            //時間複雜度爲O(1)的運算
            System.out.println(count);
        }

看一下,這個運算,每次 count 乘以 2 之後, 就距離n更近了一分。 也就是說:

破案了,O(logn)確實是有底數的。

這個底數是由什麼決定的呢?

算法中log級別的時間複雜度都是由於使用了分治思想,這個底數直接由分治的複雜度決定。如果採用二分法,那麼就會以2爲底,,三分法就會以3爲底數,其他類似。

O(logn)底數意義不大!

那問題來了,爲什麼我們平時不寫底數呢?

總不能因爲這個底數太難打吧……

我們注意到,時間複雜度的定義: T ( n )= O(f(n))。它表示隨問題規模 n 的增大, 算法執行時間的增長率和f ( n ) 的增長率相同, 稱作算法的漸近時間複雜度,簡稱時間複雜度。

假如說我們要比較兩個函數f(n)和g(n)的增長快慢,用什麼辦法呢?

可以使用微積分裏的極限:

老三高數忘完了哈哈,不會推導,總之最後的結果是一個常數。

也就是,假如n非常大的時候,任意底數的一個對數函數都只是相差一個常數倍而已。

所以無論底數是什麼,log級別的漸進意義是一樣的。也就是說該算法的時間複雜度的增長與處理數據多少的增長的關係是一樣的。

總之:O(logn)已經可以表達所有底數的對數了


花了一個小時,無用的知識又增加了。

簡單總結,就是O(logn)有底數,但是沒有糾結的必要。

微信搜索“程序員黑哥”關注公衆號,每日一刷,輕鬆提升技術,斬獲各種offer:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章