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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

算法设计综合实验报告.docx

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

2、组合问题中的应用8枚硬币问题4. 变治法在排序问题中的应用堆排序问题5. 动态规划法在图问题中的应用全源最短路径问题 99.退出本实验 请输入您所要执行的操作(1,2,3,4,5,99):2)点击操作后进入相应的实验项目或是相应项目的下一级菜单;3)可以反复执行,直到退出实验。实验原理(算法基本思想)构造menu函数,以菜单形式输出控制界面(按需求分析要求);构造switch(start)函数,控制各个子程序,以解决各个问题:switch(start) case 1: break; case 2: break; case 3: break; case 4: break; case 5: bre

3、ak; case 99:return -1; default:printf(输入有误!); 程序代码void menu()printf(nn-);printf(n 算法设计与分析实验 );printf(n-);printf(n 1. 算法分析基础Fibonacci序列问题);printf(n 2. 分治法在数值问题中的应用最近点对问题);printf(n 3. 减治法在组合问题中的应用8枚硬币问题);printf(n 4. 变治法在排序问题中的应用堆排序问题 );printf(n 5. 动态规划法在图问题中的应用全源最短路径问题);printf(n99. 退出本实验);printf(n-);p

4、rintf(n请输入您所要执行的操作(1,2,3,4,5,99):);int main()int start;for(;) menu(); scanf(%d,&start); switch(start) case 1: system(cls); printf( -实验一.Fibonacci序列问题-nn); Fib(); fflush(stdin); break; case 2: system(cls); printf(-实验二.最近点对问题-n); closestPath(); fflush(stdin); break; case 3: system(cls); printf(-实验三.8枚

5、硬币问题-n); Coins(); fflush(stdin); break; case 4: system(cls); printf(-实验四.堆排序问题-n); heapsort(); fflush(stdin); break; case 5: system(cls); printf(-实验五.全源最短路径问题-n); fflush(stdin); break; case 99:return -1; default:printf(输入有误!); 实验结果及分析实验结果如下:实现了以菜单形式的显示格式,清晰明了;用户选择相应操作以解决相应问题;实验名称计算第n个斐波那契数实验室9#203实验

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

7、操作的执行次数;4)对1)中的迭代算法进行改进,使得改进后的迭代算法其空间复杂度为(1); 5)设计可供用户选择算法的交互式菜单(放在相应的主菜单下)。 实验原理(算法基本思想)实验分别用递归算法和迭代算法求解,并对两种算法的运行时间进行比较;递归算法:设 f(n) 为斐波那契数列的第n个数。那么有递归式 f(n)=f(n-1)+f(n-2)。按照这个朴素的递归思想可以得出结论。但是时间复杂度是O(2n),计算缓慢,解决不了大规模问题。迭代算法:求解fib(n),把它推到求解fib(n-1)和fib(n-2)。也就是说,为计算fib(n),必须先计算fib(n-1)和fib(n- 2),而计算

8、fib(n-1)和fib(n-2),又必须先计算fib(n-3)和fib(n-4)。依次类推,直至计算fib(1)和fib(0),分别能立即得到结果1和0。迭代算法消除了大量重复的计算,效率上有了大幅提高。程序代码unsigned long F_RE(int n) if(n=1) return 0; if(n=2) return 1; if (n2) return (F_RE(n-1)+F_RE(n-2);unsigned long F_ITER(int n) unsigned long f1=1,f2=1,fn; if (n=1) return 0; if (n=2|n=3) return

9、1; for (int i=4;i=n;i+) fn=f1+f2; f1=f2; f2=fn; return fn;void F_MAX(unsigned long f,int n) unsigned long Temp,max; max=pow(2,31)-1; / printf(%ld,max); while(f=max) Temp=f; n+; f=F_ITER(n); printf(nn不超出该32位计算机所能表示的最大整数n及其所在序列中的位置为(%ld,%d)t,Temp,n-1);void Fib() unsigned long F_i; int i=0; char ch; pr

10、intf(选择输出第N个斐波拉契数:n); printf(1.迭代算法;n2.递归算法t); fflush(stdin); ch=getchar(); if(ch=1) printf(n需要输出第几个数(1-50)?t); scanf(%d,&i); F_i=F_ITER(i); printf(%ldt,F_i); F_MAX(F_i,i); else if(ch=2) printf(n需要输出第几个数(1-50)?t); scanf(%d,&i); F_i=F_ITER(i); printf(%ldt,F_RE(i); F_MAX(F_i,i); else printf(n输入有误!);实验

11、结果及分析输出结果如下:迭代算法递归算法递归算法在n超过20,效率低的缺点显露无疑;迭代法的优势就体现出来了。实验名称平面最近点问题实验室9#203实验目的或要求实验目的1)提高应用蛮力法设计算法的技能;2)深刻理解并掌握分治法的设计思想;3)理解这样一个观点:用蛮力法设计的算法,一般来说,经过适度的努力后,都可以对其进行改进,以提高算法的效率。 实验要求1)设计并实现用BF方法求解最近点对问题的算法; 2)设计并实现用DAC方法求解最近点对问题的算法;3)以上两种算法的输入既可以手动输入,也可以自动生成;4)算法不仅要输出最近点对的距离,还要输出最近点对的两个点; 5)对上述两个算法进行时间

12、复杂性分析,并设计实验程序验证分析结果;6)设计可供用户选择算法的交互式菜单(放在相应的主菜单下)实验原理(算法基本思想)分治法已知集合S中有n个点,分治法的思想就是将S进行拆分,分为2部分求最近点对。算法每次选择一条垂线L,将S拆分左右两部分为SL和SR,L一般取点集S中所有点的中间点的x坐标来划分,这样可以保证SL和SR中的点数目各为n/2,(否则以其他方式划分S,有可能导致SL和SR中点数目一个为1,一个为n-1,不利于算法效率,要尽量保持树的平衡性)依次找出这两部分中的最小点对距离:L和R,记SL和SR中最小点对距离 = min(L,R),如图1: 对于SL虚框范围内的p点,在SR虚框

13、中与p点距离小于的顶多只有六个点,就是图二右图中的2个正方形的6的顶点。这个可以反推证明,如果右边这2个正方形内有7个点与p点距离小于,例如q点,则q点与下面正方形的四个顶点距离小于,则和为SL和SR中的最小点对距离相矛盾。因此对于SL虚框中的p点,不需求出p点和右边虚线框内所有点距离,只需计算SR中与p点y坐标距离最近的6个点,就可以求出最近点对,节省了比较次数。程序代码struct node int x_value ; int y_value ; double shortest_distance ; int result_x_value ; int result_y_value ;int

14、*PARTITION (struct node*A, int start, int end, int key) if( key = 1)/ 按 x 排序 int *partition ; partition = new int ; double x = Aend.x_value; int i = start - 1 ; for(int j = start ;j end ; j+) if( Aj.x_value = x ) i+; struct node tant = Ai; Ai = Aj; Aj = tant ; struct node tant = Ai + 1; Ai + 1 = Aen

15、d ; Aend = tant; *partition = i + 1; return partition; else/ 按 y 排序 int *partition ; partition = new int ; double y = Aend.y_value ; int i = start - 1 ; for(int j = start ;j end ; j+) if( Aj.y_value start ) int *partition ; partition = new int ; partition = PARTITION (A, start, end, key); quick_sort

16、(A, start, *partition - 1,key ); quick_sort(A, *partition , end , key); void combine (struct node *A, struct node *result1 , struct node *result2 ,struct node *result, int start , int middle , int end )/合并两个部分的结果 double min_distance ; int n = end - start ; int length = 0 ; int j,k ; struct node tant

17、100; /用以保存x_value在middle - min_distance , middle + min_distance的点 double below , above ; / below 和 above 分别为middle - min_distance , middle + min_distance的上界和下界 int keyword; if(result1-shortest_distance result2-shortest_distance )/寻找最小值 result-x_value = result2-x_value; result-y_value = result2-y_val

18、ue ; result-result_x_value = result2-result_x_value ; result-result_y_value = result2-result_y_value ; result-shortest_distance = result2-shortest_distance ; min_distance = result2-shortest_distance ; else result-x_value = result1-x_value; result-y_value = result1-y_value ; result-result_x_value = r

19、esult1-result_x_value ; result-result_y_value = result1-result_y_value ; result-shortest_distance = result1-shortest_distance ; min_distance = result1-shortest_distance ;/ min_distance = minresult1.shortes_distance, result2.shortest_distance below = Amiddle.x_value - min_distance ; above = Amiddle.x

20、_value + min_distance ; for(int i = 0 ; i =below & Ai.x_value =above) tant length+ = Ai; / 构造临时数组, 即x_value在middle - min_distance , middle + min_distance的点 keyword = 2 ; length-; quick_sort(tant, 0 ,length ,keyword); /按y对tant数组排序 for( k = 0 ; k =length+1 ; k+ ) j = k + 1 ; while(j=length&( tantj.y_v

21、alue - tantk.y_value = min_distance | tantk.y_value - tantj.y_value = min_distance) /? 2 miin_distance double tant_distance ; double temp =(double)( (tantk.x_value - tantj.x_value)*(tantk.x_value - tantj.x_value) + (tantk.y_value - tantj.y_value)*(tantk.y_value - tantj.y_value) ; tant_distance = sqr

22、t(temp); if(tant_distance x_value = tantk.x_value ; result-y_value = tantk.y_value ; result-result_x_value = tantj.x_value ; result-result_y_value = tantj.y_value ; result-shortest_distance = tant_distance ; min_distance = tant_distance ; j+ ; void shortest_distance(struct node *A, struct node *resu

23、lt, int start ,int end ) if( end - start 2 ) int middle ; struct node *result1 = new struct node ; struct node *result2 = new struct node ; /struct node *final_result = new struct node ; result1-shortest_distance = 1000000; result2-shortest_distance = 1000000;/ 初始化结果result1, result2 middle = (start

24、+ end) / 2; shortest_distance(A, result1, start, middle ); shortest_distance(A, result2, middle + 1, end ); combine(A, result1, result2, result, start, middle, end); else/分组内点数不足3个,直接得结果 for(int i = start ; i = end ; i+ ) for (int k = i + 1 ; k = end ;k+ ) double tant_distance ; double temp =(double

25、)( (Ai.x_value - Ak.x_value)*(Ai.x_value - Ak.x_value) + (Ai.y_value - Ak.y_value)*(Ai.y_value - Ak.y_value) ; tant_distance = sqrt(temp); if(tant_distance shortest_distance ) result-x_value = Ai.x_value; result-y_value = Ai.y_value; result-result_x_value = Ak.x_value ; result-result_y_value = Ak.y_value ; result-shortest_distance = tant_distance ; void closestPath ()

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

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