算法的复杂度
1、算法的时间复杂度
事前预估算法时间开销T(n)与问题规模n的关系(T表示“time”)
记作:T(n)=O(f(n)) 叫做大O记法
随着n增大,T(n)增长最慢的算法为最优算法。
求时间复杂度:
注意:
1.可以忽略顺序执行的代码,它只会影响常数项
2.只需挑循环中的一个基本操作分析它的执行次数与n的关系即可
3.如果有多层嵌套循环,只需关注最深层循环循环了几次
步骤:
①找到一个基本操作(最深层循环)
②分析该基本操作的执行次数x与问题规模n的关系x=f(n)
③x的数量级O(x)就是算法时间复杂度T(n)
效率排序:
O(1)<
O
(
log
2
n
)
O(\log_{2}{n})
O(log2n)< O(n) <
O
(
n
log
2
n
)
O(n\log_{2}{n})
O(nlog2n) <
O
(
n
2
)
O(n^2)
O(n2) <
O
(
n
3
)
O(n^3)
O(n3)<
O
(
2
n
)
O(2^n)
O(2n)<
O
(
n
!
)
O(n!)
O(n!)
三种复杂度
最坏时间复杂度:考虑输入数据“最坏”的情况
平均时间复杂度:考虑所有输入数据都等概率出现的情况
最好时间复杂度:考虑输入数据“最好”的情况
2、算法的空间复杂度
评估程序执行时所需的储存空间。
求空间复杂度:
-
普通程序
①找到所占空间大小与问题规模相关的变量
②分析所占空间x与问题规模n的关系x=f(n)
③x的数量级O(x)就是算法空间复杂度S(n) -
递归程序
①找到递归调用的深度x与问题规模n的关系x=f(n)
②x的数量级O(x)就是算法空间复杂度S(n)
注:有的算法各层函数所需存储空间不同,分析方法略有区别
空间复杂度用S(n)表示 S(space) eg.S(n)=O(n)
eg.
int n 4字节
int flag[n] 4*n字节
int i 4字节
上述代码所需内存空间=4+4n+4=4n+8 字节
所以时间复杂度为:S(n)=O(4)+O(4n)+O(4)
忽略常数项,只保留最高阶的项,且系数变为1,最终时间复杂度:S(n)=O(n)
以上图片来自王道数据结构视频,如侵权请联系删除