当前位置:文档之家› 最大公约数的三种算法复杂度分析时间计算

最大公约数的三种算法复杂度分析时间计算

,
昆明理工大学信息工程与自动化学院学生实验报告
( 2011 —2012 学年第 1 学期)
课程名称:算法设计与分析开课实验室:信自楼机房444 2011 年10月 12日
!
一、上机目的及内容
1.上机内容
求两个自然数m和n的最大公约数。

2.上机目的
(1)复习数据结构课程的相关知识,实现课程间的平滑过渡;
(2)掌握并应用算法的数学分析和后验分析方法;
(3)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。


二、实验原理及基本技术路线图(方框原理图或程序流程图)
(1)至少设计出三个版本的求最大公约数算法;
(2)对所设计的算法采用大O符号进行时间复杂性分析;
(3)上机实现算法,并用计数法和计时法分别测算算法的运行时间;
(4)通过分析对比,得出自己的结论。

三、所用仪器、材料(设备名称、型号、规格等或使用软件)
&
1台PC及VISUAL C++软件
四、实验方法、步骤(或:程序代码或操作过程)
实验采用三种方法求最大公约数
1、连续整数检测法。

2、欧几里得算法
@
3、分解质因数算法
根据实现提示写代码并分析代码的时间复杂度:
方法一:
int f1(int m,int n)
{
int t;
if(m>n)t=n;
else t=m;
-
while(t)
{
if(m%t==0&&n%t==0)break;
else t=t-1;
}
return t;
}
根据代码考虑最坏情况他们的最大公约数是1,循环做了t-1次,最好情况是只做了1次,可以得出O(n)=n/2;

方法二:int f2(int m,int n)
{
int r;
r=m%n;
while(r!=0)
{
m=n;
n=r;

r=m%n;
}
return n;
}
根据代码辗转相除得到欧几里得的O(n)= log n
方法三:
int f3(int m,int n)
:
{
int i=2,j=0,h=0;
int a[N],b[N],c[N];
while(i<n)
{
if(n%i==0)
{
j++;。

a[j]=i;
n=n/i;
}
else i++;
}
j++;
a[j]=n;
i=1;

int u;
u=j;
while(i<=j)
{
*10^(-6) 豪秒\n", usetime);
i=0;
start= clock();
while (i<1000000)
;
{
f2(m,n);
i++;
}
finish=clock();
usetime= finish-start;
printf(" 方法二用时%.f*10^(-6) 豪秒\n", usetime);
i=0;
:
start= clock();
while (i<1000000)
{
f3(m,n);
i++;
}
finish=clock();
usetime= finish-start;
?
printf(" 方法三用时%.f*10^(-6) 豪秒\n", usetime);
}
五、实验过程原始记录( 测试数据、图表、计算等)
请给出各个操作步骤的截图和说明;
三种算法得到结果验证结果:

.
计数器:我想到的是做一次循环就加一
计算算法运行时间结果:在计算时间过程中因为计算机的运算速度很快,所以我利用了循环把时间精确得到10-6毫秒
/
~
六、实验结果、分析和结论(误差分析与数据处理、成果总结等。

其中,绘制曲线图时必须用计算纸或程序运行结果、改进、收获)
请结合实验的结果分析算法原理;在实验中遇到了些什么问题,如何解决;有什么收获等;
在本次实验中代码是独自完成的,一开始我感觉这个代码最多半小时就可以完成,但是第三个算法的时候我分析了好久才写出来,在计算三种方法运行时间的时候,我一开始只精确到毫秒(ms),计算结果都是零,后面我写了一个循环调试才发现是我的精确度还在不够,所以我想到了计算算法执行了1000000次之后所用的时间,然后再求平均每次执行的时间。

结果分析:从前面的复杂度O(n)的出欧几里得算法的是最优算法,连续整除法其次,最复杂的是分解质因数算法,再从代码运行的计数器和计算的时间来看结果恰好和前面的复杂度得到的结果一致,所以的出结论:欧几里得算法最优。

从这次实验的结果我了解到了算法的优与劣的差别,虽然得到的是同样的结果,但是需要的时间和资源却相差很大,这提示我们在以后写算法的时候要找出最优算法。

可见算法分析与设计课程的对计编程的人来说是多么的重要,在以后写程序过程中要时刻提醒自己找最优算法,当然得先学会O(n)的分析。

注:教师必须按照上述各项内容严格要求,认真批改和评定学生成绩。

相关主题