版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2.算法分析
算法(Algorithm)是對(duì)特定問題求解步驟的一種描述,它是指令的有限序列,其中每條指令表示一個(gè)或多個(gè)操作。1Step1:尋找雞蛋。1分鐘后仍沒找到,打電話給老婆,終于找到。Step2:洗雞蛋。Step3:打雞蛋。輕輕磕,用力磕,用大力磕。Step4:清理操作臺(tái)上的雞蛋清。Step
5:清理碗中的雞蛋殼。用筷子夾,用勺子舀,用手抓,成功了(現(xiàn)在知道為什么要洗雞蛋了吧)。Step6:攪拌。清理臉上、手上和衣服上的雞蛋清。Step
7:發(fā)現(xiàn)碗中的雞蛋沒剩下多少,又拿出兩枚,重復(fù)2—7Step
8:打火,打不著。還是打不著。怎么打也打不著。Step
9:打電話問老婆。Step
10:擰開氣閥,終于打著了。Step
11:擦紅花油,簡(jiǎn)單處理臉部灼傷。Step
12:放油。Step
13:倒掉紅花油,重新放入花生油。哎,一字之差!Step
14:等待油熱,并幻想老婆吃雞蛋時(shí)被表?yè)P(yáng)。Step
15:救火,扇子扇,水潑,火越燒越大。Step
16:在濃煙中爬著去找電話。Step
17:在電話旁思考火警電話是110、120還是119。2haha()
{ /*onlyajoke,donothing.*/
}
main()
{ printf("請(qǐng)稍等...您將知道世界的未日...");
while(1)
haha();
}算法的五個(gè)重要的特性:
(1)有窮性:在有窮步之后結(jié)束,每一步都在有窮時(shí)間內(nèi)完成。3算法的五個(gè)重要的特性:
(1)有窮性:在有窮步之后結(jié)束,每一步都在有窮時(shí)間內(nèi)完成。(2)確定性:每一條指令必須有明確的含義,算法只有唯一的一條執(zhí)行路徑。
(3)可行性:可通過基本運(yùn)算有限次執(zhí)行來實(shí)現(xiàn)。4
輸入:有0個(gè)或多個(gè)輸入;
輸出:有一個(gè)或多個(gè)輸出;getsum(intnum)
{ inti,sum=0;
for(i=1;i<=num;i++)
sum+=i;
} 算法的五個(gè)重要的特性:
無輸出的算法沒有任何意義!5
確定性:算法中每一條指令必須有確切的含義,讀者理解時(shí)不會(huì)產(chǎn)生二義性。在相同的條件下,算法對(duì)于相同的輸入只能得出相同的輸出。下面代碼有何問題?floataverage(int*a,intnum) /*num為數(shù)組a元素個(gè)數(shù)*/{ inti; doublesum=0;
for(i=0;i<=num;i++)
sum+=*(++a);
returnsum/num;
}main(){ intscore[9]={1,2,3,4,5,6,7,8,9};
printf("%f",average(score,9));}6考慮下列兩段描述:(1)描述一
voidexam1() { n=2; while(n%2==0) n=n+2; printf("%d\n",n); }華中科大考研題
(2)描述二
voidexam2() { y=0; x=5/y; printf(“%d,%d\n”,x,y); }
這兩段描述是否滿足算法的特征,若不滿足試問它們違反了哪些特征?7解:(1)算法是一個(gè)死循環(huán),違反了算法的有窮性特征。(2)算法包含除零錯(cuò)誤,違反了算法的可行性特征。8算法的描述編寫算法時(shí),可采用自然語(yǔ)言、流程圖、計(jì)算機(jī)語(yǔ)言描述。歐幾里德算法mnr例:歐幾里德算法——輾轉(zhuǎn)相除法求兩個(gè)自然數(shù)m
和n
的最大公約數(shù)9①輸入m
和n;②求m除以n的余數(shù)r;③若r等于0,則n為最大公約數(shù),算法結(jié)束;否則執(zhí)行第④步;④將n的值放在m中,將r的值放在n中;⑤重新執(zhí)行第②步。例:歐幾里德算法自然語(yǔ)言算法的描述方法——自然語(yǔ)言
10算法的描述方法——自然語(yǔ)言
優(yōu)點(diǎn):容易理解缺點(diǎn):冗長(zhǎng)、二義性、不易轉(zhuǎn)成程序11N開始輸入m和n
r=m%nr=0m=n;n=r輸出n結(jié)束Y例:歐幾里德算法算法的描述方法——流程圖
優(yōu)點(diǎn):流程直觀缺點(diǎn):缺少嚴(yán)密性、靈活性使用方法:描述簡(jiǎn)單算法注意事項(xiàng):注意抽象層次12intCommonFactor(intm,intn){intr=m%n;while(r!=0){m=n;n=r;r=m%n;}returnn;}程序設(shè)計(jì)語(yǔ)言例:歐幾里德算法算法的描述方法——程序設(shè)計(jì)語(yǔ)言(偽代碼)1314偽代碼(Pseudocode):介于自然語(yǔ)言和程序設(shè)計(jì)語(yǔ)言之間的方法,它采用某一程序設(shè)計(jì)語(yǔ)言的基本語(yǔ)法,操作指令可以結(jié)合自然語(yǔ)言來設(shè)計(jì)。優(yōu)點(diǎn):表達(dá)能力強(qiáng),抽象性強(qiáng),容易理解算法的描述方法——偽代碼
15(1)正確性(Correctness)
無語(yǔ)法錯(cuò)誤
無邏輯錯(cuò)誤算法設(shè)計(jì)的要求:(2)可讀性(Readability)
晦澀難懂的程序易隱藏錯(cuò)誤難以調(diào)試維護(hù)16(3)健壯性(Robustness)
輸入數(shù)據(jù)非法時(shí),不會(huì)產(chǎn)生莫名其妙的錯(cuò)誤。算法設(shè)計(jì)的要求:(4)效率與低存儲(chǔ)的要求17算法設(shè)計(jì)的目標(biāo)正確性可使用性(用戶友好性)可讀性健壯性(很好的容錯(cuò)性)高效率與低存儲(chǔ)量需求18算法設(shè)計(jì)的步驟:?jiǎn)栴}描述模型的選擇
算法設(shè)計(jì)和正確性證明
算法的程序?qū)崿F(xiàn)
算法分析19算法一算法二在三個(gè)整數(shù)中求最大者max(inta,intb,intc)
{if(a>b)
if(a>c)returna;
elsereturnc;
else
if(b>c)returnb;
elsereturnc;
}/*無需額外存儲(chǔ)空間,只需兩次比較*/max(inta[3])
{intc,inti;
c=a[0];
for(i=1;i<3;i++)
if(a[i]>c)c=a[i];
returnc;
}
/*需要兩個(gè)額外的存儲(chǔ)空間,兩次比較,至少一次賦值*/
/*共需5個(gè)整型數(shù)空間*/求100個(gè)整數(shù)中最大者同上的算法難寫,難讀max(inta[100])
{intc,inti;
c=a[0];
for(i=1;i<100;i++)
if(a[i]>c)c=a[i];
returnc;
}
/*共需102個(gè)整型數(shù)空間*/效率與存儲(chǔ)量分析20算法分析(AlgorithmAnalysis):對(duì)算法所需要的計(jì)算機(jī)資源——時(shí)間和空間進(jìn)行估算。時(shí)間復(fù)雜性(TimeComplexity)空間復(fù)雜性(SpaceComplexity)算法分析21同一問題可以采用多種算法實(shí)現(xiàn)。如何比較算法執(zhí)行效率?
算法選用的策略問題的規(guī)模:求解的輸入量采用的程序語(yǔ)言編譯程序的好壞機(jī)器執(zhí)行速度
因此,使用絕對(duì)時(shí)間單位衡量算法的效率不合適22問題規(guī)模:輸入量的多少基本語(yǔ)句(程序步):被視為算法基本運(yùn)算的一般是最深層循環(huán)內(nèi)的語(yǔ)句。for(i=1;i<=n;i++)for(j=1;j<=n;j++)x++;問題規(guī)模:n基本語(yǔ)句:x++算法分析23
在一個(gè)算法中,進(jìn)行基本運(yùn)算的次數(shù)越少,其運(yùn)行時(shí)間也就相對(duì)地越少;基本運(yùn)算次數(shù)越多,其運(yùn)行時(shí)間也就相對(duì)地越多。所以,通常把算法中包含基本運(yùn)算次數(shù)的多少稱為算法的時(shí)間復(fù)雜度,也就是說,一個(gè)算法的時(shí)間復(fù)雜度是指該算法的基本運(yùn)算次數(shù)。
算法中基本運(yùn)算次數(shù)T(n)是問題規(guī)模n的某個(gè)函數(shù)f(n),記作:
T(n)=O(f(n))24定理:若A(n)=amnm+am-1nm-1++a1n+a0是一個(gè)m次多項(xiàng)式,則A(n)=O(nm)。說明:在計(jì)算算法時(shí)間復(fù)雜度時(shí),可以忽略所有低次冪和最高次冪的系數(shù)。算法分析算法分析——大O符號(hào)25算法的時(shí)間復(fù)雜度一個(gè)沒有循環(huán)的算法的基本運(yùn)算次數(shù)與問題規(guī)模無關(guān):
O(1)常數(shù)階一個(gè)只有一重循環(huán)的算法的基本運(yùn)算次數(shù)與問題規(guī)模呈線性增大關(guān)系:
O(n)線性階26算法的時(shí)間復(fù)雜度O(1)<O(log2(n))<O(n)<(n2)<O(n3)<O(2n)27
例:
求兩個(gè)n階方陣的相加C=A+B的算法如下,分析其時(shí)間復(fù)雜度。
#defineMAX20/*定義最大的方階*/voidmatrixadd(intn,intA[MAX][MAX],intB[MAX][MAX],intC[MAX][MAX]){ inti,j; for(i=0;i<n;i++) for(j=0;j<n;j++) C[i][j]=A[i][j]+B[i][j];}28
該算法中的基本運(yùn)算是兩重循環(huán)中最深層的語(yǔ)句C[i][j]=A[i][j]+B[i][j],分析它的頻度,即:
T(n)==O(n2)29例:分析以下算法的時(shí)間復(fù)雜度。
intfun(intn){inti,j,k,s;s=0;for(i=0;i<=n;i++)for(j=0;j<=i;j++) for(k=0;k<=j;k++)s++;return(s);}基本語(yǔ)句或基本操作30
解:該算法的基本操作是語(yǔ)句s++,其頻度:
T(n)==O(n3)則該算法的時(shí)間復(fù)雜度為O(n3)。31最好情況:出現(xiàn)概率較大時(shí)分析最差情況:實(shí)時(shí)系統(tǒng)平均情況:已知輸入數(shù)據(jù)是如何分布的,通常假設(shè)等概率分布結(jié)論:如果問題規(guī)模相同,時(shí)間代價(jià)與輸入數(shù)據(jù)有關(guān),則需要分析最好情況、最壞情況、平均情況。1.4算法及算法分析最好情況、最壞情況、平均情況32Voidbubble_sort(inta[],intn){//起泡排序:將a中整數(shù)序列按照升序重新排列For(i=n-1,change=TRUE;i>=1&&change;--i){ change=FALSE; for(j=0;j<i;j++) if(a[j]>a[j+1]) {a[j]a[i+1];change=TRUE} }}33分析:輸入集合升序:基本操作次數(shù)為0輸入集合逆序:操作次數(shù)為:n(n-1)/2T(n)==4·=O(n2)34分析下面語(yǔ)句的時(shí)間復(fù)雜度:i=1; while(i<=n) i=i*2;分析:35設(shè)語(yǔ)句i=i*2的語(yǔ)句頻度為f(n),則有2f(n)<=n,即f(n)<=log2n,所以該程序段的時(shí)間復(fù)雜度T(n)=O(log2n)。分析下面語(yǔ)句的執(zhí)行次數(shù):i=0;s=0;n=100;do i=i+1; s=s+10*iwhile(NOT((i<n)AND(s<n)));分析:36該程序段中,循環(huán)語(yǔ)句的執(zhí)行次數(shù)為4(這時(shí)i=4,s=100),do循環(huán)中先執(zhí)行循環(huán)體,后判斷條件,直到條件為真時(shí)退出循環(huán)。算法空間復(fù)雜度度量一個(gè)算法一般占用三部分存貯空間算法本身占用輸入、輸出數(shù)據(jù)占用:算法運(yùn)行中臨時(shí)占用空間(可變部分)算法的空間性能以一個(gè)算法運(yùn)行過程中臨時(shí)占用的存儲(chǔ)空間作為度量標(biāo)準(zhǔn)——算法空間復(fù)雜度,記作S(n)=O(f(n))時(shí)間和空間相互之間有一種制約關(guān)系,何者為重需視具體情況而定。37算法空間復(fù)雜度度量若額外空間相對(duì)于輸入數(shù)據(jù)量來說是常數(shù),則稱此算法為原地工作。3839基本操作的實(shí)現(xiàn):
本書約定:常量的定義:
#defineTRUE1#defineFALSE0#defineOK1#defineERROR0#defineOVERFL
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年幼兒園食品安全管理協(xié)議書
- 合作投資合同書示例
- 廣州市勞動(dòng)合同范本參考
- 2024燈飾采購(gòu)合同范文
- 安徽省淮南市七年級(jí)上學(xué)期語(yǔ)文期中試題3套【附答案】
- 提升機(jī)租賃合同樣式
- 2024抵押貸款合同協(xié)議書樣式
- 6.2 共筑生命家園(導(dǎo)學(xué)案) 2024-2025學(xué)年統(tǒng)編版道德與法治九年級(jí)上冊(cè)
- 購(gòu)房合同協(xié)議書范本
- 倉(cāng)庫(kù)租賃合同樣本
- 有色金屬熔煉與鑄錠課件
- 阻生牙拔除的護(hù)理
- 安徽省蕪湖市七年級(jí)上學(xué)期語(yǔ)文期中試卷(含答案)
- 兩癌知識(shí)科普課件
- 食用菌現(xiàn)代高效農(nóng)業(yè)示范園區(qū)建設(shè)項(xiàng)目建議書
- 東營(yíng)港加油、LNG加氣站工程環(huán)評(píng)報(bào)告表
- 2024年日歷(打印版每月一張)
- 車用動(dòng)力電池回收利用 管理規(guī)范 第2部分:回收服務(wù)網(wǎng)點(diǎn)征求意見稿編制說明
- 新劍橋少兒英語(yǔ)第六冊(cè)全冊(cè)配套文本
- 科學(xué)預(yù)測(cè)方案
- 職業(yè)生涯規(guī)劃網(wǎng)絡(luò)與新媒體專業(yè)
評(píng)論
0/150
提交評(píng)論