算法分析之时间复杂度与空间复杂度

算法的评价指标主要是正确性,健壮性、可读性和有效性4个方面,有效性又包括时间复杂度和空间复杂度。

算法的时间复杂度和空间复杂度通常采用数量级的形式来表示,而数量的形式有常量阶、对数阶、线性阶、线性对数阶、平方阶、立方阶、指数阶、阶乘阶等。若算法的时间复杂度和空间复杂度越好,则算法的执行效率越高。

1、时间复杂度

1.1、时间频度T(n):一个算法花费的时间与算法中语句的执行次数成正比。一个算法中的语句执行次数称为语句频度或时间频度,记为T(n)。

如下列算法段的语句频度:T(n)=1+2+......+n=n(n+1)/2

for(I=1;i<n;i++)
{
    for(j=1;j<i;i++)
    {
       ;
    }
}

1.2、时间复杂度

在时间频度中,n称为问题的规模,T(n)随着n的不断变化而不断变化。

设f(n)是T(n)的一个辅助函数,定义:

a.当n大于等于某个足够大的正整数n_0时,存在两个正常数A和B(A\leqslantB),使得A\leqslant \frac{T(n)}{f(n)}\leqslant B均成立;

或b.\lim_{n\rightarrow+\infty}\frac{T(n)}{f(n)}=A(A为常数),

则称f(n)是T(n)的同数量级函数。把T(n)表示成数量级的形式为:T(n)=O(f(n)),O为英文Order(数量级)首字母。

如:T(n)=\frac{n(n+1)}{2},则有\lim_{n\rightarrow+\infty}\frac{T(n)}{n^2}=\frac{1}{2},故其时间复杂度为O(n^2),即T(n)与n^2数量级相同。

例:分析以下程序段的时间复杂度

i=1;                /***********①***********/
while(i<=n)
    i =i*2;         /***********②***********/

解:该程序语句①频度为1;

设语句②的频度为f(n),则有2^{f(n)}\leqslant n,即f(n)\leqslant\log_2n,取最大值f(n)=\log_2n

T(n)=1+f(n)=1+\log_2n=O(\log_2n)

1.3、总结

按数量级的增排序,常见的时间复杂度有:

常量阶O(1)、对数阶O(\log_2n)、线性阶O(n)、线性对数阶O(n\log_2n)、平方阶O(n^2)、立方阶O(n^3)、指数阶O(2^n)、阶乘阶O(n!)等。

通常把算法中的基本操作重复执行的频度称为算法的时间复杂度。算法中的基本操作一般是指算法中最深层循环内的语句。因此,算法中基本操作重复执行的频度T(n)是问题规模n的某个函数f(n),记作T(n)=O(f(n))

如果一个算法没有没有循环语句,则算法的基本操作的执行频度与问题规模n无关,记作O(1)。如果一个算法只有一重循环,则算法的基本操作的执行频度随问题规模n的增大而呈线性增大关系,记作O(n)

一个算法的时间复杂度最好是常数阶,最坏不超过k次幂阶。如果算法的时间复杂度为指数阶,则该算法无法使用。

2.空间复杂度

2.1、空间频度:一个算法在执行时所占用的内存开销,称为空间频度。

2.2、空间复杂度:指程序从开始到结束所需要的内存容量,即存储量。

程序运行所需要的存储空间包括:

a.固定部分:与所处理数据的大小和个数无关。主要包括程序代码、常量、简单变量、定长成分的结构变量所占的空间;

b.可变部分:一部分空间大小与算法在某次执行处理的特定数据的大小与规模有关;另一部分包括递归栈所需的空间及动态分配空间。

猜你喜欢

转载自blog.csdn.net/u011591807/article/details/82927241