在学算法的时候,经常会涉及分析算法的复杂度和效率的问题,按照书本上的理论通常也能够大概推出个结论。通常都是根据算法中重要的语句去推算,例如for 循环语句等。那么有没有可以用程序去真正上机实验的办法呢?
其实方法也是很简单,如果我们用的是C语言,可以利用#include <sys/timeb.h> 文件中的ftime()函数完成。具体举例如下:
程序1:
#include <stdio.h>
#include <sys/timeb.h>
int main(void)
{
timeb t1,t2;
long t;
double x,sum = 1, sum1;
int i,j,n;
printf("请输入x n: ");
scanf("%lf%d",&x,&n);
ftime(&t1);//求程序运行到此的当前时间
for (i = 1;i <= n;i++)
{
sum1 = 1;
for (j = 1;j <= i;j++)
{
sum1 = sum1 * (-1.0/x);
}
sum += sum1;
}
ftime(&t2);//求程序运行到此的当前时间
t = (t2.time - t1.time)*1000+(t2.millitm-t1.millitm);//计算时间差;
printf("sum= %lf 用时 %ld毫秒\n",sum,t);
return 0;
}
输入:123 10000
输出:sun= 0.991935 用时 325 毫秒
程序2:
#include <stdio.h>
#include <sys/timeb.h>
int main(void)
{
timeb t1,t2;
long t;
double x,sum = 1, sum1 = 1;
int i,n;
printf("请输入x n: ");
scanf("%lf%d",&x,&n);
ftime(&t1);//求程序运行到此的当前时间
for (i = 1;i <= n;i++)
{
sum1 = sum1 * (-1.0/x);
sum += sum1;
}
ftime(&t2);//求程序运行到此的当前时间
t = (t2.time - t1.time)*1000+(t2.millitm-t1.millitm);//计算时间差;
printf("sum= %lf 用时 %ld毫秒\n",sum,t);
return 0;
}
输入:123 10000
输出:sun= 0.991935 用时 1 毫秒
分析: 其实两个函数实现的功能都是一样的,计算 1-1/x+1/x*x... 第一个程序的频度表达式为(1+n)*n/2,它的时间复杂度是n的平方。第二个实现程序的频度表达式为 n,时间复杂度也是n。通过上机实验,在输入相同的数据的情况下,第二个实现程序的用时远远比第一个要快。
通过简单调用一个计算时间的函数,就可以轻松比较出两个实现同样功能的程序的效率。不过在现今计算机速度超快的时代,我们也不会计较这样细微的差别。而一个程序我们更多的是考虑它的可读性等问题。