目录
一、算法时间复杂度
算法时间复杂度的本质是算法的执行时间,也就是算法中所有语句的频度之和。语句频度就是语句的执行次数,它与算法求解问题的规模大小相关。
二、
假设对于给定的算法,目前问题规模为n,则语句频度可以表示成一个关于问题规模的函数 T(n),那么算法时间复杂度也就可以用T(n)表示,其含义是算法在输入规模为n时的运行时间。
三、
当问题规模很大时,精确的计算T(n)是很难实现而且也是没有必要的。对于算法时间性能的分析无需非要得到时间复杂度T(n)的精确值,它的变化趋势和规律也能清楚地反映算法的时间耗费。基于此,引入了渐进时间复杂度作为时间性能分析的依据,它的含义就是:在问题规模 n趋于无穷大时算法时间复杂度T(n)的渐进上界,即函数 T(n)的数量级(阶)。
四、
算法时间复杂度和渐进算法时间复杂度在实际的算法分析过程中是不予区分的,渐进时间复杂度可以简称为时间复杂度,记为T(n)=O(f(n))。其中,通过统计算法中基本操作重复执行的次数就可近似地得到算法的执行效率,用O(n)表示,称为时间复杂度。
五、渐进时间复杂度
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为O(1),另外,在时间频度不相同时,时间复杂度有可能相同,如T(n)=n2+3n+4与T(n)=4n2+2n+1它们的频度不同,但时间复杂度相同,都为O(n2)。
按数量级递增排列,常见的时间复杂度有:
常数阶O(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n2),立方阶O(n3)、k次方阶O(nk)、指数阶O(2n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
六、 例子:
三个语句:
Temp=i;
i=j;
j=temp;
以上三条单个语句的频度均为 1,该程序段的执行时间是一个与问题规模 n 无关的常数。
算法的时间复杂度为常数阶,记作 T(n)=1+1+1=O(1).
如果算法的执行时间不随着问题规模 n 的增加而增长,即使算法中有 上千条语句,其执行时间也不过是一个较大的常数。
此类算法的时间复杂度是 O(1).
七、补充
O(n)这个大O表示的是最坏情况下的时间复杂度。
举例,一共n^3次乘法和n^3次加法,那么加起来就是2×n^3。
然后如果有一个表达式f(n),使得n趋于无穷大的时候,lim(2×n^3)/f(n)=常数c,那么就可以用大O表示。表示为O(f(n)),而且规定f(n)的表达式是不带常数的系数的,那么在这里f(n)=n^3。
一般用大O表示算法复杂度只需要取次数最高的项,而且去掉系数就OK了,不用每次都这么算的。
三重循环而且每重循环都执行n次的话直接O(n^3)就好了。