算法分析与设计》实验指导与报告书准确1Word下载.docx
《算法分析与设计》实验指导与报告书准确1Word下载.docx》由会员分享,可在线阅读,更多相关《算法分析与设计》实验指导与报告书准确1Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
实验7Warshall算法和Floyd算法8
实验8最优二叉查找树9
实验9Huffman编码*10
实验10求解非线性方程*11
实验11投资问题*12
注:
(1)实验4和实验5为变治法应用,二选一;
(2)实验7和实验8为动态规划法应用,二选一;
(3)带*号的实验为选做实验,根据课时及学生实验完成情况机动安排。
实验1求最大公约数
实验目的
(1)求两个自然数m和n的GCD(GreatestCommonDivisor);
(2)掌握并应用算法的数学分析和后验分析方法;
(3)理解这样一个观点:
不同的算法能够解决相同的问题,但这些算法的思路不同,时间复杂性也不同。
预习内容
P21.1什么是算法
实验内容
(1)设计出3个版本的求最大公约数的算法;
(2)采用C/C++实现算法,利用计数法记录基本语句的执行次数;
(3)采用大O符号分析3种算法的时间复杂性;
(4)通过分析对比,得出结论。
实验结果(可续页)
欧几里得最大公约数算法:
#include<
stdio.h>
intmain()
{
inta,b,c;
printf("
Pleaseinputtwointegers:
"
);
scanf("
%d%d"
&
a,&
b);
if(a<
b)
{
c=a;
a=b;
b=c;
}
while(a%b!
=0)
c=a%b;
%d"
b);
return0;
}
连续整数检测算法最大公约数算法:
inta,b,t;
&
a,&
t=a;
else
t=b;
while(t>
=1)
if((a%t==0)&
&
(b%t==0))
break;
t--;
t);
相减循环:
#include<
intm,n;
%d%d"
m,&
n);
while(m!
=n)
if(m>
n)m=m-n;
elsen=n-m;
m);
教师评分
实验2斐波那契数列
(1)求斐波那契数列;
(2)区分递归和递推思想。
P602.5例题:
斐波那契数列
(1)至少设计出3个版本的求斐波那契数列的算法;
(2)采用C/C++实现算法;
递归方法实现:
intmain(void)
longlonginta=0,b=1,c;
inti,n;
Howmanynumbersdoyouwant:
for(i=1;
i<
=n;
i++)
c=a+b;
printf("
%d:
%Ld\n"
i,c);
b=a;
a=c;
用迭代方法实现:
intf(intn);
intn;
f(n);
intf(intn)
inti,f1=1,f2=1,f3;
if(n<
=0)
输入错误.\n"
elseif(n==1||n==2)
1"
for(i=0;
n-2;
f3=f1+f2;
f2=f1;
f1=f3;
%d\n"
f1);
利用数组实现:
stdlib.h>
math.h>
voidmain()
inta[47];
a[0]=0;
a[1]=1;
for(i=2;
47;
a[i]=a[i-1]+a[i-2];
while(scanf("
n)!
=EOF)
a[n]);
实验3最近对问题
(1)设p1=(x1,y1),p2=(x2,y2),…,pn=(xn,yn)是平面上n个点构成的集合S,设计算法找出集合S中距离最近的点对;
(2)进一步掌握递归算法的设计思想以及递归程序的调试技术;
(3)理解此观点:
分治和递归经常同时应用在算法设计中。
P1134.6.1最近对问题
(1)用分治法求解最近对问题;
(3)分析算法的时间复杂性,并与蛮力法比较,得出结论。
分治法求最近对:
蛮力法求最近对:
intn,i,j,k=0;
floata[5000],b[5000],c[5000],min;
请输入点的数目:
"
请输入点的坐标:
n;
%f%f"
a[i],&
b[i]);
min=(a[0]-a[1])*(a[0]-a[1])+(b[0]-b[1])*(b[0]-b[1]);
for(j=0;
j<
n-1;
j++)
for(i=j+1;
c[k]=(a[j]-a[i])*(a[j]-a[i])+(b[j]-b[i])*(b[j]-b[i]);
c[k]=sqrt(c[k]);
if(c[k]<
min)
{min=c[k];
k++;
min=(int)(min*100)+0.5;
min=min/100;
%.2f\n"
min);
实验4堆排序
(1)实现堆的创建和堆排序;
(2)理解变治法的思想。
P1696.4堆和堆排序
(1)采用C/C++实现堆创建算法;
(2)采用C/C++实现堆排序算法;
(3)分析堆排序算法的时间复杂度,并与合并排序、快速排序比较,得出结论。
实验5霍纳法则和二进制幂
(1)实现计算多项式的霍纳法则;
(2)实现从左至右和从右至左二进制幂算法;
(3)理解变治法的思想。
P1766.5霍纳法则和二进制幂
(1)采用C/C++实现计算多项式的霍纳法则;
(2)采用C/C++实现计算an的从左至右和从右至左二进制幂算法;
(3)分析霍纳法则的时间复杂度,并与蛮力法比较,得出结论。
实验6字符串匹配问题
(1)给定一段文本,在该文本中查找并定位任意给定字符串;
(2)深刻理解并掌握时空权衡的设计思想。
P1947.2字符串匹配中的输入增强技术
(1)采用C/C++实现BM算法的简化算法:
Horspool算法;
(2)利用计数法记录基本语句的执行次数;
(3)分析Horspool算法的时间复杂度,并与蛮力法比较,得出结z论。
实验结果(可续an
实验7Warshall算法和Floyd算法
(1)实现计算有向图传递闭包的warshall算法;
(2)利用Floyd算法计算图的完全最短路径;
(3)深刻理解并掌握动态规划法的设计思想。
P2168.2Warshall算法和Floyd算法
(1)采用C/C++实现算法,利用计数法记录基本语句的执行次数;
(2)采用大O符号分析2种算法的时间复杂性;
(3)通过对2种算法的分析对比,找出的它们的相似处。
实验8最优二叉查找树
(1)实现最优二叉查找树的动态规划算法;
(2)深刻理解并掌握动态规划法的设计思想。
P2238.3最优二叉查找树
(1)采用C/C++实现最优二叉查找树的动态规划算法;
(2)根据实现的代码给出至少含5个键的最优二叉树的主表和根表,并根据根表画出最优二叉查找树;
(3)分析算法的时间复杂度。
实验9Huffman编码*
(1)设需要编码的字符集为{d1,d2,…,dn},出现的概率为{w1,w2,…,wn},应用Huffman树构造最短的变长编码方案;
(2)了解前缀编码的概念,理解数据压缩的基本方法;
(3)掌握贪心法的设计思想并熟练运用。
P2509.4哈夫曼树
(1)设计贪心算法求解Huffman编码方案;
(3)分析算法的时间复杂性。
实验10求解非线性方程*
(1)采用平分法、试位法和牛顿法求解非线性方程;
(2)理解近似算法求解某些问题的思路。
P34212.4解非线性方程的算法
(1)采用C/C++实现求方程近似解的平分法、试位法和牛顿法;
(2)分析三种算法的时间复杂度,比较三种算法的优缺点。
实验11投资问题*
(1)有n项可投资的项目,每个项目需要资金si,可获利润为vi,现有可用资金总数为M,为获得最大利润,应选择那些投资项目?
(2)了解实际问题与理论的异同;
(3)掌握实际问题的求解步骤。
(1)抽象出问题的模型;
(2)设计出2种算法解决投资问题;
(3)采用C/C++实现算法;
(4)分析算法的时间复杂度。