algorithm - 多重递归算法的时间复杂度
问题描述
我正在尝试了解以下算法的时间复杂度:
static int g(int[] a) {
return g(a, 0, a.length-1);
}
static int g(int[] a, int i, int j) {
if(i == j) return a[i];
int onefourth = (j+1-i)/4;
return g(a, i, i+onefourth) + g(a, i+onefourth+1, j);
}
这是我的尝试:
算法 g(int[] a, int i, int j) 将数组 a 的维度拆分为 4,并通过多次递归递归调用自身。我可以写出以下递归方程 T(n) = T(n/4) + T(3n/4) + c = .... = T(n/4^k) + T(3n/4^k) + kc。在这里,我无法选择 k 的值。任何人都可以帮助我吗?
解决方案
我不知道你学了什么技术,但我知道我会如何从头开始解决这个问题。
当您划分问题时,将递归调用的成本按比例分配到较低级别。然后询问可以分配给底部任何值的最大值是多少。
这就是我的意思。
如果您正在查看长度范围,1
您将有一些固定成本c
。
如果您正在查看一个长度范围,2
您将有一个恒定的递归成本r
平均划分为每个元素的成本c+r/2
。
如果您正在查看一个长度范围,3
则第一个元素将获得成本,c + r/3
但后一对首先获得2/3 r
顶层,然后将其分成 2 和另一个递归成本,总成本为c + r/2 + r/3
.
等等。
现在是挑战。可归因于特定调用的最大递归成本是多少?链中某处的最坏情况是r
它的级别,加上3/4 r
它上面的级别,加上它上面(3/4)^2 r
的级别,等等。你能找到一个上限吗?
你能把这个上限变成归因于底部单个元素的成本上限吗?
乘以元素的数量,你就会得到你的O(n)
.
推荐阅读
- php - 对嵌套对象应用回调
- vb.net - 我需要把它从一个子改写成一个函数
- dns - Windows Server 2019 - IP 和计算机名称的 Ping 不匹配,但应该匹配
- batch-file - 批量获取重定向输出
- printing - 从桌面上传文本文件时。每次我插入出生日期后,我都会收到此错误
- python - 有序 = True 不被尊重。蟒蛇+棉花糖+烧瓶
- charts - Overlapp Google area图表
- swift - SwiftUI managedObjectContext 在 appExtension 中加载
- python - Python 正则表达式从字符串中获取浮点数对(如果存在)
- azure-web-app-service - .net core 3.1 Azure 多实例扩展应用服务中不尊重 web.config 设置?