算法分析与设计实验报告.docx
《算法分析与设计实验报告.docx》由会员分享,可在线阅读,更多相关《算法分析与设计实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
![算法分析与设计实验报告.docx](https://file1.bdocx.com/fileroot1/2022-11/28/2dd505b7-6fad-45b9-998d-f400ccfc477b/2dd505b7-6fad-45b9-998d-f400ccfc477b1.gif)
算法分析与设计实验报告
****
院系:
运算机科学学院
专业:
运算机科学与技术
年级:
课程名称:
算法设计与分析基础
班号:
组号:
指导教师:
年月日
组员
学号
姓名
实验名称
算法实验整体框架的构建
实验室
实
验
目
的
或
要
求
1.实验题目
算法实验主菜单的设计。
2.实验目的
⑴熟悉实验环境VC++;
⑵复习C、C++语言以及数据结构课程的相关知识,实现课程间的平滑过度;
3.实验要求
1)设计的主菜单可以是图形模式的,也可以是控制台模式的。
以控制台为例,主菜单大致如下:
-------------------------
《算法设计与分析》实验
-------------------------
1.算法分析基础——Fibonacci序列问题
2.分治法在数值问题中的应用——最近点对问题
3.减治法在组合问题中的应用——8枚硬币问题
4.变治法在排序问题中的应用——堆排序问题
5.动态规划法在图问题中的应用——全源最短路径问题
99.退出本实验
-------------------------
请输入您所要执行的操作(1,2,3,4,5,99):
2)点击操作后进入相应的实验项目或是相应项目的下一级菜单;
3)可以反复执行,直到退出实验。
程
序
代
码
voidMeun()
{
printf("\n\t\t-------------------------\n");
printf("\n\t\t《算法设计与分析》实验\n");
printf("\n\t\t-------------------------\n");
printf("\n\t\t1、算法分析基础——Fibonacci序列问题\n");
printf("\n\t\t2、分治法在数值问题中的应用——矩阵相乘问题\n");
printf("\n\t\t3、减治法在组合问题中的应用——枚硬币问题\n");
printf("\n\t\t4、变治法在排序问题中的应用——堆排序问题\n");
Printf("\n\t\t4、动态规划法在图问题中的应用——全源最短路径问题\n");
动态规划法在图问题中的应用——全源最短路径问题
printf("\n\t\t99、退出本实验\n");
printf("\n\t\t-------------------------");
printf("\n\t\t请输入您所要执行的操作(1,2,3,4,5,99):
");
}
voidmain()
{
inta;
while
(1)
{
Meun();
4f4f4f
;
else
if(l==h)
printf("第%d枚硬币是假的,它的重量是%d。
",l,coin[l]);
else
if(h-l==1)
{
if(l>1)
{
if(coin[l]==coin[1])
printf("第%d枚硬币是假的,它的重量是%d。
",h,coin[h]);
else
printf("第%d枚硬币是假的,它的重量是%d。
",l,coin[l]);
}
else
if(h{
if(coin[h]==coin[n])
printf("第%d枚硬币是假的,它的重量是%d。
",l,coin[l]);
else
printf("第%d枚硬币是假的,它的重量是%d。
",h,coin[h]);
}
}
else
if(l{
ps=(h-l+1)/3;
sum1=0;
sum2=0;
for(i=1;i<=ps;i++)
{
sum1+=coin[l+i-1];
sum2+=coin[h-i+1];
}
if(sum1==sum2)
FakeCoin_1(coin,n,l+ps,h-ps);
else
if(sum1==coin[l+ps]*ps)
FakeCoin_1(coin,n,h-ps+1,h);
else
FakeCoin_1(coin,n,l,l+ps-1);
}
}
voidFakeCoin()
{
inti=1,n,coin[100];
printf("请输入硬币的个数:
");
scanf("%d",&n);
printf("请输入硬币的重量:
\n");
for(i=1;i<=n;i++)
{
scanf("%d",&coin[i]);
}
FakeCoin_1(coin,n,1,n);
}
实
验
结
果
及
分
析
通过这个实验,理解并掌握了减治法的设计思想并理解了它与分治法的区别。
在写这个算法前,一定要建立正确的求解模型。
实验名称
变治法在排序问题中的应用——堆排序问题
实验室
实
验
目
的
或
要
求
实验题目
用基于变治法的堆排序算法对任意一组给定的数据进行排序
实验目的
1)深刻理解并掌握变治法的设计思想;
2)掌握堆的概念以及如何用变治法把任意给定的一组数据改变成堆;
3)提高应用变治法设计算法的技能。
实验要求
1)设计与实现堆排序算法;
2)待排序的数据可以手工输入(通常规模比较小,10个数据左右),用以检测程序的正确性;也可以计算机随机生成(通常规模比较大,1500-3000个数据左右),用以检验(用计数法)堆排序算法的时间效率。
实
验
原
理
(算
法
基
本
思
想)
堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单。
(1)用大根堆排序的基本思想
(2)大根堆排序算法的基本操作
特点:
堆排序(HeapSort)是一树形选择排序。
堆排序的特点是:
在排序过程中,将R[l..n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系(参见二叉树的顺序存储结构),在当前无序区中选择关键字最大(或最小)的记录
堆排序的最坏时间复杂度为O(nlogn)。
堆序的平均性能较接近于最坏性能。
它是不稳定的排序方法。
程
序
代
码
动生成2.手动输入3.结束\n");
scanf("%d",&choice);
switch(choice)
{
case1:
{for(i=1;i<=n;i++)
a[i]=rand();
printf("产生的随机数为:
");
for(i=1;i<=n;i++)
printf("%d",a[i]);
printf("\n");
};break;
case2:
{printf("输入要排序的数:
\n");
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
};break;
case3:
return;
default:
printf("输入错误!
\n");return;
}
m=n;
while(m>1)
{
Dui_1(a,m);
for(i=1;i<=n;i++)
printf("%d",a[i]);
printf("\n");
t=a[1];
a[1]=a[m];
a[m]=t;
m=m-1;
for(i=1;i<=n;i++)
printf("%d",a[i]);
printf("\n");
}
printf("输出排序的结果:
");
for(i=1;i<=n;i++)
printf("%d",a[i]);
system("pause");
}
}
实
验
结
果
及
分
析
经过这次实验,理解了变治法的设计思想,同时还掌握了堆的概念以及如何用变治法把任意给定的一组数据改变成堆。
心
得
体
会
经过这几次的实验,对算法的分析能力有了较大的提高。
算法分析对于设计出的每一个具体的算法,利用数字作为工具讨论它的各种复杂度,就是算法分析的主要任务。
复杂度分析的结果可以作为评价算法质量的标准之一,有时也可以为改进算法的方向提供参考。
分析算法的复杂度需要较强的数学技巧,针对不同的算法,采用不同的分析方法。
说说Fibonacci序列问题,这个实验让我们更好的理解递归算法和迭代算法的设计思想以及递归程序的调式技术,并应用递归算法和迭代算法效率的理论分析(前验分析)和实际分析(后验分析)方法。
这次实验也让我们理解了蛮力法、分治法、减治法、变治法的设计思想,提高应用蛮力法、分治法、减治法、变治法设计算法的技能。
并且理解了几个重要观点:
不同的算法可以解决相同的问题,这些算法的解题思路不同,复杂程度不同,效率也不同;用蛮力法设计的算法,一般来说,经过适度的努力后,都可以对其进行改进,以提高算法的效率。
建立正角的模型对于问题的求解是非常重要的。
学习了这门课,我们在以后的编程中,将会关注于程序执行的效率,进而决定我们的算法,而不再是盲目的去编程。
这门课也为我们设计算法打下了基础。
同时,我们明白了良好的编程习惯有助于我们更快更高效的编写出可运行的程序。
成
绩
评
定
教师签名:
年月日