在各种论文中我们经常会看到算法复杂度分析。这是一个高频出现的内容。大部分的同学第一反应肯定是 什么是复杂度?算法复杂度是不是算法具体执行了多少次?
其实算法复杂度是指算法的时间复杂度,其单位并不是一次具体的运算(如 加法 乘法 或者寄存器操作等),相反,凡是能够在有限时间内完成的,统称为常数时间操作,是算法复杂度的基本单位。算法的时间复杂度也不是指具体的算法执行次数,而是指随着算法输入规模增加,算法的复杂度增长的规律。因此,算法复杂度是一个极限的概念,也称为渐进复杂度。既然是极限相关的分析,所以我们先给出算法复杂度分析中遵循的四个基本规律:
- 考虑算法复杂度最坏的情况
- 忽略低阶项
- 忽略常数
- 假设输入规模n为无穷大
算法复杂度的相关符号有三个 (), (), (),分别表示上界,下界,和确界。
为了方便我们假设算法复杂度实际上用T(n)表示。接着我们给出三个符号的定义:
- 算法复杂度上界(f(n))表示,存在一个常数c,, 函数f(n), 当n>, T(n)<= cf(n)。
-
算法复杂度下界(f(n)))表示,存在一个常数c,, 函数f(n), 当n>, T(n)>= cf(n)。
-
算法复杂度确界(f(n)))表示,存在尝试c1, c2,, 函数f(n), 当n>, c1f(n)<=T(n)<=c2f(n)。
有了以上的定义,我们稍微做几道联系巩固一下。
ex1 . 我们考虑一下如下的任务,给定两个数组,A,B,我们想知道A,B两个数组有没有公共元素。
这个问题的伪代码如下图所示:
for i=1:n
for j=1:n
if A[i]==B[j]
return True
endif
endfor
endfor
return false
显然,上述问题最坏情况下就是执行次,因此算法复杂度上界为 ()。
为了更好的对前文提到的上界 下界 确界进行理解,我们再一起做一到练习
ex 2. 假设某算法复杂度,则下列说法正确的有:
A.T(n) = (n)
B T(n)=(n)
C T(n)=()
D T(n)=()
正确答案是 BCD,首先T(n) = ()< (), 所以A错,D对。注意代表上界。只是D是一个不太好的上界而已。同理 (n)是一个不太好的下界,所以B对。又,因此C选项也是对的。
希望通过这一篇博文,大家可以明确掌握算法复杂度的定义,其中复杂度上界用的是最多的。另外两个用的比较少。