算法复杂度,求解递归方程

Posted

技术标签:

【中文标题】算法复杂度,求解递归方程【英文标题】:Algorithm complexity, solving recursive equation 【发布时间】:2013-10-09 22:21:45 【问题描述】:

我正在学习数据结构和算法课程,但我被这个递归方程困住了:

T(n) = logn*T(logn) + n

显然这不能用主定理来处理,所以我想知道是否有人对求解这个递归方程有任何想法。我很确定应该通过更改参数来解决它,例如将 n 视为 2^m ,但我无法找到任何好的解决方法。

【问题讨论】:

我认为这些理由不足以说这不是一个递归方程,因为毕竟 T(n) 取决于 T 的另一个值,所以这使它成为递归的。而且根据我们老师的说法,开始条件应该自己猜,有时甚至不需要开始条件,比如使用主定理时。 准确地说,函数可以递归地定义,方程可以有递归。您是否尝试为该函数枚举一些值?智能猜测应该是第一次尝试,很容易通过归纳来检查猜测是否正确。 感谢 Daniel 的更正,但对此没有任何猜测,您有什么想法吗? 这个问题在这个话题上已经解决了,cs.stackexchange.com/questions/14775/… 这个问题似乎跑题了,因为它与编程无关。 【参考方案1】:

答案是Theta(n)。要证明某个东西是Theta(n),你必须证明它是Omega(n)O(n)Omega(n) 在这种情况下很明显,因为 T(n)>=n。要显示T(n)=O(n),首先

    选择一个较大的有限值N,使得log(n)^2 < n/100 对应所有n>N。这是可能的,因为log(n)^2=o(n)。 选择一个常量C>100,使得T(n)<Cn 代表所有n<=N。这是可能的,因为N 是有限的。

我们将对所有n>N 归纳地证明T(n)<Cn。由于log(n)<n,根据归纳假设,我们有:

T(n) < n + log(n) C log(n) 
     = n + C log(n)^2
     < n + (C/100) n 
     = C * (1/100 + 1/C) * n
     < C/50 * n
     < C*n

事实上,对于这个函数,甚至可以使用类似的参数来显示T(n) = n + o(n)

【讨论】:

老兄,你的最终答案是正确的,但你的证明是错误的!它不是 logn^2 ,它的 logn*T(logn) !我想你忘记了! T(log n) en.wikipedia.org/wiki/Mathematical_induction 是的,当我检查我的教科书时,你的方法是对的,我错了。我犯了这个错误是因为你使用归纳法的方式与我学到的方法略有不同(比如选择常数 c 和 n)。无论如何,谢谢【参考方案2】:

这绝不是官方证明,但我认为是这样的。

关键是+ n 部分。因此,To(n) 为界。 (或者那应该是大欧米茄?我生疏了。)所以让我们假设T(n) = O(n) 并尝试一下。

代入原来的关系

T(n) = (log n)O(log n) + n
     = O(log^2(n)) + O(n)
     = O(n)

所以它仍然成立。

【讨论】:

这完全是错误的,我的朋友,我会投票给你,但我不能。 哈哈好吧我承认我不确定这个解决方案。需要详细说明吗? 好吧,我认为你的错误是对于 T(logn) 你不能只写 O(logn) ,因为我们不知道函数 T(logn) 中的 logn 会发生什么。 @AshkanKzme:当对您在 cs.SE 的交叉帖子的已接受答案的解决方案也说 T (n) 是 O(n)?上面的答案中有一些符号滥用,但并不比问题本身所包含的更多。 这是正确的。您可以通过说“假设 T(n)&lt;cn 对应于 n&lt;5”,然后使用强归纳来使其更加严格。 (是的,它应该是大欧米茄。)

以上是关于算法复杂度,求解递归方程的主要内容,如果未能解决你的问题,请参考以下文章

3.4.3递归算法的效率分析

请问递归算法的时间复杂度如何计算呢?

(算法专题)使用常微分方程将递归转换为非递归

算法设计与分析知识点整理

算法设计与分析知识点整理

算法设计与分析知识点整理