算法效率前沿:
事前分析估算方法:在计算机程序编写前,依据统计方法对算法进行估算。
程序运行是所消耗的时间却决于:
1.算法采用的策略和方案
2.编译产生的代码的质量
3.问题的输入规模
4.机器执行指令的速度
所以程序运行的速度快慢除了依靠硬件和软件之外,就是算法的质量和输入的规模
引入时间复杂度
1.第一种:
int i, sum = 0, n = 100; //执行1次
for (i = 1;i <= n;i++)//执行n+1次
{
sum = sum + i;//执行n次
}
执行次数为:2n+2
2.第二种:
int sum = 0, n = 100; //执行1次
sum = (1 + n) * n / 2;//执行1次
执行次数为:2
如果我们把循环看作一个整体,忽略头尾判断的开销,那么这两个算法其实就是n和1的差距。即第一种的时间复杂度是n,第二种的时间复杂度是1。
研究算法的复杂度,侧重的是研究算法随着输入规模扩大增长量的一个抽象,而不是精确的定位需要执行多少次。
这样,不计那些循环索引的递增和循环终止条件,变量声明,打印结果等操作。最终,在分析程序的运行时间时,最重要的是把程序堪称是独立于程序设计语言的算法或一系列步骤。
Test1:2n+3次执行次数 VS 3n+1次执行次数
随着n的增长,后面的+3和+1其实是不影响最终的算法变化曲线,所以我们可以忽略这些加法常数。
Test2:4n+8次执行次数 VS 2n²+1次执行次数
随着n的增长,哪怕去掉与n相乘的常数,两者的结果还是没有改变,算法4n+8的次数随着n的增长,还是远小于算法2n²+1
Test3:2n²+3n+1 VS 2n³+3n+1
随着n的增长,最高次项的指数大的,函数随着n的增长,结果也会变得增长特别快
Test4:2n²+3n+1 VS 2n²
随着n的增长,最后求得的值就会非常的近似,所以判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,而更应该关注主项(最高项)的阶数。