如何判斷一個(gè)算法的好壞

前言

小A和小B兩人寫了相同一個(gè)功能代碼,而小A的代碼老板運(yùn)行后發(fā)現(xiàn)耗時(shí)為100ms,消耗內(nèi)存10MB沪摄。而小B的代碼老板運(yùn)行以后,發(fā)現(xiàn)耗時(shí)為100S纱烘,消耗內(nèi)存100MB杨拐。如果你是老板你會(huì)選則使用誰(shuí)的代碼。對(duì)于超過(guò)3秒即劃走的用戶而言擂啥,100s顯然是不行的哄陶。小A和小B代碼耗時(shí)與運(yùn)行時(shí)占用內(nèi)存的2種方式,是判斷算法好壞的最重要的2種標(biāo)準(zhǔn)哺壶,分別為時(shí)間復(fù)雜度空間復(fù)雜度屋吨。上面都是程序運(yùn)行以后才知道耗時(shí)與占用內(nèi)存,那么如何在沒(méi)有運(yùn)行程序時(shí)對(duì)算法進(jìn)行提前預(yù)估呢山宾?

關(guān)鍵代碼執(zhí)行次數(shù)

要預(yù)估時(shí)間復(fù)雜度至扰,可以計(jì)算算法中關(guān)鍵代碼的操作執(zhí)行次數(shù)。

如下

情景一:

小明在繞操場(chǎng)勻速跑步2秒跑完1米资锰,跑300米則需要600秒敢课,如果跑步n米,則需要2 n 秒。則有

T(n) = 2n

情景二:

小明繞操場(chǎng)跑步直秆,跑第1米需要1秒胖翰,跑第2米需要2秒,跑第3米需要3秒...跑n米需要n秒切厘。

則小明跑n米的函數(shù)計(jì)算公式為

T(n) = 1 + 2 + 3+ 4 + ... + n
= (1 + n)n/2
=0.5n + 0.5n^2

情景三

小明繞操場(chǎng)跑步萨咳,總路程40米,第1秒能跑27米疫稿,跑第2秒能跑9米培他,第3秒能跑3米,跑完最后一米需要多長(zhǎng)時(shí)間遗座。由對(duì)數(shù)運(yùn)算公式可得舀凛,小明跑完40米的計(jì)算公式為

T(n) = log(3)(40)

若總路程為n 米,則有

T(n) = log(3)(n)

漸進(jìn)時(shí)間復(fù)雜度

通過(guò)情景一二的計(jì)算途蒋,我們可以預(yù)估一個(gè)算法的時(shí)間復(fù)雜度猛遍,但因?yàn)楫?dāng)n取值不一樣時(shí),仍然不能判斷到底哪一個(gè)更快号坡,例如當(dāng)n為1時(shí)懊烤,明顯情景二更快一些。這時(shí)我們需要使用漸進(jìn)時(shí)間復(fù)雜度進(jìn)行分析宽堆,即大O表示法腌紧。

當(dāng)n趨近于無(wú)限大時(shí),有 T(n) / f(n) 的極限值有不為0的常數(shù)畜隶,則記作T(n) = O(f(n))壁肋。

情景一通過(guò)大O表示法則為:O(2n),由于n趨近于無(wú)限大籽慢,忽略常數(shù)項(xiàng)浸遗,則記作O(n)
情景二通過(guò)大O表示法則為:O(0.5n + 0.5n^2 ),由于n趨近于無(wú)限大箱亿,忽略常數(shù)項(xiàng)保留最高階項(xiàng)跛锌,記作O(n^2)。
情景三通過(guò)大O表示法則為:O(log(3)(n))极景,由于為了與冪次方做對(duì)比察净,則通過(guò)換底公式有驾茴,O(log(2)(n) / log(2)(3))盼樟,由于n趨近于無(wú)限大忽略除數(shù),底數(shù)足夠小省略底數(shù)不寫锈至,則有O(log n)
情景四冪函數(shù)晨缴,同樣通過(guò)換底公式則有 O(2^x)

通過(guò)下圖,我們分析出當(dāng)n無(wú)限大時(shí)峡捡,常用的幾個(gè)函數(shù)耗時(shí)從小到大為:

由于對(duì)數(shù)函數(shù)畫圖時(shí)沒(méi)找到2為底在哪設(shè)置击碗,hhhh

O(1) < O(log n) < O(n^2) < O(2^n)

空間復(fù)雜度

在程序運(yùn)行指令中筑悴,需要存儲(chǔ)一些中間數(shù)據(jù)所占用的內(nèi)存空間即為空間復(fù)雜度,有 S(n) = O(f(n))稍途。

如下函數(shù)阁吝,傳入的n并不影響i所占用的空間,記作O(1)

f(n) {
  let i = 3n
}

如下函數(shù)械拍,傳入的n所占用總空間成正比突勇,記作O(n)

f(n) {
  let array = new Array(n)
}

如下函數(shù),傳入的n與二位數(shù)組成正比坷虑,記作O(n^2)

f(n) {
  let array = new Array(n).fill(new Array(n))
}

取舍

計(jì)算機(jī)的運(yùn)行速度和空間資源是有限的甲馋,時(shí)間復(fù)雜度與空間復(fù)雜度當(dāng)然都越小越好。在絕大多數(shù)情況下時(shí)間復(fù)雜度更為重要一些迄损,我們寧可多分配一些內(nèi)存空間定躏,也要提升程序的運(yùn)行速度。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芹敌,一起剝皮案震驚了整個(gè)濱河市痊远,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌氏捞,老刑警劉巖拗引,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異幌衣,居然都是意外死亡矾削,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門豁护,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)哼凯,“玉大人,你說(shuō)我怎么就攤上這事楚里《喜浚” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵班缎,是天一觀的道長(zhǎng)蝴光。 經(jīng)常有香客問(wèn)我,道長(zhǎng)达址,這世上最難降的妖魔是什么蔑祟? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮沉唠,結(jié)果婚禮上疆虚,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好径簿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布罢屈。 她就那樣靜靜地躺著,像睡著了一般篇亭。 火紅的嫁衣襯著肌膚如雪缠捌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天译蒂,我揣著相機(jī)與錄音鄙币,去河邊找鬼。 笑死蹂随,一個(gè)胖子當(dāng)著我的面吹牛十嘿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播岳锁,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼绩衷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了激率?” 一聲冷哼從身側(cè)響起咳燕,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乒躺,沒(méi)想到半個(gè)月后招盲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘉冒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年曹货,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讳推。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡顶籽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出银觅,到底是詐尸還是另有隱情礼饱,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布究驴,位于F島的核電站镊绪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏洒忧。R本人自食惡果不足惜蝴韭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望跑慕。 院中可真熱鬧万皿,春花似錦摧找、人聲如沸核行。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)芝雪。三九已至减余,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惩系,已是汗流浹背位岔。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留堡牡,地道東北人抒抬。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像晤柄,于是被迫代替她去往敵國(guó)和親擦剑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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