算法效率的度量方法
*事后统计方法:这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同酸防编制的程序运行时间进行比较,从而确定算法效率的高低。
这种方法有很大的缺陷,必须依据算法事先编制好测试程序,通常需要花费大量时间和精力,如果完了发觉测试的是糟糕的算法,就会功亏一篑。
不同测试环境侧别也不是一般大。
*事前分析估算方法:在计算机程序编写前,依据统计方法对算法进行评估。
经过总结,我们发现一个高级语言编写的程序在计算机上运行所消耗的时间取决于下列因素:
1.算法采用的策略,方案
2.编译产生的代码质量
3.问题的输入规模
4.机器执行的指令速度
注:我们研究算法的复杂度,侧重的是研究算法随着输入规模扩大增长量的一个抽象,而不是精确地定位需要执行多少次,因为如果这样的话,我们又得考虑编译器优化等问题。
我们在分析一个算法的运行时间时,重要的是把基本操作的数量和输入模式关联起来。
不计那些循环索引的递增和循环终止条件、变量声明、打印结果等操作。
函数的渐进增长
举例1:
两个算法的输入规模都的n,算法A要做2n+3次操作(可以这样理解:先执行n次循环,再执行一个n次循环,最后还有3次运算),算法B要做3n+1次操作。哪一个更快些呢?
函数的渐进增长:给定的两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总是比g(n)大,那么,我们说f(n)的增长渐进快于g(n)。
随着输入规模增大,加法的常量可以忽略。
举例2:
算法C是4n+8,算法D是2n^2 + 1。
与最高次项相乘的常数并不重要,也可以忽略。
举例3:
算法E是2n^2+3n+3,算法F是2n^3+3n+1。
最高项的指数越大,增长约快。
算法时间复杂度
定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)=O(f(n))。它便是随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度。其中,f(n)是问题规模n的某个函数。
一般情况下,随着输入规模n的增大,T(n)增长最慢的算法为最优算法。
时间复杂度的攻略:
1.用常数1取代运行时间中的所有加法常数。
2.在修改后的运行函数中,只保留最高阶项。
3.如果最高阶项存在并且不是1,则去除与这个项相乘的常数。
4.得到的最后结果就是大O记。
常数阶O(1).
线性阶O(n).
平方阶O(n^2).
对数阶
int i = 1,n = 100;
while(i<n)
{
i = i*2;
}
O(logn)
函数调用的时间复杂度分析
常用的时间复杂度所耗费的时间从小到大依次是:O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)
算法的空间复杂度
时间和空间的相互转换,如判断是不是闰年的算法。
方法一就是写一个判断语句;
方法二是列出一个2050的数组,进行查表。