算法效率的度量方法
-
事后统计方法
-
事前分析估算方法:
- 算法采用的策略,方法。(算法好坏的根本)
- 编译产生的代码质量。(由软件来支持)
- 问题的输入规模。
- 机器执行指令的速度。(硬件性能)
ps:一个程序的运行时间,依赖于算法的好坏和问题的输入规模,规模即指输入量的多少
举个栗子:
第一种算法:
#include<stdio.h>
int main()
{
int i , sum = 0, n = 100; //执行1次
for(i = 1;i <= n;i++) //执行n + 1次
{
sum = sum + i; //执行n次
}
printf("%d", sum); //执行1次
return 0;
}
第二种算法:
#include<stdio.h>
int main()
{
int sum = 0, n = 100; //执行1次
sum = (1 + n) * n / 2; //执行1次
printf("%d", sum); //执行1次
return 0;
}
对比:显然,第一种算法执行了(2n + 3)次,第二种算法执行了(3)次。我们关注的是代码中间部分,如果把循环看成一个整体,忽略头尾循环判断的开销,那么这两个算法就是n次与1次的差距,好坏显而易见。
升级延伸:
#include<stdio.h>
int main()
{
int i, j, x = 0, sum = 0, n = 100;//执行1次
for(i = 1;i <= n;i++)
{
for(j = 1;j <= n;j++)
{
x++;
sum = sum + x;//执行n * n 次
}
}
printf("%d", sum);//执行一次
}
这个栗子就是i从1到100,每次都要让j从1增加到100,这个算法随着n增加,执行时间要远远多于前面两种算法。
这是你应该意识到测定运行时间最可靠的方法是计算对运行时间有消耗的基本操作次数。运行时间与这个计数成正比。