算法設計與分析實驗報告(中南民族大學)_第1頁
算法設計與分析實驗報告(中南民族大學)_第2頁
算法設計與分析實驗報告(中南民族大學)_第3頁
算法設計與分析實驗報告(中南民族大學)_第4頁
算法設計與分析實驗報告(中南民族大學)_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

.. .. ..院 系: 計算機科學學院專 業(yè):專業(yè).專注 ... .. ..年 級:課程名稱:算法設計與分析基礎班 號:組 號:指導教師:年 月 日學號 姓名組員算法分析基礎實驗名稱 ——給定一個非負整數(shù) n,計算第 n 實驗室個Fibonacci 數(shù)專業(yè).專注 ... .. ..一.實驗目的1)理解遞歸算法和迭代算法的設計思想以及遞歸程序的調(diào)式技術2)握并應用遞歸算法和迭代算法效率的理論分析 (前驗分析)和經(jīng)驗分析(后驗分析)方法;理解這樣一個觀點:不同的算法可以解決相同的問題,這些算法的解題思路不同,復雜程度不同,效率也不同;二.實驗要求1)使用教材2.5節(jié)中介紹的迭代算法 Fib(n),找出最大的 n,使得第n個Fibonacci 數(shù)不超過實計算機所能表示的最大整數(shù) ,并給出具體的執(zhí)行時間 ;驗2)對于要求 1),使用教材 2.5節(jié)中介紹的遞歸算法 F(n)進行計算,同樣給出具體的執(zhí)行時目間,并同1)的執(zhí)行時間進行比較 ;的3)對于輸入同樣的非負整數(shù) n,比較上述兩種算法基本操作的執(zhí)行次數(shù) ;或4)對1)中的迭代算法進行改進 ,使得改進后的迭代算法其空間復雜度為 Θ(1);要5)設計可供用戶選擇算法的交互式菜單 (放在相應的主菜單下 )。求專業(yè).專注 ... .. ..一.迭代算法求最大 Fibonacci 在數(shù)列中位置1.先利用迭代求得計算機能表示的最大數(shù) MaxUnsignedInt.實unsignedlongintMaxUnsignedInt=1;驗while(MaxUnsignedInt*2+1!=MaxUnsignedInt)原{理MaxUnsignedInt=MaxUnsignedInt*2+1;(}算2.從1起進行(n-1) +(n-2) = n迭代,直到條件(temp3>temp) 時發(fā)生溢出(及超過最大法數(shù)),退出循環(huán)。求得此時的迭代次數(shù) -1即為最大 Fibonacci 的位置?;鵸nsignedlongintn=MaxUnsignedInt;本for(i=1;temp<=n;i++)//temp<=n思{想temp=temp1+temp2;)if(temp3>temp)// 當temp3>temp 時,則發(fā)現(xiàn)temp發(fā)生溢出,結束計算break;專業(yè).專注 ... .. ..temp3=temp;temp2=temp1;temp1=temp;}二.遞歸算法1.根據(jù)/ 0 n=0f(n)= 1 n=1\ f(n-1)+f(n-2) n=2進行遞歸調(diào)用求解 。longFF(unsignedinttt)//usedigui{if(tt<=1)returntt;elsereturnFF(tt-1)+FF(tt-2);}三.改進空間復雜度為 Θ(1)。利用公式:F(n)=(1/√5)*{[(1+ √5)/2]^n-[(1-√5)/2]^n}intfib(intn){doublegh5=sqrt((double)5);return(pow((1+gh5),n)-pow((1-gh5),n))/(pow((double)2,n)*gh5);專業(yè).專注 ... .. ..}voidfibo(){unsignedlongintMaxUnsignedInt,n,times,t=100;clock_tstart=clock();程序MaxUnsignedInt=1;代while(MaxUnsignedInt*2+1!=MaxUnsignedInt)碼{MaxUnsignedInt=MaxUnsignedInt*2+1;}cout<<" 時間消耗:"<<clock()-start<<endl;專業(yè).專注 ... .. ..n=MaxUnsignedInt;intchoose;boolend_this=true;while(end_this){cout<<"************************************************************\n";cout<<"1. 輸 入 一 個 你 想 要 判 斷 的 數(shù)\n";cout<<"2. 判 斷 從 0 到 N 的 Fibonacci\n";cout<<"3. 計 算 機 能 判 斷 的 最 大 數(shù)\n";cout<<"4. 用 遞 歸 計 算 你 想 要 判 斷 的 數(shù)\n";cout<<"5. 結 束\n";again: cout<<"youwantdo:";cin>>choose;if(choose!=1&&choose!=2&&choose!=3&&choose!=4)// 輸入菜單檢查{cout<<" 輸入錯誤\n";專業(yè).專注 ... .. ..gotoagain;}switch(choose){case1:{cout<<"inputyournumber:";cin>>t;start=clock();times=F(t);cout<<t<<" 是第"<<times<<" 個Fibonacci 數(shù)"<<endl;cout<<" 時間消耗:"<<clock()-start<<endl;break;}case2:{start=clock();F(t);cout<<" 時間消耗:"<<clock()-start<<endl;break;專業(yè).專注 ... .. ..}case3:{cout<<" 最大數(shù)是"<<n<<endl;times=F(n);start=clock();unsignedlonginttemp=1,temp1=0,temp2=1,temp3=temp;inti;for(i=1;temp<=n;i++)//temp<=n{temp=temp1+temp2;if(temp3>temp)//當temp3>temp時,則發(fā)現(xiàn)temp發(fā)生溢出,結束計算break;temp3=temp;temp2=temp1;temp1=temp;}cout<<n<<" 是第"<<i-1<<" 個Fibonacci 數(shù)"<<endl;cout<<" 時間消耗:"<<clock()-start<<endl;break;專業(yè).專注 ... .. ..}case4:{start=clock();intx;cout<<"Youwantdo:";cin>>x;times=FF(x);cout<<" 第"<<x<<" 個Fibonacci數(shù)是"<<times<<endl;cout<<" 時間消耗:"<<clock()-start<<endl;break;}case5:{end_this=false;break;}}}專業(yè).專注 ... .. ..}intF(unsignedintuu){unsignedlonginttemp=0,temp1=0,temp2=1;inti;//if(uu==0||uu==1)//returnuu;for(i=1;i<=uu;i++){temp =temp1+temp2;cout<<"number"<<i<<"is"<<temp<<endl;if(temp>=uu)returni;temp2=temp1;temp1=temp;}專業(yè).專注 ... .. ..return0;}longFF(unsignedinttt)//usedigui{if(tt<=1)returntt;elsereturnFF(tt-1)+FF(tt-2);}intfib(intn){doublegh5=sqrt((double)5);return(pow((1+gh5),n)-pow((1-gh5),n))/(pow((double)2,n)*gh5);}專業(yè).專注 .實驗結果及分析

.. .. ..1.求最大數(shù)2.遞歸法與迭代法性能比較遞歸 迭代3.改進算法1.利用公式法對第 n項Fibonacci數(shù)求解時可能會得出錯誤結果 。主要原因是由于double 類型的精度還不夠 ,所以程序算出來的結果會有誤差 ,要把公式展開計算 。2.由于遞歸調(diào)用棧是一個費時的過程 ,通過遞歸法和迭代法的比較表明 ,雖然遞歸算法的代碼更精簡更有可讀性 ,但是執(zhí)行速度無法滿足大數(shù)問題的求解 。3.在當前計算機的空間較大的情況下 ,在一些速度較慢的問題中 ,空間換時間是一個比較周全的策略。專業(yè).專注 ... .. ..分治法在數(shù)值問題中的應用實驗名稱 實驗室——矩陣相乘問題專業(yè).專注 .實驗

.. .. ..一.實驗題目設M1和M2是兩個n×n的矩陣,設計算法計算 M1×M2 的乘積。二.實驗目的1)提高應用蠻力法設計算法的技能 ;2)深刻理解并掌握分治法的設計思想 ;3)理解這樣一個觀點 :用蠻力法設計的算法 ,一般來說,經(jīng)過適度的努力后 ,都可以對其進行改進,以提高算法的效率 。三.實驗要求目1)設計并實現(xiàn)用BF方法求解矩陣相乘問題的算法;的2)設計并實現(xiàn)用DAC方法求解矩陣相乘問題的算法;或3)以上兩種算法的輸入既可以手動輸入,也可以自動生成;要4)對上述兩個算法進行時間復雜性分析,并設計實驗程序驗證求 分析結果;5)設計可供用戶選擇算法的交互式菜單 (放在相應的主菜單下 )。專業(yè).專注 ... .. ..定義:若A=(a)B=(b)是n×n的方陣,則對i,j=1,2,?n,定義乘積C=A?B中ij,ij的元素cij為:實驗1.分塊解法原 通常的做法是將矩陣進行分塊相乘 ,如下圖所示:理(算法基專業(yè).專注 ... .. ..本 二.Strassen 解法思 分治法思想想 將問題實例劃分為同一問題的幾個較小的實例 。對這些較小實例求解 ,通常使) 用遞歸方法 ,但在問題規(guī)模足夠小時 ,也會使用另一種算法 。如果有必要,合并這些問題的解,以得到原始問題的解 。求解矩陣相乘的 DAC算法,使用了strassen算法。DAC(A[],B[],n){Ifn=2 使用7次乘法的方法求得解ElseDivide(A)//把A分成4塊Divide(B)//把B分成4塊調(diào)用7次strassen算法求得解的 4塊合并這4塊得到解并返回}偽代碼Serial_StrassenMultiply(A,B,C){專業(yè).專注 ... .. ..T1=A0+A3;T2=B0+B3;StrassenMultiply(T1,T2,M1);T1=A2+A3;StrassenMultiply(T1,B0,M2);T1=(B1-B3);StrassenMultiply(A0,T1,M3);T1=B2-B0;StrassenMultiply(A3,T1,M4);T1=A0+A1;StrassenMultiply(T1,B3,M5);T1=A2–A0;T2=B0+B1;StrassenMultiply(T1,T2,M6);T1=A1–A3;T2=B2+B3;StrassenMultiply(T1,T2,M7);C0=M1+M4-M5+M7C1=M3+M5專業(yè).專注 ... .. ..C2=M2+M4C3=M1-M2+M3+M6}程序代

矩陣相乘問題voidPrintIn(ArrayA,ArrayB){intn=A.n;inti,j;printf("請輸入A數(shù)據(jù):\n");for(i=0;i<n;i++)for(j=0;j<n;j++)cin>>A.a[i*n+j];printf("請輸入B數(shù)據(jù):\n");for(i=0;i<n;i++)for(j=0;j<n;j++)cin>>B.a[i*n+j];}碼voidRandomIn(ArrayA,ArrayB){intn=A.n;srand((unsigned)time(NULL));inti,j;for(i=0;i<n;i++)for(j=0;j<n;j++)A.a[i*n+j]=rand()%10;專業(yè).專注 ... .. ..for(i=0;i<n;i++)for(j=0;j<n;j++)B.a[i*n+j]=rand()%10;}voidPrintOut(ArrayA){intn=A.n;inti,j;for(i=0;i<n;i++){for(j=0;j<n;j++)cout<<A.a[i*n+j]<< '';printf("\n" );}}voiddivide(Arrayd,Arrayd00,Arrayd01,Arrayd10,Arrayd11) /*分割矩陣*/{intn=d00.n;inti,j;for(i=0;i<n;i++){for(j=0;j<n;j++){d00.a[n*i+j]=d.a[2*n*i+j];d01.a[n*i+j]=d.a[2*n*i+n+j];d10.a[n*i+j]=d.a[2*n*n+2*n*i+j];d11.a[n*i+j]=d.a[2*n*n+2*n*i+n+j];}}}Arraymerge(Arrayd00,Arrayd01,Arrayd10,Arrayd11){intn=d00.n;inti,j;Arrayd;d.a=(int*)malloc(sizeof(int)*(4*n*n));for(i=0;i<n;i++){for(j=0;j<n;j++){d.a[2*n*i+j]=d00.a[n*i+j];d.a[2*n*i+n+j]=d01.a[n*i+j];d.a[2*n*n+2*n*i+j]=d10.a[n*i+j];d.a[2*n*n+2*n*i+n+j]=d11.a[n*i+j];}專業(yè).專注 ... .. ..}d.n=2*n;returnd;}Arrayoperator +(ArrayA,ArrayB){intn=A.n;ArrayC;C.a=(int*)malloc(sizeof(int)*(n*n));for(inti=0;i<n*n;i++)C.a[i]=A.a[i]+B.a[i];C.n=A.n;returnC;}Arrayoperator -(ArrayA,ArrayB){intn=A.n;ArrayC;C.a=(int*)malloc(sizeof(int)*(n*n));for(inti=0;i<n*n;i++)C.a[i]=A.a[i]-B.a[i];C.n=A.n;returnC;}Arraystrassen(ArrayA,ArrayB){intn=A.n;ArrayC;C.a=(int*)malloc(sizeof(int)*(n*n));C.n=n;if(n==2){intm1,m2,m3,m4,m5,m6,m7;m1=(A.a[0]+A.a[3])*(B.a[0]+B.a[3]);m2=(A.a[2]+A.a[3])*B.a[0];m3=A.a[0]*(B.a[1]-B.a[3]);m4=A.a[3]*(B.a[2]-B.a[0]);m5=(A.a[0]+A.a[1])*B.a[3];m6=(A.a[2]-A.a[0])*(B.a[0]+B.a[1]);m7=(A.a[1]-A.a[3])*(B.a[2]+B.a[3]);C.a[0]=m1+m4-m5+m7;C.a[1]=m3+m5;C.a[2]=m2+m4;C.a[3]=m1+m3-m2+m6;專業(yè).專注 ... .. ..returnC;}else{n=n/2;Arraya00,a01,a10,a11;Arrayb00,b01,b10,b11;Arrayc00,c01,c10,c11;Arrays1,s2,s3,s4,s5,s6,s7;a00.a=(int*)malloc(sizeof(int)*(n*n));a00.n=n;a01.a=(int*)malloc(sizeof(int)*(n*n));a01.n=n;a10.a=(int*)malloc(sizeof(int)*(n*n));a10.n=n;a11.a=(int*)malloc(sizeof(int)*(n*n));a11.n=n;b00.a=(int*)malloc(sizeof(int)*(n*n));b00.n=n;b01.a=(int*)malloc(sizeof(int)*(n*n));b01.n=n;b10.a=(int*)malloc(sizeof(int)*(n*n));b10.n=n;b11.a=(int*)malloc(sizeof(int)*(n*n));b11.n=n;divide(A,a00,a01,a10,a11);divide(B,b00,b01,b10,b11);s1=strassen(a00+a11,b00+b11);s2=strassen(a10+a11,b00);s3=strassen(a00,b01-b11);s5=strassen(a00+a01,b11);s4=strassen(a11,b10-b00);s6=strassen(a10-a00,b00+b01);s7=strassen(a01-a11,b10+b11);c00=s1+s4-s5+s7;c01=s3+s5;c10=s2+s4;c11=s1+s3-s2+s6;C=merge(c00,c01,c10,c11);returnC;}}Arraymul(ArrayA,ArrayB) //普通的矩陣乘法計算{專業(yè).專注 ... .. ..intn=A.n;ArrayC;C.a=(int*)malloc(sizeof(int)*(n*n));C.n=n;inti,j,k;for(i=0;i<n;i++)for(j=0;j<n;j++){C.a[i*n+j]=0;for(k=0;k<n;k++)C.a[i*n+j]=C.a[i*n+j]+A.a[i*n+k]*B.a[k*n+j];}returnC;}voidmatrix(){intn;charch;ArrayA,B,C;printf("\t\t計算M1×M2的乘積\n");printf("\t\t 輸入矩陣階數(shù)n:");cin>>n;A.a=(int*)malloc(sizeof(int)*(n*n));A.n=n;B.a=(int*)malloc(sizeof(int)*(n*n));B.n=n;C.a=(int*)malloc(sizeof(int)*(n*n));C.n=n;printf("\t\t---1 手動輸入---\n" );printf("\t\t---2 隨機生成---\n" );printf("\t\t 請選擇\n\n" );ch=getch();switch(ch){case'1':printf("手動輸入\n");PrintIn(A,B);printf("\n" );break;case'2':printf("自動生成\n" );RandomIn(A,B);專業(yè).專注 ... .. ..break;default:printf("按鍵錯誤\n");break;}printf("結果數(shù)組A中數(shù)據(jù)為:\n");PrintOut(A);printf("結果數(shù)組B中數(shù)據(jù)為:\n");PrintOut(B);cout<<endl;do{doublestart,finish,duration;printf("\n---1 用BF方法---\n" );printf("---2 用DAC方法---\n" );printf("---3 退出 ---\n" );printf("\n請選擇:");ch=getch();switch(ch){case'1':start=clock();C=mul(A,B);finish=clock();duration=( double)(finish-start);printf("\n 用BF方法得出的結果\n" );PrintOut(C);printf( "用BF方法計算矩陣所花費的時間是 :%fms\n" ,duration);printf("\n" );break;case'2':start=clock();C=strassen(A,B);finish=clock();duration=( double)(finish-start);printf("用DAC方法得出的結果 \n");PrintOut(C);printf( "DAC方法計算矩陣所花費的時間是 :%fms\n" ,duration);printf("\n" );break;case'3':exit(0);default:printf("按鍵錯誤\n");}printf("\n 你想用另外一種方法嗎 ?請輸入(Y/N)?:");do專業(yè).專注 ... .. ..{ch=getch();}while(ch!='Y'&&ch!= 'y'&&ch!= 'N'&&ch!= 'n');}while(ch=='Y'||ch=='y');}專業(yè).專注 ... .. ..實驗結果及分析時間復雜度1.分塊相乘總共用了 8次乘法,因而需要 Θ(nlog28)即Θ(n3)的時間復雜度。2.在求解M1,M2,M3,M4,M5,M6,M7時需要使用 7次矩陣乘法,其他都是矩陣加法和減法。因此時間復雜度下降為 O(nlog27)=O(n2.807)。有得必有失,Strassen演算法的數(shù)值穩(wěn)定性較差 。專業(yè).專注 ... .. ..減治法在組合問題中的應用實驗名稱 實驗室實驗目

——8枚硬幣問題二.實驗目的1)深刻理解并掌握減治法的設計思想并理解它與分治法的區(qū)別 ;2)提高應用減治法設計算法的技能 。3)理解這樣一個觀點 :建立正角的模型對于問題的求解是非常重要的 。二.實驗要求的1)設計減治算法實現(xiàn)8枚硬幣問題;或2)設計實驗程序,考察用減治技術設計的算法是否高效;要 3)擴展算法,使之能處理 n枚硬幣中有一枚假幣的問題 。求專業(yè).專注 ... .. ..實驗原理(算法基減治法原理本思想)專業(yè).專注 ... .. ..假幣問題voidfake_coin(){int a[100];int i,n,p;程printf("please input n:");序scanf("%d",&n);代for(i=0;i<n;i++)碼{cout<<"a["<<i<<"]=";cin>>a[i];}專業(yè).專注 ... .. ..p=check_coin_2(a,0,n-1);//printf("the false coin is %d\n",p);cout<<"the false coin is"<<p<<endl;}int sum_coin(int a[],int from,int to){int i,sum=0;for(i=from;i<=to;i++)sum+=a[i];return sum;}int check_coin_2(int a[],int from,int to){int i,n=to-from+1;if(n==1)return from;else{if(n%2==0){專業(yè).專注 ... .. ..if(sum_coin(a,from,from+n/2-1)==sum_coin(a,to-n/2+1,to))return from-1;else{if(sum_coin(a,from,from+n/2-1)<sum_coin(a,to-n/2+1,to))check_coin_2(a,from,from+n/2-1);elsecheck_coin_2(a,to-n/2+1,to);}}elsecheck_coin_2(a,from+1,to); } }專業(yè).專注 ... .. ..實驗結果及分析

實驗結果正確,能夠在N枚硬幣問題條件下準確查找假幣在什么位置 。通過硬幣問題,讓我更加理解了減治法的使用 ,讓我對減治法有了更深的理解,對于以后的編程思想有了更深的研究專業(yè).專注 ... .. ..變治法在排序問題中的應用實驗名稱 實驗室 9#204——堆排序?qū)I(yè).專注 ... .. ..三.實驗目的1)深刻理解并掌握變治法的設計思想 ;2)掌握堆的概念以及如何用變治法把任意給定的一組數(shù)據(jù)改變成堆 ;3)提高應用變治法設計算法的技能 。二.實驗要求1)設計與實現(xiàn)堆排序算法 ;2)待排序的數(shù)據(jù)可以手工輸入 (通常規(guī)模比較小 ,10個數(shù)據(jù)左右),用以檢測程序的正實確性;也可以計算機隨機生成 (通常規(guī)模比較大 ,1500-3000 個數(shù)據(jù)左右),用以檢驗驗(用計數(shù)法)堆排序算法的時間效率 。目的或要求專業(yè).專注 ... .. ..專業(yè).專注 .實驗原理(算法基本思想)

.. .. ..1)將初始待排序關鍵字序列 (R1,R2....Rn)構建成大頂堆,此堆為初始的無須區(qū) ;2)將堆頂元素 R[1]與最后一個元素 R[n]交換,此時得到新的無序區(qū) (R1,R2,......Rn-1)和新的有序區(qū) (Rn),且滿足R[1,2...n-1]<=R[n];

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論