算法导论上写的太mathmetical了,记不住。
以递归式为T(n) = a*T(n/b)+f(n)为例
(1)如果n^>f(n) 则复杂度为O(n) = n^
(2)如果n^=f(n) 则复杂度为O(n) = n^*lgn
(2)如果n^<f(n) 则复杂度为O(n) = f(n)
这阵子在认真地看着算法导论,之前看到第四章计算分治法的时间复杂度的计算方法被称为“主方法”,运用这个主方法可以快速地口算出分治算法的递归式的时间复杂度,以下给出算法导论里关于主方法的描述吧,我就直接截图
不得不说,算法导论是一本非常偏向于数学的算法书,里面的对于各种算法结论的正确性大都有着严格的数学上的推导。之前对于主方法的描述只是大略地看了一下,看是看懂了,但是当时没有刻意将这个结论记下来,当我往后看遇到递归式求解部分的时候发觉还是忘记了主方法的求解过程,只能模糊记得部分而已,昨天晚上再复习的时候,发觉这个描述可以不用带有让人烦恼的 ε ,我是采用了如下的记忆方法~
对于递归式 T(n) = a * T(n/b) + f(n);
1.我们不妨设f(n) = n^k; 我们可以求出 k 的值
2.我们再求出lna/lnb;(即logab,貌似编辑器无法打出对数的下标,就转换成除法啦~)
3.比较lna/lnb 与 k的大小
4.如果k > lna/lnb , 有 T(n) = Θ(f(n)); 如果 k < lna/lnb 有 T(n) = Θ(n ^(lna/lnb));如果k = lna/lnb
则T(n) = Θ(lgn * n^(lna/lnb));
比如T(n) = 9*T(n/3) + n;
有 ln9/ln3 = 2 ; f(n) = n^1 得到 k = 1 有 2 > 1 即得到 T(n) = Θ(n^2);
这样的方法应该会简单点吧~ 我只是觉得算导里面每次对于递归式的求解都要拿一个ε来说事总是有点不爽的感觉,虽然这种方法失去了数学上的严谨证明,。。。。orz
算法导论上写的太mathmetical了,记不住。
以递归式为T(n) = a*T(n/b)+f(n)为例
(1)如果n^>f(n) 则复杂度为O(n) = n^
(2)如果n^=f(n) 则复杂度为O(n) = n^*lgn
(2)如果n^<f(n) 则复杂度为O(n) = f(n)