如何比较两个算法的效率

来源:互联网 发布:淘宝618和双11力度大小 编辑:程序博客网 时间:2024/05/21 10:27

在学算法的时候,经常会涉及分析算法的复杂度和效率的问题,按照书本上的理论通常也能够大概推出个结论。通常都是根据算法中重要的语句去推算,例如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。通过上机实验,在输入相同的数据的情况下,第二个实现程序的用时远远比第一个要快。

 

    通过简单调用一个计算时间的函数,就可以轻松比较出两个实现同样功能的程序的效率。不过在现今计算机速度超快的时代,我们也不会计较这样细微的差别。而一个程序我们更多的是考虑它的可读性等问题。

原创粉丝点击