算法的時間&空間復雜度

算法效率的評估

解決一個問題可能有很多種方法,類似要排序一個數(shù)組就有:冒泡、選擇、快排&歸并排序等。 那么這些算法效率有高有低,如何衡量?指標就是時間復雜度和空間復雜度----分別代表了實現(xiàn)該算法的程序需要消耗的時間和內(nèi)存空間。

算法時間復雜度

算法執(zhí)行時間在不同語言實現(xiàn)、不同機器環(huán)境運行都不一致;很難精確計算實際耗時。而通常我們只需要一個簡單的方式來簡易評估程序大概運行耗時,再通俗點就是程序跑完算法要執(zhí)行語句的次數(shù)。需要更專業(yè)的解釋戳知乎:https://www.zhihu.com/question/21387264

通常時間復雜度用一個Big O表示法,類似O(1)、O(n)、O(n2)等,即用一個函數(shù)來描述算法的語句執(zhí)行頻度。Big O表示法會忽略函數(shù)的系數(shù),類似O(n)即代表一個算法具有 y=kx 線性函數(shù)復雜度,隨著輸入n的變化執(zhí)行次數(shù)呈現(xiàn)線性函數(shù)的增長曲線。

常見的時間復雜度

常數(shù)級O(1)
    var age = 20;
    println("Hello World")
    println("Hi, Joker")
   /**這里無論寫多少句,只要不牽扯到循環(huán)之類的隨變量變化而不確定執(zhí)行次數(shù)的case,都屬于O(1)常數(shù)階,執(zhí)行次數(shù)為一個確定常數(shù)
  **/
線性級O(n)
    var count = 20; //這里的count是指外部輸入的變量 并非給定常數(shù)
    println("Hello World")
    val range = 1 until count
    for(num in range){
       println("Hi, Joker")
    }
   /**最簡單的加上一句for循環(huán),這段代碼執(zhí)行次數(shù)會根據(jù)count的變化而呈現(xiàn)線性增長
  **/

這里若是將val range = 1 until count --> val range = 1 until 3*count 雖然變成了y=3x但依然是個線性也是O(n)

平方級O(n2)
    var count = 20; //這里的count是指外部輸入的變量 并非給定常數(shù)
    println("Hello World")
    val range = 1 until count
    for(num in range){
        for(inex in range){
            println("Hi, Joker")
        }
    }
   /**最簡單平方階代表是雙層循環(huán)**/

拓展思考下面的代碼是什么級的時間復雜度?

    val count = 5 //ex count = 5, count指代指外部輸入的變量n
    println("Hello World")
    for( i in 1..count) {
        for( j in i..count){
            println("Hi, Joker.")
        }
    }
//這段代碼最終的執(zhí)行次數(shù)為 1+2+3+4+5  --》 
1+2+3+....+n = (n+1)*n/2 = 0.5*n2 + 0.5*n ---> 忽略系數(shù)還是O(n2)
對數(shù)級O(logn)
    var count = 8; //這里的count是指外部輸入的變量 并非給定常數(shù)
    println("Hello World")
    var index = 1
    while( index < count ){
        println("Hi, Joker")
        index = index * 2 //以2為基數(shù)累乘
    }
/** 循環(huán)次數(shù)y=log?n 為對數(shù)關(guān)系O(logn)**/

指數(shù)階

//指數(shù)階的算法性能效率屬于較低了,最常見于遞歸:比如斐波那契數(shù)列的遞歸寫法。

fun main() {
   //斐波那契數(shù)列 0、1、1、2、3、5、8、13...... (n>=1)
    println(fib(7))
}
fun fib(n: Int): Int {
    if(n <= 1) return n
    return fib(n-1) + fib(n-2)
}

Ex:計算fib(7) --> fib(6)+fib(5)
fib(6) --> fib(5)+fib(4)
fib(5) --> fib(4)+fib(3)
每一個函數(shù)調(diào)用都會觸發(fā)兩個新的函數(shù)調(diào)用,用樹形結(jié)構(gòu)表示:



可以看到樹形結(jié)構(gòu)每增加一層節(jié)點數(shù)就是上一層的2倍而且會計算很多重復的節(jié)點值。按照樹形圖若要完整遞歸計算出fib(7)需要7層,從fib(7)--> fib(1)需要call 函數(shù)2^7 次, 所以屬于指數(shù)階復雜度O(2^n)

常見時間復雜度對比

O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(2?)<O(n!)

常見算法的復雜度

二分查找 ---> O(logn)
歸并排序(merge sort) ---> O(nlogn)

節(jié)點數(shù)總數(shù)為n的下列算法:
樹的前序、中序、后續(xù)遍歷 --> O(n)
搜索算法:DFS、BFS --> O(n)
圖的遍歷 ---> O(n)

換個角度看這幾個算法都是有且僅訪問一次節(jié)點的算法,所以時間復雜度都為O(n)

空間復雜度

關(guān)于空間復雜度類似的就用來評估程序?qū)?nèi)存空間的使用情況,粗暴是只考慮程序運行期間額外申請消耗的最大內(nèi)存規(guī)模:
這里的額外指的是除了程序本身的指令存儲空間以及存儲輸入數(shù)據(jù)需要的空間等與算法本身無關(guān)的空間消耗:通常是動態(tài)申請的數(shù)組空間、臨時變量、遞歸函數(shù)??臻g等

比如算法需要申請了一個長度為n的一維數(shù)組來解決問題 ---> O(n)
或者需要申請一個n*n的二維數(shù)組,那么就是O(n^2)
另外就是使用遞歸的情況基本相當于遞歸樹的層數(shù),上述斐波拉契的算法遞歸層級為N ---> O(n)

為啥遞歸的空間復雜度是遞歸樹的層數(shù)?
遞歸斐波那契空間分析

由函數(shù)遞歸調(diào)用順序來看,每次遞歸雖然會產(chǎn)生兩次新的函數(shù)調(diào)用但是由于加法優(yōu)先級,會先計算左邊的操作數(shù),從fib(5)一直先call到fib(1),然后fib(1)計算完成返回值銷毀回收自己的函數(shù)??臻g往回調(diào)用。所以消耗最大的內(nèi)存就是最深的調(diào)用層級n*S(S代表每次調(diào)用函數(shù)消耗的函數(shù)棧空間) ,即遞歸空間復雜度等于遞歸函數(shù)最深的層數(shù)級。

參考信息

CSDN博文 算法(一)時間復雜度
如何理解算法時間復雜度的表示法,例如 O(n2)、O(n)、O(1)、O(nlogn) 等?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,720評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,690評論 2 370

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