ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:283.73KB ,
资源ID:11904018      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11904018.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(算法分析与设计实验报告.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

算法分析与设计实验报告.docx

1、算法分析与设计实验报告* 院 系: 计算机科学学院 专 业: 计算机科学与技术 年 级: 课程名称: 算法设计与分析基础 班 号: 组 号: 指导教师: 年 月 日组员学号 姓名 实验名称 算法实验整体框架的构建 实验室实验目的或要求1. 实验题目 算法实验主菜单的设计。 2实验目的 熟悉实验环境VC6.0 ; 复习C、C+语言以及数据结构课程的相关知识,实现课程间的平滑过度;3. 实验要求1)设计的主菜单可以是图形模式的,也可以是控制台模式的。以控制台为例,主菜单大致如下: 算法设计与分析实验 1. 算法分析基础Fibonacci序列问题2. 分治法在数值问题中的应用最近点对问题3. 减治法

2、在组合问题中的应用8枚硬币问题4. 变治法在排序问题中的应用堆排序问题5. 动态规划法在图问题中的应用全源最短路径问题 99. 退出本实验 请输入您所要执行的操作(1,2,3,4,5,99):2)点击操作后进入相应的实验项目或是相应项目的下一级菜单;3)可以反复执行,直到退出实验。程序代码void Meun() printf(nttn); printf(ntt 算法设计与分析实验n); printf(nttn); printf(ntt1、算法分析基础Fibonacci序列问题n); printf(ntt2、分治法在数值问题中的应用矩阵相乘问题n); printf(ntt3、减治法在组合问题中的

3、应用枚硬币问题n); printf(ntt4、变治法在排序问题中的应用堆排序问题n);Printf(ntt4、动态规划法在图问题中的应用全源最短路径问题n);动态规划法在图问题中的应用全源最短路径问题 printf(ntt99、退出本实验n); printf(ntt); printf(ntt请输入您所要执行的操作(1,2,3,4,5,99):);void main() int a; while(1) Meun(); /调用菜单函数显示菜单 scanf(%d,&a); switch(a) case 1: printf(nttFibonacci序列问题ttn); fibonacci(); brea

4、k; case 2: printf(ntt分治法在数值问题中的应用矩阵相乘问题ttn); matrix(); break; case 3: printf(ntt减治法在组合问题中的应用8枚硬币问题ttn); COINFAKE(); break; case 4: printf(ntt变治法在排序问题中的应用堆排序问题ttn); HEAP(); break; case 5: printf(ntt动态规划法在图问题中的应用全源最短路径问题ttn); break; case 99: printf(你选择退出本实验n ); exit(0); 实验结果及分析实验名称算法分析基础Fibonacci序列问题实

5、验室实验目的或要求实验题目 给定一个非负整数n,计算第n个Fibonacci数 实验目的1)理解递归算法和迭代算法的设计思想以及递归程序的调式技术2)掌握并应用递归算法和迭代算法效率的理论分析(前验分析)和实际分析(后验分析)方法;3)理解这样一个观点:不同的算法可以解决相同的问题,这些算法的解题思路不同,复杂程度不同,效率也不同; 实验要求1)使用教材2.5节中介绍的迭代算法Fib(n),找出最大的n,使得 第n个Fibonacci数不超过计算机所能表示的最大整数,并给出具体的执行时间;2)对于要求1),使用教材2.5节中介绍的递归算法F(n)进行计算,同样给出具体的执行时间,并同1)的执行

6、时间进行比较;3)对于输入同样的非负整数n,比较上述两种算法基本操作的执行次数;4)对1)中的迭代算法进行改进,使得改进后的迭代算法其空间复杂度为(1);5)设计可供用户选择算法的交互式菜单(放在相应的主菜单下)。 实验原理(算法基本思想)1、递归法基本思想递归就是定义一个函数,让它自己调用自己。Fib(int n)/输入整数n,输出第n个斐波那契数if(n=0)return 0; Else if(n=1)return 1; Else return Fib(n-1)+Fib(n-2)2、迭代法这种方法相对于递归法来说在时间复杂度上减小了不少,但代码相对就要复杂些了。Fib(int n)/输入整

7、数n,输出第n个斐波那契数if(n=0)return 0; Else if(n=1)return 1; Else F00; F11;for(i=2;in-2;i+) F2=f1+f0; /f1表示当前的值 F0F1 F1F2; Return F2;程序代码int Fib(int i) if(i=0) t=f; f=Fib(i); printf(%d ,f); i+; printf(n计算机最大可表示第%d个斐波拉契数n,i); end=clock(); printf(运行时间为%f秒n,(end-start)/1000);void DieDai() long shu3,count; doubl

8、e start,end; start=clock(); shu0=0; shu1=1; printf(%ld ,shu0); for(count=1;shu1=shu0;count+) printf(%ld ,shu1); shu2=shu1+shu0; shu0=shu1; shu1=shu2; printf(n计算机最大可表示第%d个斐波拉契数n,count); end=clock(); printf(运行时间为%f毫秒n,end-start);void Fibonacci() printf(n迭代算法:n); DieDai(); printf(n递归算法:n); DiGui(); 实验结

9、果及分析通过比较两种方法求Fibonacci数列所用的时间,可以发现迭代法的效率明显高于递归法。同时也明白了不同的算法可以解决相同的问题,这些算法的解题思路不同,复杂程度不同,效率也不同。实验名称分治法在数值问题中的应用矩阵相乘问题 实验室实验目的或要求实验题目设M1和M2是两个nn的矩阵,设计算法计算M1M2 的乘积。实验目的1)提高应用蛮力法设计算法的技能;2)深刻理解并掌握分治法的设计思想;3)理解这样一个观点:用蛮力法设计的算法,一般来说,经过适度的努力后,都可以对其进行改进,以提高算法的效率。 实验要求1)设计并实现用BF方法求解矩阵相乘问题的算法;2)设计并实现用DAC方法求解矩阵

10、相乘问题的算法;3)以上两种算法的输入既可以手动输入,也可以自动生成;4)对上述两个算法进行时间复杂性分析,并设计实验程序验证 分析结果;5)设计可供用户选择算法的交互式菜单(放在相应的主菜单下)。实验原理(算法基本思想)1)蛮力法求解蛮力法比较简单,直接使用矩阵相乘公式计算矩阵的每行每列的值,很容易就能得出答案2)分治法求解分治法思想 将问题实例划分为同一问题的几个较小的实例。对这些较小实例求解,通常使用递归方法,但在问题规模足够小时,也会使用另一种算法。如果有必要,合并这些问题的解,以得到原始问题的解。求解矩阵相乘的DAC算法,使用了strassen算法。DAC(A,B,n) If n=2

11、 使用7次乘法的方法求得解 Else Divide(A)/把A分成4块Divide(B)/把B分成4块调用7次strassen算法求得解的4块合并这4块得到解并返回程序代码/矩阵相乘问题void matric(int n,float ANN,float BNN,float CNN) LARGE_INTEGER startTime; LARGE_INTEGER endTime; QueryPerformanceCounter(&startTime); int i,j,k; for(i=0;in;i+) for(j=0;jn;j+) Cij=0; for(i=0;in;i+) for(j=0;jn

12、;j+) for(k=0;kn;k+) Cij+=Aik*Bkj; QueryPerformanceCounter(&endTime); LARGE_INTEGER totalTime; totalTime.QuadPart = endTime.QuadPart - startTime.QuadPart; printf(%ldn, totalTime.QuadPart); void MATRIX_MULTIPLY(float AN,float BN,float CN) /按通常的矩阵乘法计算C=AB的子算法(仅做2阶) int i,j,t; for(i=0;iC for(j=0;j2;j+)

13、Cij=0; /计算完一个Cij,Cij应重新赋值为零 for(t=0;tZ int i,j; for(i=0;in;i+) for(j=0;jZ int i,j; for(i=0;in;i+) for(j=0;jn;j+) Zij=Xij-Yij;void STRASSEN(int n, float AN, float BN, float CN) float A11NN, A12NN, A21NN, A22NN; float B11NN, B12NN, B21NN, B22NN; float C11NN, C12NN, C21NN, C22NN; float m1NN, m2NN,m3NN,

14、 m4NN, m5NN, m6NN,m7NN; float AANN, BBNN, MM1NN,MM2NN; int i, j; if (n=2) MATRIX_MULTIPLY(A, B, C); else for (i=0; in/2; i+) for (j=0; jn/2; j+) A11ij = Aij; A12ij = Aij+n/2; A21ij = Ai+n/2j; A22ij = Ai+n/2j+n/2; B11ij = Bij; B12ij = Bij+n/2; B21ij = Bi+n/2j; B22ij = Bi+n/2j+n/2; MATRIX_ADD(n/2, A11

15、, A22, AA); MATRIX_ADD(n/2, B11, B22, BB); STRASSEN(n/2, AA, BB, m1); MATRIX_ADD(n/2, A21, A22, AA); STRASSEN(n/2, AA, B11, m2); MATRIX_SUB(n/2, B12, B22, BB); STRASSEN(n/2, A11, BB, m3); MATRIX_SUB(n/2, B21, B11, BB); STRASSEN(n/2, A22, BB, m4); MATRIX_ADD(n/2, A11,A12, AA); STRASSEN(n/2, AA, B22,

16、m5); MATRIX_SUB(n/2, A21, A11, AA); MATRIX_ADD(n/2, B11, B12, BB); STRASSEN(n/2, AA, BB, m6); MATRIX_SUB(n/2, A12, A22, AA); MATRIX_ADD(n/2, B21, B22, BB); STRASSEN(n/2, AA, BB, m7); MATRIX_ADD(n/2, m1, m4, MM1); MATRIX_SUB(n/2, m5, m7, MM2); MATRIX_SUB(n/2, MM1, MM2, C11); MATRIX_ADD(n/2, m3, m5, C

17、12); MATRIX_ADD(n/2, m2, m4, C21); MATRIX_ADD(n/2, m1, m3, MM1); MATRIX_SUB(n/2, m2, m6, MM2); MATRIX_SUB(n/2, MM1, MM2, C22); for (i=0; in/2; i+) for (j=0; jn/2; j+) Cij = C11ij; Cij+n/2 = C12ij; Ci+n/2j = C21ij; Ci+n/2j+n/2 = C22ij; / else finished void SHUru(int n,float ANN,float BNN) int i,j; pr

18、intf(请输入A数据:n); for(i=0;in;i+) for(j=0;jn;j+) scanf(%f,&Aij); printf(请输入B数据:n); for(i=0;in;i+) for(j=0;jn;j+) scanf(%f,&Bij); void SHUIji(int n,float ANN,float BNN) int i,j; for(i=0;in;i+) for(j=0;jn;j+) Aij=(float)(n*rand()/(RAND_MAX+1.0) ; printf(数组A中数据为:n);for(i=0;in;i+) for(j=0;jn;j+) printf(%4f

19、 ,Aij); printf(n); for(i=0;in;i+) for(j=0;jn;j+) Bij=(float)(n*rand()/(RAND_MAX+1.0) ; printf(数组B中数据为:n);for(i=0;in;i+) for(j=0;jn;j+) printf(%4f ,Bij); printf(n); void print1(int n,float CNN)int i ,j; printf(结果数组C中数据为:n); for(i=0;in;i+) for(j=0;jn;j+) printf(%4f ,Cij); printf(n); void Jz() int n; f

20、loat ANN,BNN,CNN; int i,j; printf(本程序用于计算M1M2 的乘积n); printf(输入矩阵阶数n:n); scanf(%d,&n); char flag; for(i=0;in;i+) for(j=0;jn;j+) Cij=0; printf(-1 手动输入-n); printf(-2 自动生成-n); printf(-3 确定 -n); while(1) printf(请输入选择nn); fflush(stdin); flag=getch(); switch(flag) case 1: printf(手动输入 n); SHUru(n,A,B); prin

21、tf(n);break; case 2: printf(自动生成 n); SHUIji(n,A,B); printf(n);break; case 3: goto con; default: printf(按键错误n); con: printf(-1 用BF方法-n); printf(-2 用DAC方法-n); printf(-3 结束 -n); while(1) printf(请输入选择nn); fflush(stdin); flag=getch(); switch(flag) case 1: matric(n,A,B,C); printf(用BF方法得出的结果 n); print1(n,C

22、); printf(n);break; case 2: STRASSEN(n,A,B,C); printf(用DAC方法得出的结果 n); print1(n,C); printf(n);break; case 3: return; default: printf(按键错误n); 实验结果及分析经过这个实验,我明白了蛮力法几乎可以解决所有的问题,但是算法的效率不高。对蛮力法进行改进,经过适当的努力后,算法的效率可以得到提高。实验名称减治法在组合问题中的应用8枚硬币问题实验室实验目的或要求实验题目 在8枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测这枚假币。实验目的1)深刻理解并掌握减治法的设计思想并理解它与分治法的区别;2)提高应用减治法设计算法的技能。3)理解这样一个观点:建立正角的模型对于问题的求解是非常重要的。实验要求1)设计减治算法实现8枚硬币问题;2)设计实验程序,考察用减治技术设计的算法是否高效;3)扩展算法,使之能处理n枚硬币中有一枚假币的问题。实验原理(算法基本思想)减治法主要有三种变种 减去一个常量 减去一个常量因子 减可变规模与分治法的区别

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1