你能找到心儀的妹子嗎?- 時間複雜度進階

於是乎_發表於2019-05-02

這個五一是個不平凡的五一,蒼老師成功誕下了雙胞胎。

你能找到心儀的妹子嗎?- 時間複雜度進階

伴隨著你長大的“老師”已經結婚生子,那麼你呢?你的愛情又在哪裡?
假如有一天,有這樣一個機會降臨到你的頭上。
你的面前是一條很長很長的路,這條路上齊刷刷的站滿了妹紙,沒錯,就是妹子,一雙雙大白腿閃閃發光。
此時你狠幸運,允許你從這些妹紙中選擇一個最喜歡的帶走,,,
但是呢,有一個條件,你只能從路的這頭走到那頭,只要你選擇了一個妹子,就要離開這裡,這個過程中,你只能選擇一次,不可以走回頭路,只要你選擇了,那麼不管後面的妹子多誘人都已經和你無關。

這樣的選擇是不是像極了我們的人生?蘇格拉底曾說過,人生就是一次無法重複的選擇。

讀到這裡,請不要懷疑,這是一篇正經的技術文章,我也是一個非常正經的小編。
之前文章我們已經介紹瞭如何分析時間複雜度,戳這裡,這裡我們就藉助上面的選擇來分析下幾個重要的概念。
上面尋找喜歡的妹子,可以寫成如下的虛擬碼:


// grilsArr 表示所有妹子的集合
// expect 表示是你想帶走的妹子
function findGirls(grilsArr,expect){
    const n = grilsArr.length
    for(let i=0; i<n; i++){
        if(grilsArr[i] === expect){
            return grilsArr[i]
        }
        return null
    }
}

複製程式碼

上面程式碼的含義是,遍歷整個Grils陣列,一個一個的尋找妹子,如果找到了自己想要的,那麼帶上走人,如果很不幸,到最後你都沒能找到,那麼返回null。
按照上篇文章中的分析,上面程式碼的時間複雜度為O(n) 。

最好、最壞情況下的時間複雜度

如果事情是這樣發展的,當你見到第一位妹子的時候,就驚呼“哇,長得好像蒼老師!”,你們一見鍾情,確認過眼神,她就是我想要的人。

你能找到心儀的妹子嗎?- 時間複雜度進階
那麼恭喜你,這種情況迴圈只執行了一次,時間複雜度是常數階O(1),像這種在最理想的情況下,執行這段程式碼的時間複雜度,我們就稱之為最好情況下的時間複雜度

有最好的情況,就有最差的情況,如果你一直猶豫,一直貪心,總覺得後面會有更好的,到最後,你又都覺得不如之前的適合自己,最終到了最後一個妹子,你也沒能選出自己喜歡的人,最終空手而歸。(這種人,活該單身啊~)

你能找到心儀的妹子嗎?- 時間複雜度進階

這種情況就需要遍歷全部的陣列,時間複雜度為O(n)。 像這種在最糟糕的情況下,執行這段程式碼的時間複雜度,我們就稱之為最壞情況下的時間複雜度

平均情況時間複雜度

上面說的兩種情況,都是比較極端的情況,發生的概率極低,無法用來表示平均情況。

介紹平均情況時間複雜度之前,先帶大家複習一個數學知識點: 加權平均值。


上面我們可以帶走一個妹子,選妹子的時候一定會綜合評估這個妹子是否是自己想要的人,假設從以下幾個方面來給妹子打分,每個考察項的權重如下

  1. 顏值 佔60%

  2. 身材 佔20%

  3. 氣質 佔15%

  4. 性格 佔5%

每一項我們都以百分制來計算,現在有這個妹子的分數如下

  1. 顏值 90分

  2. 身材 80分

  3. 氣質 70分

  4. 性格 10分

那麼這個妹子加權處理後的最終得分是 90×60%+80×20%+70×15%+10×5%=81 分


平均情況時間複雜度就是對所有可能出現的執行情況,根據其權重進行加權平均計算出的時間複雜度。 接下來,我們分析一下findGrils方法的平均時間複雜度。 選擇妹子一共有 n+1情況,分別是選擇了第1-n個(對應陣列的下標0-n-1)妹子中的一個和沒有找到妹子。

我相信大部分男同胞們選擇的話,大概率會選擇出自己喜歡妹子,最終抱得美人歸。為了便於理解,我們就假設能選擇到喜歡妹子的概率是90%,空手而歸的概率是10%。
在能選擇到妹子的情況下,選擇了第1到第n個的概率是相同的,為1/n。 畫個表格看看每種情況下的概率。

選擇第n個妹子 陣列下標 迴圈次數 概率
1 0 1 1/nx90%
2 1 2 1/nx90%
3 2 3 1/nx90%
... ... ... ...
n n-1 n 1/nx90%
-1 -1 n nx10%

所以加權後的時間複雜度為

T(n)= 1 x 1/n*90% + 2 x 1/n*90% + 3 x  1/n*90% + n x 10% = 0.55n + 0.45

複製程式碼

所以最終計算的平均時間複雜度為O(n)

對於同一段程式碼在不同情況下會有不同量級複雜度的情況,最好、最壞、平均情況時間複雜度概念的引入能夠幫助我們更好的分析演算法的效率。

歡迎掃描下方二維碼,關注我的公眾號。

你能找到心儀的妹子嗎?- 時間複雜度進階

相關文章