algorithm - 在恒定时间内运行的分而治之算法?

标签 algorithm divide-and-conquer

你能给我指出一个在恒定时间内运行的分而治之算法的例子吗?我处于一种“天哪!我想不出任何这样的事情”的情况。请指点我一些东西。谢谢

我知道遵循以下递归的算法:T(n) = 2T(n/2) + n 将是合并排序。我们将问题分成 2 个子问题——每个子问题的大小为 n/2。然后我们将花费 n 时间将所有内容重新合并到一个排序数组中。

我也知道 T(n) = T(n/2) + 1 将是 二进制搜索

但是 T(n) = 1 是什么?

最佳答案

对于在恒定时间内运行的分而治之算法,它需要对任何输入执行不超过固定数量的工作。因此,它最多可以对任何输入进行固定次数的递归调用,因为如果调用次数没有限制,完成的总工作量就不会是常数。此外,它需要在所有这些递归调用中做大量的工作。

这基本上消除了任何看起来合理的递归关系。任何形式

T(n) = aT(n / b) + O(nk)

立即就不可能了,因为递归调用的数量会随着输入 n 的增加而增加。

您可以制作一些在恒定时间内运行的高度人为设计的分而治之算法。例如,考虑这个问题:

Return the first element of the input array.

这在技术上可以用分而治之的方式解决,注意

  • 单元素数组的第一个元素等于它本身。
  • n 元素数组的第一个元素是第一个元素的子数组的第一个元素。

那么递归就是

T(n) = T(1) + O(1)

T(1) = 1

如您所见,这是一个看起来很奇怪的重复,但它确实有效。

我从来没有听说过在实践中会出现这样的事情,但如果我想到什么,我会尝试用细节更新这个答案。 (注意:我不希望更新此答案。^_^)

希望这对您有所帮助!

关于algorithm - 在恒定时间内运行的分而治之算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26520631/

相关文章:

c++ - 测量大型方形网格中的簇有哪些好的替代方法?

c - C 中的子字符串方法如何工作

python - 使用分而治之的方法找到列表中出现次数至少为 60% 的元素?

algorithm - n个对象的等价性测试

arrays - 用于查找数组中最小值的分而治之算法

c - 如何从客户端向服务器发送unix命令然后返回结果?

python - 幸运数字八 - Hackerrank-W28

python - 波动检验的MSS-最大似然法

mysql - 在mysql中选择连续的记录 block

algorithm - 证明合并排序输出输入的排列