1、算法分析与设计实验报告* 院 系: 运算机科学学院 专 业: 运算机科学与技术 年 级: 课程名称: 算法设计与分析基础 班 号: 组 号: 指导教师: 年 月 日组员学号 姓名 实验名称 算法实验整体框架的构建 实验室实验目的或要求1. 实验题目 算法实验主菜单的设计。 2实验目的 熟悉实验环境VC ; 复习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、减治法在组合问题中的应用枚硬币问题n
3、); 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(); 4f4f4f; else if(l=h) printf(第%d枚硬币是假的,它的重量是%d。,l,coinl); else if(h-l=1) if(l1) if(coinl=coin1) pri
4、ntf(第%d枚硬币是假的,它的重量是%d。,h,coinh); else printf(第%d枚硬币是假的,它的重量是%d。,l,coinl); else if(hn) if(coinh=coinn) printf(第%d枚硬币是假的,它的重量是%d。,l,coinl); else printf(第%d枚硬币是假的,它的重量是%d。,h,coinh); else if(lh) ps=(h-l+1)/3; sum1=0; sum2=0; for(i=1;i=ps;i+) sum1+=coinl+i-1; sum2+=coinh-i+1; if(sum1=sum2) FakeCoin_1(coi
5、n,n,l+ps,h-ps); else if(sum1=coinl+ps*ps) FakeCoin_1(coin,n,h-ps+1,h); else FakeCoin_1(coin,n,l,l+ps-1);void FakeCoin() int i=1,n, coin100; printf(请输入硬币的个数: ); scanf(%d,&n); printf(请输入硬币的重量:n); for(i=1;i=n;i+) scanf(%d,&coini); FakeCoin_1(coin,n,1,n); 实验结果及分析通过这个实验,理解并掌握了减治法的设计思想并理解了它与分治法的区别。在写这个算法前
6、,一定要建立正确的求解模型。实验名称变治法在排序问题中的应用堆排序问题实验室实验目的或要求实验题目用基于变治法的堆排序算法对任意一组给定的数据进行排序实验目的1)深刻理解并掌握变治法的设计思想;2)掌握堆的概念以及如何用变治法把任意给定的一组数据改变成堆;3)提高应用变治法设计算法的技能。 实验要求1)设计与实现堆排序算法;2)待排序的数据可以手工输入(通常规模比较小,10个数据左右),用以检测程序的正确性;也可以计算机随机生成(通常规模比较大,15003000个数据左右),用以检验(用计数法)堆排序算法的时间效率。实验原理(算法基本思想)堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或
7、最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单。 (1)用大根堆排序的基本思想(2)大根堆排序算法的基本操作特点:堆排序(HeapSort)是一树形选择排序。堆排序的特点是:在排序过程中,将Rl.n看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系(参见二叉树的顺序存储结构),在当前无序区中选择关键字最大(或最小)的记录堆排序的最坏时间复杂度为O(nlogn)。堆序的平均性能较接近于最坏性能。它是不稳定的排序方法。程序代码动生成 2.手动输入 3.结束n); scanf(%d,&choice); switch(choice) case
8、 1: for(i=1;i=n;i+) ai=rand(); printf(产生的随机数为:); for(i=1;i=n;i+) printf(%d ,ai); printf(n); ;break; case 2: printf(输入要排序的数:n); for(i=1;i1) Dui_1(a,m); for(i=1;i=n;i+) printf(%d ,ai); printf(n); t=a1; a1=am; am=t; m=m-1; for(i=1;i=n;i+) printf(%d ,ai); printf(n); printf(输出排序的结果:); for(i=1;i=n;i+) pri
9、ntf(%d ,ai); system(pause); 实验结果及分析 经过这次实验,理解了变治法的设计思想,同时还掌握了堆的概念以及如何用变治法把任意给定的一组数据改变成堆。心得体会经过这几次的实验,对算法的分析能力有了较大的提高。算法分析对于设计出的每一个具体的算法,利用数字作为工具讨论它的各种复杂度,就是算法分析的主要任务。复杂度分析的结果可以作为评价算法质量的标准之一,有时也可以为改进算法的方向提供参考。分析算法的复杂度需要较强的数学技巧,针对不同的算法,采用不同的分析方法。说说Fibonacci序列问题,这个实验让我们更好的理解递归算法和迭代算法的设计思想以及递归程序的调式技术,并应
10、用递归算法和迭代算法效率的理论分析(前验分析)和实际分析(后验分析)方法。 这次实验也让我们理解了蛮力法、分治法、减治法、变治法的设计思想,提高应用蛮力法、分治法、减治法、变治法设计算法的技能。并且理解了几个重要观点:不同的算法可以解决相同的问题,这些算法的解题思路不同,复杂程度不同,效率也不同;用蛮力法设计的算法,一般来说,经过适度的努力后,都可以对其进行改进,以提高算法的效率。建立正角的模型对于问题的求解是非常重要的。学习了这门课,我们在以后的编程中,将会关注于程序执行的效率,进而决定我们的算法,而不再是盲目的去编程。这门课也为我们设计算法打下了基础。同时,我们明白了良好的编程习惯有助于我们更快更高效的编写出可运行的程序。成绩评定 教师签名: 年 月 日
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1