实验一 算法的时间复杂度测试
1、实验目的:
(1)掌握时间复杂度的基本概念。
(2)熟悉程序计算时间的计时方法。
2、实验环境与设备:
已安装Visual Studio 2010(或其以上版本)集成开发环境的计算机。
3、实验原理:
基于计时函数clock()进行毫秒级计时。
4、实验内容:
请编写两个程序,分别调用下列两个函数测试它们在不同计算规模时的运行时间并验证其时间复杂度,尝试画出计算时间相对于计算规模的函数曲线示意图。
(1)在三重循环下的基本加法运算的计算时间与计算规模的关系,其时间复杂度为O( n3 )。函数定义如下:
void add ( int n )
{
int i, j, k ,x;
x = 0;
for( i = 1; i<= n; i++ )
for( j = 1; j <= i; j++ )
for( k = 1; k<= j; k++ )
x++;
}
(2)调用Hanoi函数测试汉诺塔问题的计算时间与计算规模的关系,其时间复杂度为O( 2n )。函数定义如下:
void hanoi( int disc, int start, int temporary, int goal )
{
if( disc == 1)
printf( "%d -> %d\n" , start , goal);
else
{
hanoi( disc - 1, start, goal, temporary );
hanoi( 1, start, temporary, goal );
hanoi( disc - 1, temporary, start, goal );
}
}
5、实验考核:
(1)完成纸质版实验报告
(2)提交电子版作业
6、执行结果示例如下:
汉诺塔计算结果图
注意:测试时,至少给出20个不同的n值(程序1可以让n取值为100、200、300等离散值;程序2可以让disc取值为1、2、3等离散值),函数图像的绘制可以借助Excel来完成,具体步骤如下:
全选这两列,找到插入->散点图,选择下面的所有图表类型,打开。找到xy散点图确定。Excel就会生成下面的图了。
实验源码
#include<stdio.h>
#include<time.h>
//记得整体注释大于90%
//TODO我的注释都是废话
//很简单的东西
void add(int n)
{
int i, j, k, x;
x = 0;
for (i = 1; i <= n; i++)
for (j = 1; j <= i; j++)
for (k = 1; k <= j; k++)
x++;
}
void hanoi(int disc, int start, int temporary, int goal)
{
if (disc == 1)
printf("%d -> %d\n", start, goal);
else
{
hanoi(disc - 1, start, goal, temporary);
hanoi(1, start, temporary, goal);
hanoi(disc - 1, temporary, start, goal);
}
}
int main()
{
int test;
printf("请输入测试的规模:");
scanf_s("%d",&test);
//
/*头*/
//while (scanf_s("%d", &test)!=EOF)
//{
////记得统计时间,填到另一个excel表格中
//clock_t start, end;
//start = clock();
////add(test);
//////每次测试一个
//hanoi(test,1,2,3);
//end = clock();
//printf("计算所需要的时间%f \n", (double)(end - start) * 1000 / CLK_TCK);
//}
/*尾*/
//或者这样用函数
//记得统计时间,填到另一个excel表格中
clock_t start, end;
start = clock();
//add(test);
////每次测试一个
hanoi(test,1,2,3);
end = clock();
printf("计算所需要的时间%f",(double)(end-start)*1000/CLK_TCK);
system("pause");
return 0;
}