




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
斐波那契數(shù)列算法分析算法分析背景:假定你有一雄一雌一對(duì)剛出生的兔子,它們?cè)陂L(zhǎng)到一個(gè)月大小時(shí)開(kāi)始交配,在第二月結(jié)束時(shí),雌兔子產(chǎn)下另一對(duì)兔子,過(guò)了一個(gè)月后它們也開(kāi)始繁殖,如此這般持續(xù)下去。每只雌兔在開(kāi)始繁殖時(shí)每月都產(chǎn)下一對(duì)兔子,假定沒(méi)有兔子死亡,在一年后總共會(huì)有多少對(duì)兔子?在一月底,最初的一對(duì)兔子交配,但是還只有1對(duì)兔子;在二月底,雌兔產(chǎn)下一對(duì)兔子,共有2對(duì)兔子;在三月底,最老的雌兔產(chǎn)下第二對(duì)兔子,共有3對(duì)兔子;在四月底,最老的雌兔產(chǎn)下第三對(duì)兔子,兩個(gè)月前生的雌兔產(chǎn)下一對(duì)兔子,共有5對(duì)兔子;……如此這般計(jì)算下去,兔從第3個(gè)數(shù)目開(kāi)始,每個(gè)數(shù)目都是前面兩個(gè)數(shù)目之和。這就是著名的斐波那契(Fibonacci)數(shù)列。1,有一段樓梯有10級(jí)臺(tái)階,規(guī)定每一步只能跨一級(jí)或兩級(jí),要登上第級(jí)臺(tái)階有幾種不同的走法答:這就是一個(gè)斐波那契數(shù)列:登上第一級(jí)臺(tái)階有一種登法;登上兩級(jí)臺(tái)階,有兩種登法;登上三級(jí)臺(tái)階,有三種登法;登上四級(jí)臺(tái)階,有五種方法……所以,1,2,3,5,8,13……登上十級(jí),有89種。所謂的黃金分割點(diǎn),也是代表大自然的和諧的一個(gè)數(shù)字。F(n)=F(n-1)+F(n-2)F(1)=1F(2)=1Fibonacci數(shù)列可以用很直觀的二叉遞歸程序來(lái)寫(xiě),用C++語(yǔ)言的描longfib1(intn){if(n<=2){return1;}lse{returnfib1(n-1)+fib1(n-2);}}看上去程序的遞歸使用很恰當(dāng),可是在用VC2005的環(huán)境下測(cè)試n=37的時(shí)候用了大約3s,而n=45的時(shí)候基本下樓打完飯也看不到結(jié)果……顯然這種遞歸的效率太低了??!例如,用下面一個(gè)測(cè)試函數(shù):longfib1(intn,int*arr){arr[n]++;if(n<=2){return1;}lse{returnfib1(n-1,arr)+fib1(n-2,arr);}}fibi被計(jì)算的次數(shù):fib(10)=1fib(9)=1fib(8)=2fib(7)=3fib(6)=5fib(5)=8fib(4)=13fib(3)=21fib(2)=34fib(1)=55fib(0)=34可見(jiàn),計(jì)算次數(shù)呈反向的Fibonacci數(shù)列,這顯然造成了大量重復(fù)計(jì)我們令T(N)為函數(shù)fib(n)的運(yùn)行時(shí)間,當(dāng)N>=2的時(shí)候我們分析可T(N)=T(N-1)+T(N-2)+2而fib(n)=fib(n-1)+fib(n-2),所以有T(N)>=fib(n),歸納法證明fib(N)<(5/3)^N顯然這個(gè)O((3/2)^N)是以指數(shù)增長(zhǎng)的算法,基本上是最壞的情況。其實(shí),這違反了遞歸的一個(gè)規(guī)則:合成效益法則。合成效益法則(Compoundinterestrul:在求解一個(gè)問(wèn)題的同一實(shí)例的時(shí)候,切勿在不同的遞歸調(diào)用中做重復(fù)性的工作。所以在上面的代碼中調(diào)用fib(N-1)的時(shí)候?qū)嶋H上同時(shí)計(jì)算了fib(N-2)。這種小的重復(fù)計(jì)算在遞歸過(guò)程中就會(huì)產(chǎn)生巨大的運(yùn)行時(shí)間。用一叉遞歸程序就可以得到近似線性的效率,用C++語(yǔ)言的描述如longfib(intn,longa,longb,intcount){if(count==n)returnb;returnfib(n,b,a+b,++count);}longfib2(intn){returnfib(n,0,1,1);}這種方法雖然是遞歸了,但是并不直觀,而且效率上相比下面的迭代循環(huán)并沒(méi)有優(yōu)勢(shì)。Fibonacci數(shù)列用迭代程序來(lái)寫(xiě)也很容易,用C++語(yǔ)言的描述如下://也可以用數(shù)組將每次計(jì)算的f(n)存儲(chǔ)下來(lái),用來(lái)下次計(jì)算用(空l(shuí)ongfib3(intn){longx=0,y=1;for(intj=1;j<n;j++){y=x+y;x=y-x;}returny;}Fibonacci[0]=0,F(xiàn)ibonacci[1]=1Fibonacci[n]=Fibonacci[n-1]+Fibonacci[n-2](n>=2)可以將它寫(xiě)成矩陣乘法形式:將右邊連續(xù)的展開(kāi)就得到:C碼如下:classMatrix{public:longmatr[2][2];Matrix(constMatrix&rhs);Matrix(longa,longb,longc,longd);Matrix&operator=(constMatrix&);friendMatrixoperator*(constMatrix&lhs,constMatrix&rhs){Matrixret(0,0,0,0);ret.matr[0][0]=lhs.matr[0][0]*rhs.matr[0][0]+lhs.matr[0][1]*rhs.matr[1][0];ret.matr[0][1]=lhs.matr[0][0]*rhs.matr[0][1]+lhs.matr[0][1]*rhs.matr[1][1];ret.matr[1][0]=lhs.matr[1][0]*rhs.matr[0][0]+lhs.matr[1][1]*rhs.matr[1][0];ret.matr[1][1]=lhs.matr[1][0]*rhs.matr[0][1]+lhs.matr[1][1]*rhs.matr[1][1];returnret;}Matrix::Matrix(longa,longb,longc,longd){this->matr[0][0]=a;this->matr[0][1]=b;this->matr[1][0]=c;this->matr[1][1]=d;}Matrix::Matrix(constMatrix&rhs){this->matr[0][0]=rhs.matr[0][0];this->matr[0][1]=rhs.matr[0][1];this->matr[1][0]=rhs.matr[1][0];this->matr[1][1]=rhs.matr[1][1];}Matrix&Matrix::operator=(constMatrix&rhs){this->matr[0][0]=rhs.matr[0][0];this->matr[0][1]=rhs.matr[0][1];this->matr[1][0]=rhs.matr[1][0];this->matr[1][1]=rhs.matr[1][1];}Matrixpower(constMatrix&m,intn){ifn)returnm;if(n%2==0)returnpower(m*m,n/2);returnpower(m*m,n/2)*m;}longfib4(intn){Matrixmatrix0(1,1,1,0);matrix0=power(matrix0,n-1);returnmatrix0.matr[0][0];}longfib5(intn){doublez=sqrt(5.0);doublex=(1+z)/2;doubley=(1-z)/2;return(pow(x,n)-pow(y,n))/z+0.5;}這個(gè)與數(shù)學(xué)庫(kù)實(shí)現(xiàn)開(kāi)方和乘方本身效率有關(guān)的,我想應(yīng)該還是在O(log(n))的效率。解斐波那契數(shù)列的方法,用測(cè)試程序主函數(shù)如下:intmain(){cout<<fib1(45)<<endl;cout<<fib2(45)<<endl;cout<<fib3(45)<<endl;cout<<fib4(45)<<endl;cout<<fib5(45)<<endl;return0;}函數(shù)fib1會(huì)等待好久,其它的都能很快得出結(jié)果,并且相同為:。而后面兩種只有在的時(shí)候會(huì)顯示出優(yōu)勢(shì)。由于我的程序都沒(méi)有涉及到高精度,所以要是求大數(shù)據(jù)的話,可以通過(guò)取模來(lái)獲得結(jié)果的后4位來(lái)測(cè)試效率與正確性。另外斐波那契數(shù)列在實(shí)際工作中應(yīng)該用的很少,尤其是當(dāng)數(shù)據(jù)n很大的時(shí)候(例如:),所以綜合考慮基本普通的非遞歸O(n)方法就很好了,沒(méi)有必要用矩陣乘法。1、N皇后問(wèn)題算法設(shè)計(jì)ALGORITHMprocedurePLACE(k)globalX(1:k);integeri,kwhilei<kdoifX(i)=X(k)//在同一列有兩個(gè)皇后//orABS(X(i)-X(k))=ABS(i-k)//在同——條斜角線上//thenreturn(false)endifi←i+1repeatreturn(true)//滿(mǎn)足約束//endPLACEprocedureNQUEENS(n)nnn相攻擊的所有可能位置//Whilek>0do//對(duì)所有的行執(zhí)行以下語(yǔ)句//{X(k)←X(k)+1//移到下一列//otPLACEkdo{X(k)←X(k)十l;}//如果第k個(gè)皇后的列X(k)不合理,就看下一列//ifX(k)≤n//找到一個(gè)位置//thenifk=n//是一個(gè)完整的解嗎//thenprint(X)//是,打印這個(gè)數(shù)組//else{k←k+1;X(k)←0;}endif//擴(kuò)展,搜索下一個(gè)皇后//elsek←k-1//回溯//endif}endNQUEENSProgram:#include<stdio.h>#include<math.h>intkaj1,flag,n,c=0;//k為解的個(gè)數(shù),n為皇后的個(gè)數(shù),flag標(biāo)記有沒(méi)有放置皇后voidlycQueen(){//遞歸求解函數(shù)for(h=1;h<=n;h++){a[j]=h;后在同一行或者同一對(duì)角線上,沖突elseflag=1;//沒(méi)沖突,放置一個(gè)皇后}//forif(flag==0&&a[j]!=n)continue;//沒(méi)試探完,繼續(xù)試探ifflagj=n){//放置完n個(gè)皇后,得到一個(gè)解k=k+1;c=1;//解的個(gè)數(shù)加1for(i=1;i<=n;i++)printf("%d",a[i]);//輸出第i個(gè)皇后放置的行號(hào)printf("\n");if(a[j]==n)flag=0;if(flag==1
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 牛津譯林版七年級(jí)英語(yǔ)上冊(cè)教學(xué)計(jì)劃(含進(jìn)度表)
- 2025年黨章黨史國(guó)史國(guó)情知識(shí)競(jìng)賽題庫(kù)及答案(共220題)
- 新型家庭醫(yī)生簽約服務(wù)對(duì)促進(jìn)轄區(qū)孕產(chǎn)婦管理的效果分析
- 《單片機(jī)技術(shù)應(yīng)用》 課件
- 節(jié)能環(huán)保居間服務(wù)合同范例
- 道路交通規(guī)劃方案介紹
- 低空經(jīng)濟(jì)行業(yè)報(bào)告
- 醫(yī)院裝修大包合同參考范本
- 投資可行性分析報(bào)告包括哪些內(nèi)容
- 低空經(jīng)濟(jì)涉及的行業(yè)
- RB/T 223-2023國(guó)產(chǎn)化檢測(cè)儀器設(shè)備驗(yàn)證評(píng)價(jià)指南氣相色譜儀
- DB3417-T 031-2024 學(xué)校食堂場(chǎng)所布局設(shè)置規(guī)范
- FANUC機(jī)器人培訓(xùn)教程(完成版)
- 奔馳車(chē)輛改裝合同協(xié)議書(shū)
- 陽(yáng)光心理-健康人生小學(xué)生心理健康主題班會(huì)課件
- 2024年全國(guó)職業(yè)院校技能大賽高職組(檢驗(yàn)檢疫技術(shù)賽項(xiàng))考試題庫(kù)(含答案)
- 人員轉(zhuǎn)正考核表
- 人教版三年級(jí)下冊(cè)勞動(dòng)教育《清潔教室衛(wèi)生》
- DL∕T 802.8-2014 電力電纜用導(dǎo)管技術(shù)條件 第8部分:埋地用改性聚丙烯塑料單壁波紋電纜導(dǎo)管
- 新教材人教A版高中數(shù)學(xué)必修第二冊(cè)全冊(cè)-教學(xué)課件()
- 反賄賂與反腐敗管理制度
評(píng)論
0/150
提交評(píng)論