algorithm - 使用迭代方法解决这种递归关系的步骤是什么?
问题描述
我对分析算法的时间复杂性相对较新,并且无可救药地陷入了这个问题。
T(n) = 2T(n/2) + Θ(n) ; n>1
T(1) = a
我已经明白使用大师的方法有一个简单的解决方案,但我想知道如何使用迭代方法执行此分析。
解决方案
为简单起见替换theta(n)
为n
。(要彻底解决这个问题,您必须扩展theta(n)
out 的定义以获得该术语的上限和下限,并运行与以下相同的分析 - 在实践中很少看到这样做)。
现在假设这n
是 2 的幂:
T(n) = 2T(n/2) + n
= 4T(n/4) + n + n
= 8T(n/8) + n + n + n
= ...
= 2^kT(n/2^k) + kn
最终,n/2^k 为 1,此时 k 为 log_2(n)。
所以T(n) = nT(1) + log_2(n)*n
这n
对 2 的幂有效,但您可以注意到,如果n1
2 的最大幂小于或等于n
,并且n2
2 的最小幂大于或等于n
,那么T(n1) <= T(n) <= T(n2)
,您可以结合以下事实:n1 >= n/2
,n2 <= 2n
以获得所有 n 的 theta(n log n) 边界。
您最常看到的计算或工作与上述相同,但没有说明n
必须是 2 的幂,并且完全掩盖了舍入细节。Sedgewick 是一位严格研究这些细节的作者,例如,当他计算在长度为 n 的数组的合并排序中执行的比较的确切数量时。
推荐阅读
- asp.net-core - 获取错误:实体类型“课程”是使用单个键属性定义的,但有 2 个值被传递给“DbSet.Find”方法
- python - 如何检查熊猫中的文件内容?
- python - HTTP 错误 403:尝试使用 pip 安装 gevent-psycopg2 时需要 SSL
- android - Android OS 不允许运行 android.intent.action.SIM_STATE_CHANGED
- java - 如何在 SpringMVC 中使用单个视图执行所有 CRUD 操作?
- python - VS Code 和 python 调试器返回错误但可以在终端中运行
- c# - QTP/UFT 测试:可等待的 WPF 应用程序(.net)
- c# - MVC Net Core 与 Docker 容器问题
- javascript - Nashorn:猴子修补 Java 对象?
- excel - 如何遍历各个单元格并在另一个工作表中返回值