玩轉數(shù)據(jù)結構之最好瞻颂、最壞钩骇、平均時間復雜度

0.序言

這篇文章講解三個復雜度分析方面的知識點:

  • 最好情況時間復雜度
  • 最壞情況時間復雜度
  • 平均情況時間復雜度

如果你對簡單的復雜度分析還不了解比藻,建議點擊跳轉閱讀這兩篇文章:
http://www.reibang.com/p/2d5e5f1bc77e
http://www.reibang.com/p/4c8fa84a9393

1. 最好、最壞時間復雜度

// n 表示數(shù)組 array 的長度
int find(int[] array, int n, int x) {
  int i = 0;
  int pos = -1;
  for (; i < n; ++i) {
    if (array[i] == x) {
       pos = i;
       break;
    }
  }
  return pos;
}

這段代碼要是實現(xiàn)的功能是:在一個無序的數(shù)組中伊履,查找變量x出現(xiàn)的位置韩容。如果沒有找到,就返回-1唐瀑。如果數(shù)組中第一個元素正好是要查找的變量x群凶,那就不需要繼續(xù)遍歷剩下的n-1個數(shù)據(jù)了,時間復雜度就是O(1)哄辣。如果數(shù)組中不存在變量x请梢,就需要把整個數(shù)組遍歷一遍,時間復雜度就成了O(n)力穗。所以在不同的情況下毅弧,這段代碼的時間復雜度不一樣。

為了表示代碼在不同情況下的不同時間復雜度当窗,需要引入三個概念

  • 最好情況時間復雜度
    顧名思義:指的是在最理想的情況下够坐,執(zhí)行這段代碼的時間復雜度。對應以上例子:要查找的變量x崖面,正好是數(shù)組的第一個元素元咙。這個時候對應的時間復雜度就是最好情況時間復雜度。
  • 最壞情況時間復雜度
    顧名思義:指的是在最糟糕的情況下巫员,執(zhí)行這段代碼的時間復雜度庶香。對應以上例子:要查找變量x,但數(shù)組中沒有變量x简识,需要把整個數(shù)組都遍歷一遍赶掖。這個時候對應的時間復雜度就是最壞情況時間復雜度感猛。
  • 平均情況時間復雜度
    請看下一小節(jié)。

2. 平均時間復雜度

最好情況時間復雜度和最壞情況時間復雜度對應的都是比較極端的情況奢赂,發(fā)生的概率比較小陪白。為了更好地表示平均情況下的時間復雜度,我們引入"平均時間復雜度"這個概念呈驶。

借助剛才查找變量x的例子:要查找的變量x在數(shù)組中的位置拷泽,有n+1種情況:在數(shù)組的0~n-1位置中和不在數(shù)組中。把每種情況下袖瞻,查找需要遍歷的元素個數(shù)累加起來,然后再除以n+1拆吆,就可以得到需要遍歷的元素個數(shù)的平均值聋迎,即:


平均時間復雜度(1)

大O時間復雜度表示法,可以忽略系數(shù)枣耀、低階霉晕、常量,所以這個公式可以簡化為O(n)捞奕。不過計算過程有點問題牺堰,就是我們剛才說的這個n+1種情況,出現(xiàn)的概率其實是不一樣的颅围。

要查找變量x伟葫,在數(shù)組和不在數(shù)組的概率都是1/2,在0~n-1這個n個位置的概率也是一樣的院促,為1/n筏养,而根據(jù)時間復雜度乘法法則(嵌套代碼復雜度是嵌套內外代碼復雜度的乘積)【如果對時間復雜度乘法法則不了解,建議點擊跳轉閱讀這篇文章:http://www.reibang.com/p/2d5e5f1bc77e 】常拓,要查找的數(shù)據(jù)出現(xiàn)在0~n-1中任意位置的概率就是1/n * 1/2 = 1/2n渐溶。所以如果把每種情況發(fā)生的概率考慮進去,那么平均時間復雜度的計算過程就變成了這樣:

平均時間復雜度(2)

這個值在概率論中叫做加權平均值弄抬,也叫做期望值茎辐,所以平均時間復雜度的全程應該叫加權平均時間復雜度或者期望時間復雜度。

用大O時間復雜度表示法表示掂恕,去掉系數(shù)和常量拖陆,上面示例代碼的加權時間復雜度依然是O(n)。

其實竹海,在大多數(shù)情況下慕蔚,并不需要區(qū)分最好、最壞斋配、平均情況時間復雜度三種情況孔飒,很多時候灌闺,只需要使用一個復雜度就可以滿足需求,就像以下兩篇文章中所講的那樣:
http://www.reibang.com/p/2d5e5f1bc77e
http://www.reibang.com/p/4c8fa84a9393
只有同一塊代碼在不同的情況下坏瞄,時間復雜度有量級的差距桂对,我們才會使用三種復雜度表示法來區(qū)分。

那何時平均時間復雜度加權鸠匀,何時不加權呢蕉斜?針對每個操作發(fā)生的概率都一樣的情況下,沒有必要使用加權平均時間復雜度缀棍,針對每個操作發(fā)生的概率不一樣的情況下宅此,有必要使用加權平均時間復雜度。

3. 后續(xù)

如果大家喜歡這篇文章爬范,歡迎點贊父腕!
如果想看更多 數(shù)據(jù)結構 方面的文章,歡迎關注!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末青瀑,一起剝皮案震驚了整個濱河市璧亮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌斥难,老刑警劉巖枝嘶,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異哑诊,居然都是意外死亡群扶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門搭儒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來穷当,“玉大人,你說我怎么就攤上這事淹禾∧俨耍” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵铃岔,是天一觀的道長汪疮。 經(jīng)常有香客問我,道長毁习,這世上最難降的妖魔是什么智嚷? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮纺且,結果婚禮上盏道,老公的妹妹穿的比我還像新娘。我一直安慰自己载碌,他們只是感情好猜嘱,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布衅枫。 她就那樣靜靜地躺著,像睡著了一般朗伶。 火紅的嫁衣襯著肌膚如雪弦撩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天论皆,我揣著相機與錄音益楼,去河邊找鬼。 笑死点晴,一個胖子當著我的面吹牛感凤,可吹牛的內容都是我干的。 我是一名探鬼主播觉鼻,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼俊扭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了坠陈?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捐康,失蹤者是張志新(化名)和其女友劉穎仇矾,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體解总,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡贮匕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了花枫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刻盐。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖劳翰,靈堂內的尸體忽然破棺而出敦锌,到底是詐尸還是另有隱情,我是刑警寧澤佳簸,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布乙墙,位于F島的核電站,受9級特大地震影響生均,放射性物質發(fā)生泄漏听想。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一马胧、第九天 我趴在偏房一處隱蔽的房頂上張望汉买。 院中可真熱鬧,春花似錦佩脊、人聲如沸蛙粘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽组题。三九已至葫男,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間崔列,已是汗流浹背梢褐。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赵讯,地道東北人盈咳。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像边翼,于是被迫代替她去往敵國和親鱼响。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內容