1.渐进符号
- Θ符号,f(n) = Θ(g(n)),表示f(n)的复杂度既大于等于*g(n)的复杂度,又小于等于g(n)的复杂度,即于g(n)的复杂度相当*。
- O符号,f(n) = O(g(n)),表示f(n)的复杂度最多与g(n)一个数量级,即小于等于。
Ω符号,f(n) = Ω(g(n)),f(n)的复杂度最少与g(n)一个数量级,即大于等于。
o符号,f(n) = o(g(n)),表示f(n)的复杂度要比g(n)的数量级小,即小于。
例如2n = o(n^2) ,但是2n^2 != o(n^2)- ω符号,f(n) = ω(g(n)),表示f(n)的复杂度要比g(n)的数量级大,即大于。
2.递归式
算法设计中经常会用到递归,利用递归式的方法可以清晰地显示算法的整个过程,而对于分析算法的复杂度,解递归式就有了用处。
1. 代换法
利用数学归纳法证明递归式的时间复杂度是否符合上界或下界。
例如 T(n)= 4T(n/2) +n , [T(1) = O(1)]
假设T(k) ≤ ck^3 (k<n) ,带入上面递归式,得到
T(n) ≤ 4c(n/2)^3 + n = 1/2cn^3+n = cn^3-(1/2cn3-n)≤cn^3
这样就得到了一个上界O(n^3)。
假设T(k) ≤ ck^2 (k<n) ,带入上面递归式,得到
T(n) ≤ 4c(n/2)^2 + n =cn^2+n= cn^2-(-n)
因此这里无法得到T(n) ≤cn^2,也就是说O(n^2)不是T(n)的上界。
2. 递归树
在递归树中,每一个结点都代表一个子代价,每层的代价是该层所有子代价的总和,总问题的代价就是所有层的代价总和。
所以,我们利用递归树求解代价,需要知道,一个是每一层的代价,一个是树的高度。
如下面的例子所示:
得最后的Θ(n)= n^2。
3.主定理方法
主定理方法的证明
如下图所示,最后的叶节点数量为 a^(logbn) = n^(logba),因此O(n)的取值和f(n)以及叶节点数量有关。
1,整个递归树的权重从根节点到叶节点一直增加,所以整个递归树的权重主要在叶子节点上;
2,(k = 0)递归树每层的权重大致相同,总共h层,所以整个递归树的权重将各层的权重加起来即可;
3,则与CASE 1的情况正好相反,所以整个递归树的权重主要在根节点上。