算法复杂度

总述

算法复杂度分为时间复杂度和空间复杂度。时间复杂度是指执行这个算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。

也欢迎大家关注微信公众号:Monhitul ,可以查看更多内容跟资源。

时间复杂度

for(i=1;i<=n;++i){
    for(j=1;j<=n;++j){
        c[i][j]=0;
        for(k=1;k<=n;++k){
            c[i][j]+=a[i][k]*b[k][j];
        }
    }
}

在上面所示的两个N×N矩阵相乘的算法中,“乘法”运算是“矩阵相乘问题”的基本操作。整个算法的执行时间与该基本操作(乘法)重复执行的次数 n³ 成正比,记作 T(n)=O(n³)

一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作 T(n)=O(f(n)) 。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度(asymptotic time complexity),简称时间复杂度。

显然,多数情况下原操作应该是最深层循环内的语句中的原操作,它的执行次数和包含它的语句的频度相同。语句的频度是指该语句重复执行的次数。

算法复杂度

O(1)<O(log₂n)<O(n)<O(n²)<O(n³)<O(2ⁿ)

由于算法的时间复杂度考虑的只是对于问题规模n的增长率,则难以精确计算基本操作执行次数(或语句频度)的情况下,只需求出它关于n的增长率或阶即可。比如下面的程序中:

for(i=2;i<n;++i)
    for(j=2;j<=i-1;++j){
    ++x;a[i][j]=x;
    }

语句++x的执行次数关于n的增长率为n²,它是语句频度表达式(n-1)(n-2)/2中增长最快的项。

空间复杂度

空间复杂度(space complexity)记作:S(n)=O(f(n))

若额外空间相对于输入数据量来说是常数,则称次算法为原地工作。

宣传

微信公众号:Monhitul
学习娱乐两不误,一个主攻Java开发,兼顾娱乐的公众号。
算法复杂度