數(shù)據(jù)結構與算法系列之時間復雜度

前言

上一篇《數(shù)據(jù)結構和算法》中我介紹了數(shù)據(jù)結構的基本概念,也介紹了數(shù)據(jù)結構一般可以分為邏輯結構和物理結構。邏輯結構分為集合結構昌罩、線性結構阱穗、樹形結構和圖形結構饭冬。物理結構分為順序存儲結構和鏈式存儲結構。并且也介紹了這些結構的特點揪阶。然后昌抠,又介紹了算法的概念和算法的5個基本特性,分別是輸入鲁僚、輸出炊苫、有窮性、確定性和可行性冰沙。最后說闡述了一個好的算法需要遵守正確性侨艾、可讀性、健壯性拓挥、時間效率高和存儲量低唠梨。其實,實現(xiàn)效率和存儲量就是時間復雜度和空間復雜度侥啤。本篇我們就圍繞這兩個"復雜度"展開說明当叭。在真正的開發(fā)中茬故,時間復雜度尤為重要,空間復雜度我們不做太多說明科展。

時間復雜度

時間復雜度和空間復雜度是算法效率的度量方法均牢。也就是說,一個好的算法取決于它的時間復雜度和空間復雜度才睹。
函數(shù)的漸近增長:給定兩個函數(shù)f(n)和g(n)徘跪,如果存在一個整數(shù)N,使得對于所有的n>N琅攘,f(n)總是比g(n)大垮庐。那么,我們說f(n)的增長漸近快于g(n)坞琴。

翻譯過來就是:如果存在一個臨界值哨查,使得f(n)>g(n)永遠成立,那么我們就認為"f(n)的增長漸近快于g(n)"剧辐。
這里我拿3個函數(shù)的增長曲線來說明問題寒亥。如下圖:
函數(shù)一:X = 3n 注釋:3乘以n
函數(shù)二:Y = 2n^2 注釋:n的平方乘以2
函數(shù)三:Z = 2n^2 + 3n 注釋:n的平方乘以2 + 3乘以n



當n=1時,Y < X < Z.
當n=2時荧关,X < Y < Z.
所以溉奕,存在一個值,這個值位于1和2之間忍啤,使得X < Y < Z永遠成立加勤。我們就稱Y的漸進增長快于X,Z的漸進增長快于Y同波,當然鳄梅,根據(jù)傳遞性規(guī)則,Z的漸進增長也快于X未檩。

定義

算法時間復雜度的定義:在進行算法分析時戴尸,語句總的執(zhí)行次數(shù)T(n)是關于問題規(guī)模n的函數(shù),進而分析T(n)隨n的變化情況并確定T(n)的數(shù)量級冤狡。
算法的時間復雜度孙蒙,也就是算法的時間量度,記作:T(n)= O(f(n))筒溃。
它表示隨問題規(guī)模n的增大马篮,算法執(zhí)行時間的增長率和f(n)的增長率相同,稱作算法的漸近時間復雜度怜奖,簡稱為時間復雜度浑测。其中f(n)是問題規(guī)模n的某個函數(shù)。

時間復雜度計算方法

1.用常數(shù)1取代運行時間中的所有加法常數(shù)。
2.在修改后的運行次數(shù)函數(shù)中迁央,只保留最高階項掷匠。
3.如果最高階項存在且不是1,則去除與這個項相乘的常數(shù)岖圈。
最后讹语,得到的最后結果就是時間復雜度。

常見的時間復雜度

按數(shù)量級遞增排列蜂科,常見的時間復雜度有:
常數(shù)階O(1),對數(shù)階O( log n ),線性階O(n),線性對數(shù)階O(nlog2n),平方階O(n2)顽决,立方階O(n3),...,k次方階O(nk),指數(shù)階O(2n)导匣。隨著問題規(guī)模n的不斷增大才菠,上述時間復雜度不斷增大,算法的執(zhí)行效率越低贡定。
也就是:
常用的時間復雜度所耗費的時間從小到大依次是:O(1) < O(logn) < (n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

時間復雜度順序表.gif

常數(shù)階

// 常數(shù)階
int n = 0;
printf(“oneSong”);
printf(“oneSong”);
printf(“oneSong”);
printf(“oneSong”);
printf(“oneSong”);
printf(“oneSong”);
printf(“oneSong”);
printf(“oneSong”);
printf(“oneSong”);

上面這段代碼的時間復雜度是O(1)赋访。因為,按照時間復雜度的定義來說缓待,n和問題的規(guī)模沒有關系蚓耽。當然,按照時間復雜度計算方法第一條也可以得出結果為O(1)旋炒。

線性階

// 線性階int i , 
n = 10086, sum = 0; 
for( i=0; i < n; i++ )
{ 
  sum = sum + i;
}

上面這段代碼的時間復雜度是O(n)步悠,因為問題規(guī)模會隨著n的增長而變得越來越大,并且這種增長是線性的国葬。

平方階

// 平方階
int i, j, n = 998;
 for( i=0; i < n; i++ )
{ 
    for( j=0; j < n; j++ ) 
    {
       printf(“oneSong”); 
    }
}

上面這段代碼外層執(zhí)行n次贤徒,外層循環(huán)每執(zhí)行一次芹壕,內(nèi)層循環(huán)就執(zhí)行n次汇四,那總共程序想要從這兩個循環(huán)出來,需要執(zhí)行n*n次踢涌,也就是n的平方通孽。所以這段代碼的時間復雜度為O(n^2)。

對數(shù)階

// 對數(shù)階
int i = 1, n = 100;
 while( i < n )
{ 
i = i * 2;
}

由于每次i*2之后睁壁,就距離n更近一步背苦,假設有x個2相乘后大于或等于n,則會退出循環(huán)潘明。于是由2^x = n得到x = log(2)n行剂,所以這個循環(huán)的時間復雜度為O(logn)。

算法的空間復雜度

算法的空間復雜度通過計算算法所需的存儲空間實現(xiàn)钳降,算法的空間復雜度的計算公式記作:S(n)=O(f(n))厚宰,其中,n為問題的規(guī)模,f(n)為語句關于n所占存儲空間的函數(shù)铲觉。
在程序開發(fā)中澈蝙,我們所指的復雜度不做特別說明的情況下,就是指時間復雜度∧煊模現(xiàn)在的硬件發(fā)展速度之快使得我們完全可以不用考慮算法所占的內(nèi)存灯荧,通常都是用空間換取時間。加之算法的空間復雜度比較難算盐杂,所以逗载,無論是在考試中還是在項目開發(fā)中,我們都側(cè)重于時間復雜度链烈。所以撕贞,空間復雜度,略過测垛。

圖片來源參考自:魚C工作室捏膨。感謝魚C工作室貢獻出了這么好的圖片。
如非特別說明食侮,筆者所有文章都是原創(chuàng)文章号涯。如果您喜歡這篇文章,轉(zhuǎn)載請注明出處锯七。如果您對數(shù)據(jù)結構感興趣链快,請關注我,后續(xù)會更新大量精品文章供大家參考眉尸!
PS:本篇文章在博客園也有同步更新域蜗,大家也可以通過博客園關注我
http://www.cnblogs.com/wsnb

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市噪猾,隨后出現(xiàn)的幾起案子霉祸,更是在濱河造成了極大的恐慌,老刑警劉巖袱蜡,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丝蹭,死亡現(xiàn)場離奇詭異,居然都是意外死亡坪蚁,警方通過查閱死者的電腦和手機奔穿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敏晤,“玉大人贱田,你說我怎么就攤上這事∽炱ⅲ” “怎么了男摧?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我彩倚,道長筹我,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任帆离,我火速辦了婚禮蔬蕊,結果婚禮上,老公的妹妹穿的比我還像新娘哥谷。我一直安慰自己岸夯,他們只是感情好,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布们妥。 她就那樣靜靜地躺著猜扮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪监婶。 梳的紋絲不亂的頭發(fā)上旅赢,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機與錄音惑惶,去河邊找鬼煮盼。 笑死,一個胖子當著我的面吹牛带污,可吹牛的內(nèi)容都是我干的僵控。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鱼冀,長吁一口氣:“原來是場噩夢啊……” “哼报破!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起千绪,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤充易,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后翘紊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蔽氨,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡藐唠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年帆疟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宇立。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡踪宠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妈嘹,到底是詐尸還是另有隱情柳琢,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站柬脸,受9級特大地震影響他去,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜倒堕,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一灾测、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧垦巴,春花似錦媳搪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至憔披,卻和暖如春等限,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芬膝。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工精刷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蔗候。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓怒允,卻偏偏與公主長得像,于是被迫代替她去往敵國和親锈遥。 傳聞我的和親對象是個殘疾皇子纫事,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

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