对于基与应用层面的算法,在现在的计算机硬件环境其实还是比较少需要考虑这个问题了,特别是pc机的编程,内存空间越来越大,所以被考虑得也越来越少,不过一个好的程序员,都应该对自己的程序有要求,每一个for比别人少一次判断1000个for就能够少掉很多的运行时间。所以能够理解,能够大概的去运用"效率度量"还是有很大意义的。
一, 一两个基本的概念:
算法的效率度量有两种方法:1,事后统计方法。2,事前统计方法
额,其实第一种度量方法话,还是比较少用的,大部分时候我们用事前统计方法,因为第一种度量法存在一些问题,比如硬件,同个算法,不同类型的cpu,不同的开发语言,不同的编译器,跑起来的时间就真的还是有差距的。而用第二种方法是采用估算的方式的相对比较科学,它只要脱离了第一种算法的误差,这个后面我们会慢慢的体验到。
二,事前统计方法之时间复杂度
首先我们应该知道一个算法是由控制结构(顺序,分支,循环结构)和原操作组成,也是影响算法效率的主要因素,所以在时间复杂的计算中,我们主要考虑的就是这两个方面的影响,对于同一个问题的不同算法,通常我们做法是,从算法中选取一种对于所研究问题来说是基本操作的原操作,以基础操作重复执行的次数作为算法的时间度量
一个简单的时间复杂度例子
下面是一个NxN矩阵相乘的例子
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
a[i][j]=0;
for(int k=0;k<n;k++)
{
a[i][j]+=a[i][k]*a[k][j];
}
}
}
算法的基本操作(原操作)我们以最深层次循环下的操作作为原操作,这个算法有三个循环,所以根据时间复杂度的计算方法T(n)=O(f(n)),其中f(n)=n^3,所以原操作执行了n^3次(我们称为频度),所以这个算法的时间复杂度为O(n^3),这个所以矩阵相乘的时间复杂度为:O(n^3)立方阶
总结:
由以上的例子我们可以得知对于一类算法只需要选择一种基本操作来讨论算法的时间复杂度即可,有时需要同时考虑几种基本操作,甚至可以对不同的操作赋予不同权值,以反映不同操作所需时间,这种做法便于综合比较解决同一问题的两种完全不同的算法。
一句话概括全部以上废话:时间复杂度的计算就是控制结构里最深层次下的操作的执行次数。
时间复杂度的各种对比: O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(2^n)<O(n^n)