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

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

伴隨着你長大的「老師」都已經結婚生子,那麼你呢?你的愛情又在哪裏?數組

假若有一天,有這樣一個機會降臨到你的頭上。spa

你的面前是一條很長很長的路,這條路上齊刷刷的站滿了妹紙,沒錯,就是妹子,一雙雙大白腿閃閃發光。code

此時你狠幸運,容許你從這些妹紙中選擇一個最喜歡的帶走,,,blog

可是呢,有一個條件,你只能從路的這頭走到那頭,只要你選擇了一個妹子,就要離開這裏,這個過程當中,你只能選擇一次,不能夠走回頭路,只要你選擇了,那麼無論後面的妹子多誘人都已經和你無關。get

這樣的選擇是否是像極了咱們的人生?蘇格拉底曾說過,人生就是一次沒法重複的選擇。數學

讀到這裏,請不要懷疑,這是一篇正經的技術文章,我也是一個很是正經的小編。io

以前文章咱們已經介紹瞭如何分析時間複雜度,戳這裏,這裏咱們就藉助上面的選擇來分析下幾個重要的概念。
上面尋找喜歡的妹子,能夠寫成以下的僞代碼:table

 1 // grilsArr 表示全部妹子的集合
 2 // expect 表示是你想帶走的妹子
 3 function findGirls(grilsArr,expect){
 4     const n = grilsArr.length
 5     for(let i=0; i<n; i++){
 6         if(grilsArr[i] === expect){
 7             return grilsArr[i]
 8         }
 9         return null
10     }
11 }

上面代碼的含義是,遍歷整個Grils數組,一個一個的尋找妹子,若是找到了本身想要的,那麼帶上走人,若是很不幸,到最後你都沒能找到,那麼返回null。
按照上篇文章中的分析,上面代碼的時間複雜度爲O(n) 。function

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

若是事情是這樣發展的,當你見到第一位妹子的時候,就驚呼「哇,長得好像蒼老師!」,大家一見傾心,確認過眼神,她就是我想要的人。

那麼恭喜你,這種狀況循環只執行了一次,時間複雜度是常數階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)

對於同一段代碼在不一樣狀況下會有不一樣量級複雜度的狀況,最好、最壞、平均狀況時間複雜度概念的引入可以幫助咱們更好的分析算法的效率。

歡迎掃描下方二維碼,關注個人公衆號。

相關文章
相關標籤/搜索