【问题标题】:Divide and Conquer alg that runs in constant time?以恒定时间运行的分而治之的算法?
【发布时间】:2014-12-18 16:20:26
【问题描述】:
您能否向我指出一个在 CONSTANT 时间内运行的分而治之算法的示例!我处于“天哪!我想不出任何这样的事情”的情况。请给我指点东西。谢谢
我知道遵循以下重复的算法:T(n) = 2T(n/2) + n 将是merge sort。我们将问题划分为 2 个子问题——每个子问题的大小为 n/2。然后我们会花 n 时间将所有内容重新归入一个排序数组。
我也知道T(n) = T(n/2) + 1 将是binary search。
但是T(n) = 1?是什么
【问题讨论】:
标签:
algorithm
divide-and-conquer
【解决方案1】:
要让分治算法在恒定时间内运行,它只需要对任何输入执行固定数量的工作即可。因此,它最多可以对任何输入进行固定数量的递归调用,因为如果调用的数量是无限的,那么完成的总工作将不是一个常数。此外,它需要在所有这些递归调用中做大量的工作。
这基本上消除了任何看起来合理的递归关系。任何形式
T(n) = aT(n / b) + O(nk)
是不可能的,因为递归调用的数量会随着输入 n 的函数而增长。
您可以制作一些在恒定时间内运行的高度人为的分而治之的算法。例如,考虑这个问题:
返回输入数组的第一个元素。
这在技术上可以通过分而治之来解决
- 单元素数组的第一个元素等于自身。
- n 元素数组的第一个元素是仅第一个元素的子数组的第一个元素。
然后是递归
T(n) = T(1) + O(1)
T(1) = 1
如您所见,这是一个看起来很奇怪的重复,但确实有效。
我在实践中从未听说过这样的事情,但如果我想到任何事情,我会尝试用细节更新这个答案。 (注:我不希望更新这个答案。^_^)
希望这会有所帮助!