算法的時(shí)空復(fù)雜度分析

本文首發(fā)于 LOGI'S BLOG,由作者轉(zhuǎn)載鹰溜。

大 O 表示法

大 O 表示法并不具體表示代碼的實(shí)際執(zhí)行時(shí)間和實(shí)際占用空間罐呼,而代表代碼執(zhí)行時(shí)間和占用空間隨數(shù)據(jù)規(guī)模增加的增長(zhǎng)趨勢(shì)捣染,所以用大 O 表示法定義的時(shí)空復(fù)雜度分別叫做 漸進(jìn)時(shí)間復(fù)雜度(Asymptotic /??simp't?tik,-k?l/ Time Complexity)漸進(jìn)空間復(fù)雜度(Asymptotic Space Complexity)冤议。算法的空間復(fù)雜度計(jì)算相對(duì)容易斟薇,以下僅介紹時(shí)間復(fù)雜度师坎。

多項(xiàng)式量級(jí)復(fù)雜度

復(fù)雜度根據(jù)量級(jí)可分為 多項(xiàng)式(Polynomial /?pɑl?'nom??l/)非多項(xiàng)式量級(jí)(Non-Deterministic Polynomial)恕酸,O(2n) 和 O(n!) 屬于后者。當(dāng)數(shù)據(jù)規(guī)模 n 越來越大時(shí)胯陋,非多項(xiàng)式量級(jí)算法的執(zhí)行時(shí)間會(huì)急劇增加蕊温,甚至達(dá)到無限長(zhǎng),所以非多項(xiàng)式量級(jí)算法是不可接受的低效算法遏乔。

O(logn)

根據(jù)換底公式义矛,logab=logcb/logca,logab=1/logba盟萨,有 log3n=log32 * log2n凉翻。可以看出捻激,任意底的對(duì)數(shù)都可化為 C*log2n制轰,所以,在對(duì)數(shù)階復(fù)雜度表示法中胞谭,我們忽略對(duì)數(shù)的底垃杖,統(tǒng)一表示為 O(logn)。

O(m+n) 和 O(m*n)

如果算法的數(shù)據(jù)規(guī)模為多個(gè)變量丈屹,并且無法事先評(píng)估他們的大小调俘,那么在表示時(shí)間復(fù)雜度時(shí)要把他們?nèi)繉懗觥?/p>

最好、最壞、平均和均攤時(shí)間復(fù)雜度

// 全局變量彩库,大小為 10 的數(shù)組 array肤无,長(zhǎng)度 len,下標(biāo) i侧巨。
int array[] = new int[10]; 
int len = 10;
int i = 0;

// 往數(shù)組中添加一個(gè)元素
void add(int element) {
   if (i >= len) { // 數(shù)組空間不夠了
     // 重新申請(qǐng)一個(gè) 2 倍大小的數(shù)組空間
     int new_array[] = new int[len*2];
     // 把原來 array 數(shù)組中的數(shù)據(jù)依次 copy 到 new_array
     for (int j = 0; j < len; ++j) {
       new_array[j] = array[j];
     }
     // new_array 復(fù)制給 array舅锄,array 現(xiàn)在大小就是 2 倍 len 了
     array = new_array;
     len = 2 * len;
   }
   // 將 element 放到下標(biāo)為 i 的位置,下標(biāo) i 加一
   array[i] = element;
   ++i;
}

上面這段代碼是往數(shù)組尾插入元素司忱,并且實(shí)現(xiàn)了自動(dòng)擴(kuò)容功能皇忿。在數(shù)組未滿的情況下,直接放到數(shù)組尾即可坦仍,因此鳍烁,最好時(shí)間復(fù)雜度為 O(1)。在數(shù)組滿的情況下繁扎,需要進(jìn)行 n 次移動(dòng)幔荒,并申請(qǐng) n 個(gè)空間,因此梳玫,最壞時(shí)間復(fù)雜度是 O(n)爹梁,最壞空間復(fù)雜度是 O(n)。

再看平均時(shí)間復(fù)雜度提澎,總共有 n+1 種情況姚垃,其中數(shù)組未滿有 n 種情況,每種的概率都是 1/n+1盼忌。數(shù)組滿有 1 種情況积糯,概率也是 1/n+1,所以平均時(shí)間復(fù)雜度為 (n * 1/n+1 + 1/n+1)/n+1 = O(1)谦纱。

最后計(jì)算 均攤時(shí)間復(fù)雜度看成,首先說明其概念和適用場(chǎng)景。對(duì)某個(gè)數(shù)據(jù)結(jié)構(gòu)做一組連續(xù)操作跨嘉,大部分情況下時(shí)間復(fù)雜度都很低川慌,只有個(gè)別情況下時(shí)間復(fù)雜度比較高,并且這些操作間存在前后連貫的時(shí)序關(guān)系祠乃,此時(shí)梦重,我們便可將這組操作放在一起考慮,看能否將較高時(shí)間復(fù)雜度的那些操作耗時(shí)跳纳,平攤到其他低時(shí)間復(fù)雜度操作上忍饰,這種分析方法就叫做 攤還分析,通過攤還分析得到的時(shí)間復(fù)雜度寺庄,被稱為均攤時(shí)間復(fù)雜度艾蓝。一般情況下力崇,能夠應(yīng)用均攤時(shí)間復(fù)雜度分析的場(chǎng)合,均攤復(fù)雜度等于最好時(shí)間復(fù)雜度赢织。

對(duì)于上例亮靴,每一次 O(n) 的移動(dòng)操作,都會(huì)跟著 n 次 O(1) 的插入操作于置,所以把耗時(shí)多的那次操作均攤到接下來的 n 次耗時(shí)少的操作上茧吊,這一組連續(xù)操作的均攤時(shí)間復(fù)雜度就是 O(1)。

簡(jiǎn)要總結(jié)

最好時(shí)間復(fù)雜度計(jì)算簡(jiǎn)單八毯,與此同時(shí)搓侄,參考意義也不是很大。最壞時(shí)間復(fù)雜度計(jì)算較為復(fù)雜话速,如用于關(guān)鍵環(huán)節(jié)需要重點(diǎn)考慮讶踪。平均時(shí)間復(fù)雜度計(jì)算最為復(fù)雜,也是最常用的評(píng)價(jià)指標(biāo)泊交,而可以使用攤還分析的算法乳讥,使用均攤時(shí)間復(fù)雜度代替常規(guī)的加權(quán)平均/期望得出的平均復(fù)雜度更具實(shí)際意義。

參考文獻(xià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)離奇詭異错维,居然都是意外死亡奖地,警方通過查閱死者的電腦和手機(jī)橄唬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來参歹,“玉大人仰楚,你說我怎么就攤上這事∪樱” “怎么了僧界?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)臭挽。 經(jīng)常有香客問我捂襟,道長(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)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼牧挣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起醒陆,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤瀑构,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(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
  • 我被黑心中介騙來泰國(guó)打工恕稠, 沒想到剛下飛機(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