1. 數(shù)據(jù)結(jié)構(gòu) - 時間復(fù)雜度

這篇文章收錄在我的 Github 上 algorithms-tutorial摩骨,另外記錄了些算法題解奏赘,感興趣的可以看看胡野,轉(zhuǎn)載請注明出處。

(一) 基本概念

算法性能的好壞一般由內(nèi)部和外部因素所決定:

  • 內(nèi)部:算法性能敬飒,所需要的時間邪铲,所需要的內(nèi)存空間
  • 外部:輸入信息的大小,計算機的速度无拗,編譯器的質(zhì)量

時間復(fù)雜度使用來評判一個算法性能的好壞带到,主要測量的是算法內(nèi)部因素, 而常常忽略那些外部因素,或者認為它們是相同的英染。

那么算法性能的本質(zhì)是由增長率所決定的揽惹,我們一般用符號 O 來進行表示,當輸入函數(shù)參數(shù)個數(shù)為 n 是四康,通過 O 描述算法的性能搪搏。

比如一個簡單的冒泡排序,我們往往忽略單次比較所花費的時間闪金,而是通過當判斷的數(shù)目增多時疯溺,其判斷次數(shù)隨著數(shù)目的變化趨勢,也就是所謂的增長率哎垦。

(二) 常見的時間復(fù)雜度

時間復(fù)雜度 舉例
O(1) 彈出一個棧頂元素
O(logn) 二分查找 - 平衡樹
O(n) 線性查找 - 亂序查找
O(n^2) 冒泡排序
O(n^3) 聯(lián)立線性方程
O(2^n) 漢諾塔問題
O(n!) Travelling salesman

常見的算法時間復(fù)雜度由小到大依次為:

Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2^n)<Ο(n!)

例如:

1.png

由圖中我們可以看出囱嫩,當 n 趨于無窮大時, O(nlogn) 的性能顯然要比 O(n^2) 來的高

一般來說漏设,只要算法中不存在循環(huán)語句挠说,其時間復(fù)雜度就是 O(1)

而時間復(fù)雜度又分為三種:

  • 最優(yōu)時間復(fù)雜度 (Best-Case)
  • 平均時間復(fù)雜度 (Average-Case)
  • 最差時間復(fù)雜度 (Worst-Case)

最差時間復(fù)雜度的分析給了一個在最壞情況下的時間復(fù)雜度情況,這往往比平均時間復(fù)雜度好計算愿题,而最優(yōu)時間復(fù)雜度一般沒什么用,因為沒人會拿一些特殊情況去評判這個算法的好壞蛙奖。

(三) 計算時間復(fù)雜度

1.對于一些簡單的輸入輸出語句或賦值語句(無循環(huán)語句)潘酗,近似認為需要 O(1) 時間

比如:

int x = 1;
x++;

2.對于順序結(jié)構(gòu),需要依次執(zhí)行一系列語句所用時間可采用 "求和法則"

比如:

for(int i = 0; i < n; i++){
    //do something
}
for(int i = 0; i < n; i++){
    for(int j = 0; j < n; j++){
        //do something
    }
}

代碼中包含兩段循環(huán)雁仲,所以時間計算:n + n^2仔夺,所以時間復(fù)雜度為 O(n^2)

值得注意的是,下面這段代碼:

for(int i = 0; i < n; i++){
    for(int j = i; j < n; j++){
        //do something
    }
}

對循環(huán)次數(shù)進行求和會發(fā)現(xiàn): n + (n-1) + ... + 1 = 1/2n^2 + 1/2*n攒砖,所以時間復(fù)雜度仍為 O(n^2)

3.對于判斷條件語句來說缸兔,一般是求它的最差時間復(fù)雜度

比如:

if(x == 2){
    return false;
}else{
    for(int i = 0; i < n; i++){
        if(j == 0){
            return true;
        }
    }
}

一共花費的時間為 ``1 + n * 1```日裙,所以時間復(fù)雜度為 O(n)

4.對數(shù)時間復(fù)雜度:

當每次操作都能將所需要檢測的元素減少一半時(即每次操作,未檢測元素減少一半)惰蜜,這樣的時間復(fù)雜度為 O(logn)

例如: 二分查找法

在一本英文字典書中找一個單詞昂拂,因為字典都是按英文首字母升序的,所以我們可以從中間頁數(shù)開始查找抛猖,如果首字母比中間頁來的小格侯,則范圍就鎖定在前半本書,然后在在取前半本書的中間來依次進行判斷财著,直到找到該單詞联四。

從上我們可以得出簡化計算時間復(fù)雜度的步驟:

  1. 找到執(zhí)行次數(shù)最多的語句
  2. 計算語句執(zhí)行次數(shù)的數(shù)量級
  3. 用大O來表示結(jié)果

最后需要說明的是:性能并不代表一切。還有一些需要權(quán)衡的

  • 是否容易進行理解撑教、實現(xiàn)和調(diào)試
  • 高效地利用時間和空間

所以朝墩,最大化性能并不一定可取,但時間復(fù)雜度仍然可以很好地比較不同算法之間的性能差異伟姐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末收苏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子玫镐,更是在濱河造成了極大的恐慌倒戏,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恐似,死亡現(xiàn)場離奇詭異杜跷,居然都是意外死亡,警方通過查閱死者的電腦和手機矫夷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門葛闷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人双藕,你說我怎么就攤上這事淑趾。” “怎么了忧陪?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵扣泊,是天一觀的道長。 經(jīng)常有香客問我嘶摊,道長延蟹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任叶堆,我火速辦了婚禮阱飘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己沥匈,他們只是感情好蔗喂,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著高帖,像睡著了一般缰儿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棋恼,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天返弹,我揣著相機與錄音,去河邊找鬼爪飘。 笑死义起,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的师崎。 我是一名探鬼主播默终,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼犁罩!你這毒婦竟也來了齐蔽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤床估,失蹤者是張志新(化名)和其女友劉穎含滴,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丐巫,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡谈况,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了递胧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碑韵。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖缎脾,靈堂內(nèi)的尸體忽然破棺而出祝闻,到底是詐尸還是另有隱情,我是刑警寧澤遗菠,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布联喘,位于F島的核電站,受9級特大地震影響辙纬,放射性物質(zhì)發(fā)生泄漏耸袜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一牲平、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧域滥,春花似錦纵柿、人聲如沸蜈抓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沟使。三九已至,卻和暖如春渊跋,著一層夾襖步出監(jiān)牢的瞬間腊嗡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工拾酝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留燕少,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓蒿囤,卻偏偏與公主長得像客们,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子材诽,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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