algorithm - 计算递归关系的时间复杂度 f(n) = f(n/2) + f(n/3)
问题描述
如何计算递归关系 f(n) = f(n/2) + f(n/3) 的时间复杂度。我们有 n=1 和 n=0 的基本情况。
如何计算一般情况的时间复杂度,即 f(n) = f(n/x) + f(n/y),其中 x<n 和 y<n。
Edit-1 :(在发布第一个答案后)考虑的每个数字都是整数。
Edit-2 :(在发布第一个答案后)我喜欢 Mbo 给出的答案,但是否可以在不使用任何花哨的定理(如主定理等)的情况下回答这个问题。比如通过制作树等。
但是用户可以自由地回答他们喜欢的方式,我会尽力理解。
解决方案
在“外行术语”中,您可以获得更大系数的依赖性:
T(n) = T(n/2) + T(n/2) + O(1)
构建调用树n=2^k
并查看最后一个树级别包含2^k
项目、更高级别的2^k-1
项目、下一个2^k-2
等等。序列和(几何级数)
2^k + 2^k-1 + 2^k-2 + ... + 1 = 2^(k+1) = 2*n
所以这种依赖的复杂性也是线性的。
现在获得具有较小(零)第二系数的依赖性:
T(n) = T(n/2) + O(1)
并确保线性复杂度。
似乎很清楚,所讨论的递归复杂性介于这些更简单示例的复杂性之间,并且是线性的。
在一般情况下,复杂分支的递归可以用Aktra-Bazzi 方法解决(比Master theorem更通用的方法)
我认为依赖是
T(n) = T(n/2) + T(n/3) + O(1)
在这种情况下g=1
,要找到p
我们应该数值求解
(1/2)^p + (1/3)^p = 1
并得到p~0.79
,然后整合
T(x) = Theta(x^0.79 * (1 + Int[1..x]((1/u^0.79)*du))) =
Theta(x^0.79 * (1 + 4.8*x^0.21 - 4.8) =
Theta(x^0.79 + 4.8*x) =
Theta(x)
所以复杂度是线性的
推荐阅读
- azure - Azure AD 与自己的 PHP 平台集成
- list - Flutter ReorderableListView 在浏览器中不起作用
- java - C# 中的 Java 椭圆曲线
- python - python递归函数使用self.function
- spacy - Spacy 的(3.1 版)POS 标记器是否依赖于解析器?
- java - OptaPlanner 后台线程未终止
- ios - Xcode 13 命令行替换“instruments -w”以在带有模板的真实 iOS 设备上运行
- c# - 字符串的拆分以及如何加入后面的行?
- docker - 从正在运行的容器创建 docker secret
- javascript - Python中的烧瓶过滤器搜索/列表