计算递归使用重复展开

Posted

技术标签:

【中文标题】计算递归使用重复展开【英文标题】:Calculate the recurrence use repeated unfolding 【发布时间】:2018-03-25 19:25:57 【问题描述】:

我正在尝试计算 T (n) = 2 T (n/2) + n (log n)^2。 按照我得到的步骤:

=2^kT(n/2^k)+ nlog2 (n/2^(k-1))+ nlog2 (n/2^(k-2))+…+ n(log (n/2))^2 + n (log2 n)^2

当 n=2^k 我得到:

但我不知道如何简化求和公式并获得 Θ() 表示法。 任何人都可以帮忙吗?非常感谢

【问题讨论】:

提示:闭式级数解在索引i 中是二次的。扩展它以给出三个系列并使用整数幂求和的标准公式 对数幂求和的标准公式是什么(不是整数)? 如果您使用对数规则,您会发现实际上是对整数幂而不是对数本身求和,后者是“系数”。我会尽快发布答案 好的,谢谢 【参考方案1】:

你的总结在我看来不太正确。让我们重新推导它:

...在m 迭代之后。假设停止条件为n = 1(不失一般性):

... 我们使用了两个对数规则。如您所见,总和实际上是“免费索引”而不是日志本身。使用以下整数幂和:

...我们得到:

为了评估 Θ-notation,最高阶项是:

【讨论】:

非常感谢!您能在 m 次迭代后解释为什么要删除 2^m*T() 吗?我可以使n = 2 ^ m吗?例如,如果 T (n) 是 n 这就是“停止条件”的意思——满足后不再递归。您可以使用 n=2^m 以另一种方式进行,但我认为自上而下的方法更直观 非常感谢,迁移后为什么要删除“2^mT()”的问题?应该是nC(C是常数) 不确定您所说的“迁移”是什么意思?通常在停止条件下,函数只返回一个常量,无论如何都可以忽略。 是的,我的意思是 T(n/2^m) 可以忽略,但也许可以将 2^m 解释为 n?【参考方案2】:

如果你看过Master theorem,你会发现你问的问题其实是Master Theorem2nd案例(参考上面的链接)。

所以,这里是a=2b=2f(n) = 0[n^(c_crit)(log n)^k],其中k=2 和c 称为c_crit = log a to base b = 1

所以,根据主定理,T(n) = 0[(n^c_crit)(log k)^(k+1)] = 0[n(log n)^3]

【讨论】:

@flower 如果您想接触更多此类问题,请查看此处 (dei.unipd.it/~geppo/DA2/DOCS/recurrences.pdf)。如果您参考该链接,可能您的大部分疑问都会得到解决。 非常感谢,但您知道对数幂(不是整数)求和的标准公式吗?因为对于这个我想尝试没有主定理。只需这最后一步,我就能得到它。在这种情况下,只需证明总和为 (logn)^3。 @flower 你想要哪种日志功率!因为泛化它是非常困难的。对于整数,不管它有多长和多复杂,你仍然可以找出来。对数,不容易!!

以上是关于计算递归使用重复展开的主要内容,如果未能解决你的问题,请参考以下文章

如何解决由于强制展开导致的致命意外零错误[重复]

递归查找目录中文本文件的数量[重复]

动态规划与递归区别

在Haskell中表达一个简单的递归函数的问题[重复]

递归算法的理解与应用

由于从 api 展开值而崩溃(使用 Alamofire)[重复]