日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

《大话数据结构》第2章 算法基础 2.9 算法的时间复杂度

發(fā)布時(shí)間:2025/3/21 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《大话数据结构》第2章 算法基础 2.9 算法的时间复杂度 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
2.9 算法的時(shí)間復(fù)雜度

?

2.9.1?算法時(shí)間復(fù)雜度定義

??????? 在進(jìn)行算法分析時(shí),語(yǔ)句總的執(zhí)行次數(shù)T(n)是關(guān)于問(wèn)題規(guī)模n的函數(shù),進(jìn)而分析T(n)隨n的變化情況并確定T(n)的數(shù)量級(jí)。算法的時(shí)間復(fù)雜度,也就是算法的時(shí)間量度,記作:T(n) = O(f(n))。它表示隨問(wèn)題規(guī)模n的增大,算法執(zhí)行時(shí)間的增長(zhǎng)率和f(n)的增長(zhǎng)率相同,稱(chēng)作算法的漸近時(shí)間復(fù)雜度,簡(jiǎn)稱(chēng)為時(shí)間復(fù)雜度。其中f(n)是問(wèn)題規(guī)模n的某個(gè)函數(shù)。

??????? 這樣用大寫(xiě)O()來(lái)體現(xiàn)算法時(shí)間復(fù)雜度的記法,我們稱(chēng)之為大O記法。
??????? 一般情況下,隨著n的增大,T(n)增長(zhǎng)最慢的算法為最優(yōu)算法。
??????? 顯然,由此算法時(shí)間復(fù)雜度的定義可知,我們的三個(gè)求和算法的時(shí)間復(fù)雜度分別為O(n),O(1),O(n2)。我們分別給它們?nèi)×朔枪俜降拿Q(chēng),O(1)叫常數(shù)階,O(n)叫線(xiàn)性階,O(n2)叫平方階,當(dāng)然,還有其他的一些階,我們之后會(huì)介紹。

2.9.2?推導(dǎo)大O階方法

??????? 那么如何分析一個(gè)算法的時(shí)間復(fù)雜度呢?即如何推導(dǎo)大O階呢?我們給出了下面的推導(dǎo)方法,基本上,這也就是總結(jié)前面我們舉的例子

推導(dǎo)大O階1.用常數(shù)1取代運(yùn)行時(shí)間中的所有加法常數(shù)。
2.在修改后的運(yùn)行次數(shù)函數(shù)中,只保留最高階項(xiàng)。
3.如果最高階項(xiàng)存在且不是1,則去除與這個(gè)項(xiàng)相乘的常數(shù)。
得到的結(jié)果就是大O階。

??????? 哈,仿佛是得到了游戲攻略一樣,我們好像已經(jīng)得到了一個(gè)推導(dǎo)算法時(shí)間復(fù)雜度的萬(wàn)能公式。可事實(shí)上,分析一個(gè)算法的時(shí)間復(fù)雜度,沒(méi)有這么簡(jiǎn)單,我們還需要多看幾個(gè)例子。

2.9.3?常數(shù)階
??????? 首先順序結(jié)構(gòu)的時(shí)間復(fù)雜度。下面這個(gè)算法,也就是剛才的第二種算法,為什么時(shí)間復(fù)雜度不是O(3),而是O(1)。

?

int?sum?=?0,n?=?100;??/*執(zhí)行一次*/
sum?
=?(1+n)*n/2;???/*執(zhí)行一次*/
printf(
"%d",?sum);??/*執(zhí)行一次*/

??????? 這個(gè)算法的運(yùn)行次數(shù)函數(shù)是f(n)=3。根據(jù)我們推導(dǎo)大O階的方法,第一步就是把常數(shù)項(xiàng)3改為1。在保留最高階項(xiàng)時(shí)發(fā)現(xiàn),它根本沒(méi)有最高階項(xiàng),所以這個(gè)算法的時(shí)間復(fù)雜度為O(1)。
??????? 另外,我們?cè)囅胍幌?#xff0c;如果這個(gè)算法當(dāng)中的語(yǔ)句sum=(1+n)*n/2有10句,即:

?

int?sum?=?0,?n?=?100;?/*執(zhí)行一次*/
sum?
=?(1+n)*n/2;???/*執(zhí)行第1次*/
sum?
=?(1+n)*n/2;???/*執(zhí)行第2次*/
sum?
=?(1+n)*n/2;???/*執(zhí)行第3次*/
sum?
=?(1+n)*n/2;???/*執(zhí)行第4次*/
sum?
=?(1+n)*n/2;???/*執(zhí)行第5次*/
sum?
=?(1+n)*n/2;???/*執(zhí)行第6次*/
sum?
=?(1+n)*n/2;???/*執(zhí)行第7次*/
sum?
=?(1+n)*n/2;???/*執(zhí)行第8次*/
sum?
=?(1+n)*n/2;???/*執(zhí)行第9次*/
sum?
=?(1+n)*n/2;???/*執(zhí)行第10次*/
printf(
"%d",sum);??/*執(zhí)行一次*/?

??????? 事實(shí)上無(wú)論n為多少,上面的兩段代碼就是3次和12次執(zhí)行的差異,這種與問(wèn)題的大小無(wú)關(guān)(n的多少),執(zhí)行時(shí)間恒定的算法,我們稱(chēng)之為具有O(1)的時(shí)間復(fù)雜度,又叫常數(shù)階。
??????? 注意,不管這個(gè)常數(shù)是多少,我們都記作O(1),而不能是O(3)、O(12)等其他任何數(shù)字。這是初學(xué)者常常犯的錯(cuò)誤。
??????? 對(duì)于分支結(jié)構(gòu)而言,無(wú)論是真,還是假,執(zhí)行的次數(shù)都是恒定的,不會(huì)隨著n的變大而發(fā)生變化,所以單純的分支結(jié)構(gòu)(不包含在循環(huán)結(jié)構(gòu)中),其時(shí)間復(fù)雜度也是O(1)。

2.9.4?線(xiàn)性階
??????? 循環(huán)結(jié)構(gòu)就會(huì)復(fù)雜很多。要確定某個(gè)算法的階次,我們常常需要確定某個(gè)特定語(yǔ)句或某個(gè)語(yǔ)句集運(yùn)行的次數(shù)。因此,我們要分析算法的復(fù)雜度,關(guān)鍵就是要分析循環(huán)結(jié)構(gòu)的運(yùn)行情況。
??????? 下面這段代碼,它的循環(huán)的時(shí)間復(fù)雜度為O(n)。因?yàn)檠h(huán)體中的代碼須要執(zhí)行n次。

int?i;
for(i?=?0;?i?<?n;?i++)
{
???
/*時(shí)間復(fù)雜度為O(1)的程序步驟序列*/
}

2.9.5?對(duì)數(shù)階
??????? 那么下面的這段代碼,時(shí)間復(fù)雜度又是多少呢?

int?count?=?1;
while?(count?<?n)
{
???count?
=?count?*?2;
???
/*時(shí)間復(fù)雜度為O(1)的程序步驟序列*/
}

??????? 由于每次count乘以2之后,就距離n更近了一分。也就是說(shuō),有多少個(gè)2相乘后大于n,則會(huì)退出循環(huán)。由2x=n得到x=log2n。所以這個(gè)循環(huán)的時(shí)間復(fù)雜度為O(logn)。

2.9.6?平方階
??????? 下面的例子是一個(gè)循環(huán)嵌套,它的內(nèi)循環(huán)剛才我們已經(jīng)分析過(guò),時(shí)間復(fù)雜度為O(n)。

?

int?i,j;
for(i?=?0;?i?<?n;?i++)
{
???
for?(j?=?0;?j?<?n;j++)???????????????????????
???{??????????????????????????????????????
???????
/*時(shí)間復(fù)雜度為O(1)的程序步驟序列*/
???}??????????????????????????????????????
}

??????? 而對(duì)于外層的循環(huán),不過(guò)是內(nèi)部這個(gè)時(shí)間復(fù)雜度為O(n)的語(yǔ)句,再循環(huán)n次。所以這段代碼的時(shí)間復(fù)雜度為O(n2)。
??????? 如果外循環(huán)的循環(huán)次數(shù)改為了m,時(shí)間復(fù)雜度就變?yōu)镺(m×n)。

int?i,j;
for(i?=?0;?i?<?m;?i++)
{
???
for?(j?=?0;?j?<?n;?j++)????????????????
???{??????????????????????????????????????
???????
/*時(shí)間復(fù)雜度為O(1)的程序步驟序列*/
???}??????????????????????????????????????
}

??????? 所以我們可以總結(jié)得出,循環(huán)的時(shí)間復(fù)雜度等于循環(huán)體的復(fù)雜度乘以該循環(huán)運(yùn)行的次數(shù)。
??????? 那么下面這個(gè)循環(huán)嵌套,它的時(shí)間復(fù)雜度是多少呢?

int?i,j;
for(i?=?0;?i?<?n;?i++)
{
????
for?(j?=?i;?j?<?n;?j++)??/*注意int?j?=?i而不是0*/
????{??????????????????????????????????????
??????????
/*時(shí)間復(fù)雜度為O(1)的程序步驟序列*/
????}??????????????????????????????????????
}

??????????????由于當(dāng)i = 0時(shí),內(nèi)循環(huán)執(zhí)行了n次,當(dāng)i = 1時(shí),執(zhí)行了n-1次,……當(dāng)i = n-1時(shí),內(nèi)循環(huán)執(zhí)行了1次。所以總的執(zhí)行次數(shù)為

?

??????? 用我們推導(dǎo)大O階的方法,第一條,沒(méi)有加法常數(shù)不予考慮;第二條,只保留最高階項(xiàng),因此保留n2/2;第三條,去除這個(gè)項(xiàng)相乘的常數(shù),也就是去除1/2,最終這段代碼的時(shí)間復(fù)雜度為O(n2)。
??????? 從這個(gè)例子,我們也可以得到一個(gè)經(jīng)驗(yàn),其實(shí)理解大O推導(dǎo)不算難,難的是對(duì)數(shù)列的一些相關(guān)運(yùn)算,這更多的是考察你的數(shù)學(xué)知識(shí)和能力,所以想考研的朋友,要想在求算法時(shí)間復(fù)雜度這里不失分,可能需要強(qiáng)化你的數(shù)學(xué),特別是數(shù)列方面的知識(shí)和解題能力。
??????? 我們繼續(xù)看例子,對(duì)于方法調(diào)用的時(shí)間復(fù)雜度又如何分析。

?

int?i,j;
for(i?=?0;?i?<?n;?i++)
{
???function(i);
}
?

????????????? 上面這段代碼調(diào)用一個(gè)函數(shù)function。

void?function(int?count)
{
???print(count);
}

???????函數(shù)體是打印這個(gè)參數(shù)。其實(shí)這很好理解,function函數(shù)的時(shí)間復(fù)雜度是O(1)。所以整體的時(shí)間復(fù)雜度為O(n)。
?????? 假如function是下面這樣的:

void?function(int?count)
{
???
int?j;
???
for?(j?=?count;?j?<?n;j++)???????????????????????
???{??????????????????????????????????????
??????
/*時(shí)間復(fù)雜度為O(1)的程序步驟序列*/
???}????
}?

??????? 事實(shí)上,這和剛才舉的例子是一樣的,只不過(guò)把嵌套內(nèi)循環(huán)放到了函數(shù)中,所以最終的時(shí)間復(fù)雜度為O(n2)。
??????? 下面這段相對(duì)復(fù)雜的語(yǔ)句:

n++;???????/*執(zhí)行次數(shù)為1*/
function(n);?????
/*執(zhí)行次數(shù)為n*/
int?i,j;?????
for(i?=?0;?i?<?n;?i++)??/*執(zhí)行次數(shù)為n2*/
{
???function?(i);
}
for(i?=?0;?i?<?n;?i++)??/*執(zhí)行次數(shù)為n(n?+?1)/2*/
{
???
for?(j?=?i;j?<?n;?j++)???????????????????????
???{??????????????????????????????????????
????????
/*時(shí)間復(fù)雜度為O(1)的程序步驟序列*/
???}??????????????????????????????????????
}
?

???????? 它的執(zhí)行次數(shù) ,根據(jù)推導(dǎo)大O階的方法,最終這段代碼的時(shí)間復(fù)雜度也是O(n2)。

出處:http://www.cnblogs.com/cj723/archive/2011/03/05/1971640.html

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的《大话数据结构》第2章 算法基础 2.9 算法的时间复杂度的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。