復(fù)雜度分析(分享)

1、復(fù)雜度分析

數(shù)據(jù)結(jié)構(gòu)和算法本身解決的是“快”和“省”的問題塘娶,即如何讓代碼運行得更快归斤,更省存儲空間。執(zhí)行效率是算法一個非常重要的考量指標(biāo)刁岸。那如何來衡量你編寫的算法代碼的執(zhí)行效率呢脏里?

事后統(tǒng)計法:依賴測試環(huán)境,受數(shù)據(jù)規(guī)模影響大虹曙,標(biāo)準(zhǔn)難把控迫横。

復(fù)雜度分析:不利用測試數(shù)據(jù),粗略估算代碼的執(zhí)行效率酝碳,指導(dǎo)編碼矾踱。

2.大 O 復(fù)雜度表示法

從 CPU 的角度來看,這段代碼的每一行都執(zhí)行著類似的操作:讀數(shù)據(jù)-運算-寫數(shù)據(jù).

假設(shè)每一次執(zhí)行所花時間都為都unix_time.總共執(zhí)行次數(shù)為f(n),總共執(zhí)行時間為T(n),

示例1:

?int cal(int n) {

?? int sum = 0;

?? int i = 1;

?? for (; i <= n; ++i) {

?? ? sum = sum + i;

?? }

?? return sum;

?}

示例2:

?int cal(int n) {

?? int sum = 0;

?? int i = 1;

?? int j = 1;

?? for (; i <= n; ++i) {

?? ? j = 1;

?? ? for (; j <= n; ++j) {

?? ? ? sum = sum +? i * j;

?? ? }

?? }

?}

所有代碼的執(zhí)行時間 T(n) 與每行代碼的執(zhí)行次數(shù)成正比:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? T(n) = O(f(n))

大 O 時間復(fù)雜度實際上并不具體表示代碼真正的執(zhí)行時間疏哗,而是表示代碼執(zhí)行時間隨數(shù)據(jù)規(guī)模增長的變化趨勢呛讲,所以,也叫作漸進時間復(fù)雜度(asymptotic time complexity),簡稱時間復(fù)雜度贝搁。

3.時間復(fù)雜度分析

? ? 大 O 這種復(fù)雜度表示方法只是表示一種變化趨勢吗氏。我們通常會忽略掉公式中的常量、低階雷逆、系數(shù)弦讽,只需要記錄一個最大階的量級就可以了。

只關(guān)注循環(huán)執(zhí)行次數(shù)最多的一段代碼关面。

2. 加法法則:總復(fù)雜度等于量級最大的那段代碼的復(fù)雜度

int cal(int n) {

?? int sum_1 = 0;

?? int p = 1;

?? for (; p < 100; ++p) {

?? ? sum_1 = sum_1 + p;

?? }

?? int sum_2 = 0;

?? int q = 1;

?? for (; q < n; ++q) {

?? ? sum_2 = sum_2 + q;

?? }

? ?int sum_3 = 0;

?? int i = 1;

?? int j = 1;

?? for (; i <= n; ++i) {

?? ? j = 1;?

?? ? for (; j <= n; ++j) {

?? ? ? sum_3 = sum_3 +? i * j;

?? ? }

?? }

? ?return sum_1 + sum_2 + sum_3;

?}

3. 乘法法則:嵌套代碼的復(fù)雜度等于嵌套內(nèi)外代碼復(fù)雜度的乘積

int cal(int n) {

?? int ret = 0;?

?? int i = 1;

?? for (; i < n; ++i) {

?? ? ret = ret + f(i);

?? }?

?}?

?int f(int n) {

? int sum = 0;

? int i = 1;

? for (; i < n; ++i) {

? ? sum = sum + i;

? }?

? return sum;

?}

4.幾種常見時間復(fù)雜度實例分析

? ? ?代碼生涯所能接觸到的幾乎所有復(fù)雜度量級:

常見的復(fù)雜度并不多坦袍,從低階到高階有:O(1)、O(logn)等太、O(n)捂齐、O(nlogn)、O(n2 )缩抡。幾乎所有的數(shù)據(jù)結(jié)構(gòu)和算法的復(fù)雜度都跑不出這幾個奠宜。

1. O(1)

示例:

?int i = 8;

?int j = 6;

?int sum = i + j;

2. O(logn)、O(nlogn)

示例:

?i=1;

?while (i <= n)? {

?? i = i * 2;

?}

歸并排序瞻想、快速排序压真、堆排序的時間復(fù)雜度都是 O(nlogn)。

5.空間復(fù)雜度分析

空間復(fù)雜度全稱就是漸進空間復(fù)雜度(asymptotic space complexity)蘑险,表示算法的存儲空間與數(shù)據(jù)規(guī)模之間的增長關(guān)系滴肿。

void print(int n) {

? int i = 0;

? int[] a = new int[n];

? for (i; i

? ? a[i] = i * i;

? }

? for (i = n-1; i >= 0; --i) {

? ? print out a[i]

? }

}

我們常見的空間復(fù)雜度就是 O(1)、O(n)佃迄、O(n2 )泼差。

6.最好、最壞呵俏、平均時間復(fù)雜度

// 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;

? }

? return pos;

}

優(yōu)化:

// 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;

}

最好情況時間復(fù)雜度就是堆缘,在最理想的情況下,執(zhí)行這段代碼的時間復(fù)雜度普碎。

最壞情況時間復(fù)雜度就是吼肥,在最糟糕的情況下,執(zhí)行這段代碼的時間復(fù)雜度麻车。

最好情況時間復(fù)雜度和最壞情況時間復(fù)雜度對應(yīng)的都是極端情況下的代碼復(fù)雜度缀皱,發(fā)生的概率其實并不大。為了更好地表示平均情況下的復(fù)雜度动猬,我們需要引入另一個概念:平均時間復(fù)雜度唆鸡。

要查找的變量 x 在數(shù)組中的位置,有 n+1 種情況:在數(shù)組的 0~n-1 位置中不在數(shù)組中枣察。

我們假設(shè)在數(shù)組中與不在數(shù)組中的概率都為 1/2。另外,要查找的數(shù)據(jù)出現(xiàn)在 0~n-1 這 n 個位置的概率也是一樣的序目,為 1/n臂痕。所以,根據(jù)概率乘法法則猿涨,要查找的數(shù)據(jù)出現(xiàn)在 0~n-1 中任意位置的概率就是 1/(2n)握童。

這個值就是概率論中的加權(quán)平均值,也叫作期望值叛赚,所以平均時間復(fù)雜度的全稱應(yīng)該叫加權(quán)平均時間復(fù)雜度或者期望時間復(fù)雜度澡绩。

用大 O 表示法來表示,去掉系數(shù)和常量俺附,這段代碼的加權(quán)平均時間復(fù)雜度為O(n)肥卡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者事镣。
  • 序言:七十年代末步鉴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子璃哟,更是在濱河造成了極大的恐慌氛琢,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件随闪,死亡現(xiàn)場離奇詭異阳似,居然都是意外死亡,警方通過查閱死者的電腦和手機铐伴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門撮奏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盛杰,你說我怎么就攤上這事挽荡。” “怎么了即供?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵定拟,是天一觀的道長。 經(jīng)常有香客問我逗嫡,道長青自,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任驱证,我火速辦了婚禮延窜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抹锄。我一直安慰自己逆瑞,他們只是感情好荠藤,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著获高,像睡著了一般哈肖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上念秧,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天淤井,我揣著相機與錄音,去河邊找鬼摊趾。 笑死币狠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的砾层。 我是一名探鬼主播漩绵,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼梢为!你這毒婦竟也來了渐行?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤铸董,失蹤者是張志新(化名)和其女友劉穎祟印,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粟害,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡蕴忆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了悲幅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片套鹅。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖汰具,靈堂內(nèi)的尸體忽然破棺而出卓鹿,到底是詐尸還是另有隱情,我是刑警寧澤留荔,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布吟孙,位于F島的核電站,受9級特大地震影響聚蝶,放射性物質(zhì)發(fā)生泄漏杰妓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一碘勉、第九天 我趴在偏房一處隱蔽的房頂上張望巷挥。 院中可真熱鬧,春花似錦验靡、人聲如沸倍宾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凿宾。三九已至矾屯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間初厚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工孙技, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留产禾,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓牵啦,卻偏偏與公主長得像亚情,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哈雏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容