已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
.斐波那契數(shù)列算法分析背景:假定你有一雄一雌一對剛出生的兔子,它們在長到一個(gè)月大小時(shí)開始交配,在第二月結(jié)束時(shí),雌兔子產(chǎn)下另一對兔子,過了一個(gè)月后它們也開始繁殖,如此這般持續(xù)下去。每只雌兔在開始繁殖時(shí)每月都產(chǎn)下一對兔子,假定沒有兔子死亡,在一年后總共會有多少對兔子?在一月底,最初的一對兔子交配,但是還只有1對兔子;在二月底,雌兔產(chǎn)下一對兔子,共有2對兔子;在三月底,最老的雌兔產(chǎn)下第二對兔子,共有3對兔子;在四月底,最老的雌兔產(chǎn)下第三對兔子,兩個(gè)月前生的雌兔產(chǎn)下一對兔子,共有5對兔子;如此這般計(jì)算下去,兔子對數(shù)分別是:1, 1, 2, 3, 5, 8, 13, 21, 34, 55,89, 144, .看出規(guī)律了嗎?從第3個(gè)數(shù)目開始,每個(gè)數(shù)目都是前面兩個(gè)數(shù)目之和。這就是著名的斐波那契(Fibonacci)數(shù)列。有趣問題:1,有一段樓梯有10級臺階,規(guī)定每一步只能跨一級或兩級,要登上第10級臺階有幾種不同的走法?答:這就是一個(gè)斐波那契數(shù)列:登上第一級臺階有一種登法;登上兩級臺階,有兩種登法;登上三級臺階,有三種登法;登上四級臺階,有五種方法所以,1,2,3,5,8,13登上十級,有89種。2,數(shù)列中相鄰兩項(xiàng)的前項(xiàng)比后項(xiàng)的極限是多少,就是問,當(dāng)n趨于無窮大時(shí),F(xiàn)(n)/F(n+1)的極限是多少?答:這個(gè)可由它的通項(xiàng)公式直接得到,極限是(-1+5)/2,這個(gè)就是所謂的黃金分割點(diǎn),也是代表大自然的和諧的一個(gè)數(shù)字。數(shù)學(xué)表示:Fibonacci數(shù)列的數(shù)學(xué)表達(dá)式就是:F(n) = F(n-1) + F(n-2)F(1) = 1F(2) = 1遞歸程序1:Fibonacci數(shù)列可以用很直觀的二叉遞歸程序來寫,用C+語言的描述如下:long fib1(int n)if (n = 2)return 1;elsereturn fib1(n-1) + fib1(n-2);看上去程序的遞歸使用很恰當(dāng),可是在用VC2005的環(huán)境下測試n=37的時(shí)候用了大約3s,而n=45的時(shí)候基本下樓打完飯也看不到結(jié)果顯然這種遞歸的效率太低了!遞歸效率分析:例如,用下面一個(gè)測試函數(shù):long fib1(int n, int* arr)arrn+;if (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) 4時(shí),fib(N)= (3/2)N標(biāo)準(zhǔn)寫法:顯然這個(gè)O((3/2)N) 是以指數(shù)增長的算法,基本上是最壞的情況。其實(shí),這違反了遞歸的一個(gè)規(guī)則:合成效益法則。合成效益法則(Compound interest rule):在求解一個(gè)問題的同一實(shí)例的時(shí)候,切勿在不同的遞歸調(diào)用中做重復(fù)性的工作。所以在上面的代碼中調(diào)用fib(N-1)的時(shí)候?qū)嶋H上同時(shí)計(jì)算了fib(N-2)。這種小的重復(fù)計(jì)算在遞歸過程中就會產(chǎn)生巨大的運(yùn)行時(shí)間。遞歸程序2:用一叉遞歸程序就可以得到近似線性的效率,用C+語言的描述如下:long fib(int n, long a, long b, int count)if (count = n)return b;return fib(n, b, a+b, +count);long fib2(int n)return fib(n, 0, 1, 1);這種方法雖然是遞歸了,但是并不直觀,而且效率上相比下面的迭代循環(huán)并沒有優(yōu)勢。迭代解法:Fibonacci數(shù)列用迭代程序來寫也很容易,用C+語言的描述如下:/也可以用數(shù)組將每次計(jì)算的f(n)存儲下來,用來下次計(jì)算用(空間換時(shí)間)long fib3 (int n)long x = 0, y = 1;for (int j = 1; j n; j+)y = x + y;x = y - x;return y;這時(shí)程序的效率顯然為O(N),N = 45的時(shí)候= 2)可以將它寫成矩陣乘法形式:將右邊連續(xù)的展開就得到:下面就是要用O(log(n)的算法計(jì)算:顯然用二分法來求,結(jié)合一些面向?qū)ο蟮母拍?,C+代碼如下:class Matrixpublic:long matr22;Matrix(const Matrix&rhs);Matrix(long a, long b, long c, long d);Matrix& operator=(const Matrix&);friend Matrix operator*(const Matrix& lhs, const Matrix& rhs)Matrix ret(0,0,0,0);ret.matr00 = lhs.matr00*rhs.matr00 + lhs.matr01*rhs.matr10;ret.matr01 = lhs.matr00*rhs.matr01 + lhs.matr01*rhs.matr11;ret.matr10 = lhs.matr10*rhs.matr00 + lhs.matr11*rhs.matr10;ret.matr11 = lhs.matr10*rhs.matr01 + lhs.matr11*rhs.matr11;return ret;Matrix:Matrix(long a, long b, long c, long d)this-matr00 = a;this-matr01 = b;this-matr10 = c;this-matr11 = d;Matrix:Matrix(const Matrix &rhs)this-matr00 = rhs.matr00;this-matr01 = rhs.matr01;this-matr10 = rhs.matr10;this-matr11 = rhs.matr11;Matrix& Matrix:operator =(const Matrix &rhs)this-matr00 = rhs.matr00;this-matr01 = rhs.matr01;this-matr10 = rhs.matr10;this-matr11 = rhs.matr11;return *this;Matrix power(const Matrix& m, int n)if (n = 1)return m;if (n%2 = 0)return power(m*m, n/2);elsereturn power(m*m, n/2) * m;long fib4 (int n)Matrix matrix0(1, 1, 1, 0);matrix0 = power(matrix0, n-1);return matrix0.matr00;這時(shí)程序的效率為O(log(N)) 。公式解法:在O(1)的時(shí)間就能求得到F(n)了: 注意:其中x表示取距離x最近的整數(shù)。用C+寫的代碼如下:long fib5(int n)double z = sqrt(5.0);double x = (1 + z)/2;double y = (1 - z)/2;return (pow(x, n) - pow(y, n)/z + 0.5; 這個(gè)與數(shù)學(xué)庫實(shí)現(xiàn)開方和乘方本身效率有關(guān)的,我想應(yīng)該還是在O(log(n)的效率??偨Y(jié):上面給出了5中求解斐波那契數(shù)列的方法,用測試程序主函數(shù)如下:int main()cout fib1(45) endl;cout fib2(45) endl;cout fib3(45) endl;cout fib4(45) endl;cout fib5(45) endl;return 0; 函數(shù)fib1會等待好久,其它的都能很快得出結(jié)果,并且相同為:1134903170。而后面兩種只有在n = 1000000000的時(shí)候會顯示出優(yōu)勢。由于我的程序都沒有涉及到高精度,所以要是求大數(shù)據(jù)的話,可以通過取模來獲得結(jié)果的后4位來測試效率與正確性。另外斐波那契數(shù)列在實(shí)際工作中應(yīng)該用的很少,尤其是當(dāng)數(shù)據(jù)n很大的時(shí)候(例如:1000000000),所以綜合考慮基本普通的非遞歸O(n)方法就很好了,沒有必要用矩陣乘法。1、 N皇后問題算法設(shè)計(jì) ALGORITHMprocedure PLACE(k) /如果一個(gè)皇后能放在第k行的X(k)列,則返 回true;否則返回false。X是一個(gè)全程數(shù) 組,進(jìn)入此過程時(shí)已置了k個(gè)值。/ global X(1:k); integer i,k i1 while i0 do /對所有的行執(zhí)行以下語句/ X(k)X(k)+1 /移到下一列/ While X(k)n and not PLACE(k) do X(k)X(k)十l; / 如果第k個(gè)皇后的列X(k)不合理,就看下一列/ if X(k)n /找到一個(gè)位置/ then if k=n /是一個(gè)完整的解嗎/ then print(X) /是,打印這個(gè)數(shù)組/ else kk+1;X(k)0; endif /擴(kuò)展,搜索下一個(gè)皇后/ else kk1 /回溯/ endif end NQUEENSProgram : #include #include int k=0,a20,j=1,flag,n,c=0;/k為解的個(gè)數(shù),n為皇后的個(gè)數(shù),flag標(biāo)記有沒有放置皇后 void lycQueen()/遞歸求解函數(shù) int i,h;/i為行號,h為列號 for(h=1;h=n;h+) aj=h; for(i=1;ij;i+)/將第j個(gè)皇后的位置依次跟前面j-1個(gè)皇后比較 if(ai=aj|abs(aj-ai)=abs(j-i) flag=0;break;/兩個(gè)皇后在同一行或者同一對角線上,沖突 else flag=1;/沒沖突,放置一個(gè)皇后 /for if(flag=0&aj!=n) continue;/沒試探完,繼續(xù)試探 if(flag=1&j=n)/放置完n個(gè)皇后,得到一個(gè)解 k=k+1;c=1;/解的個(gè)數(shù)加1 for(i=1;i=n;i+) printf(%d ,ai);/輸出第i個(gè)皇后放置的行號 printf(n); if(aj = n) flag = 0; /if if(flag=1&j!=n)j+;lycQueen();/遞歸
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024預(yù)制板購銷合同
- 2025年度瓷磚研發(fā)中心實(shí)驗(yàn)室建設(shè)與運(yùn)營合同3篇
- 2025年度危險(xiǎn)化學(xué)品儲存安全管理承包合同4篇
- 2025年度智能物流中心建設(shè)與運(yùn)營管理合同4篇
- 2025年度商業(yè)地產(chǎn)租賃代理服務(wù)合同模板4篇
- 2024物業(yè)項(xiàng)目策劃2024委托代理合同
- 2025年度醫(yī)療器械代生產(chǎn)加工合同范本4篇
- 2025年度特殊用途車牌租賃與押金管理協(xié)議4篇
- 2025年度展會現(xiàn)場安保及應(yīng)急預(yù)案服務(wù)合同3篇
- 2024鐵路鋼軌鋪設(shè)及維護(hù)工程協(xié)議細(xì)則
- 勞動合同續(xù)簽意見單
- 大學(xué)生國家安全教育意義
- 2024年保育員(初級)培訓(xùn)計(jì)劃和教學(xué)大綱-(目錄版)
- 河北省石家莊市2023-2024學(xué)年高二上學(xué)期期末考試 語文 Word版含答案
- 企業(yè)正確認(rèn)識和運(yùn)用矩陣式管理
- 分布式光伏高處作業(yè)專項(xiàng)施工方案
- 陳閱增普通生物學(xué)全部課件
- 檢驗(yàn)科主任就職演講稿范文
- 人防工程主體監(jiān)理質(zhì)量評估報(bào)告
- 20225GRedCap通信技術(shù)白皮書
- 燃?xì)庥邢薰究蛻舴?wù)規(guī)范制度
評論
0/150
提交評論