创建两个不均匀子问题的分治算法的时间复杂度。

Posted

技术标签:

【中文标题】创建两个不均匀子问题的分治算法的时间复杂度。【英文标题】:Time complexity for a divide and conquer algorithm that creates two uneven subproblems. 【发布时间】:2018-03-16 00:35:30 【问题描述】:

我正在使用一种非常具体的分治算法,该算法总是将具有 n 个元素的问题划分为具有 n/2 - 1 和 n/2 + 1 个元素的两个子问题。

我很确定时间复杂度仍然是 O(n log n),但我想知道如何正式证明它。

【问题讨论】:

【参考方案1】:

将每个递归级别的“有用工作”作为某个函数f(n)

让我们观察当我们反复将其替换回自身时会发生什么。


    T(n) 条款:

发现模式了吗?

在递归深度m:

有递归调用T T 的每个参数中的第一项是 第二项的范围从到,步长为

因此,每个级别的所有T-terms 的总和由下式给出:


    f(n) 条款:

看起来很眼熟?

f(n)恰好在T(n) 项之后一个递归级别。因此,调整前面的表达式,我们得出以下总和:

但请注意,我们仅以 one f-term 开头,因此该总和具有无效的边缘情况。然而,这很容易纠正 - m = 1 的特殊情况结​​果只是 f(n)


结合上述内容,并对每个递归级别f 项求和,我们得到T(n) 的(几乎)最终表达式:


接下来我们需要找出T-terms 的第一个求和何时终止。假设那是n ≤ c

last 直观地调用终止具有最大的参数,即调用:

因此最终表达式为:


回到原来的问题,f(n)是什么?

你还没有说明这是什么,所以我只能假设每次调用完成的工作量是ϴ(n)(与数组长度成正比)。因此:

你的假设是正确的。


请注意,即使我们有更一般的东西,例如

如果a 是某个不等于 1 的常数,我们将仍然得到ϴ(n log n) 作为结果,因为上述等式中的 项抵消了:

【讨论】:

我终于明白了。谢谢!如果完成的工作量是 log(n),而不是 n(比如在有序数组中搜索)怎么办?我想复杂度下降到 O(n)。如何调整证明的最后部分? f(n) 替换为log(n)。然而,解决方案变得非常重要,因此我们可能需要做出一些近似来得出最终答案。

以上是关于创建两个不均匀子问题的分治算法的时间复杂度。的主要内容,如果未能解决你的问题,请参考以下文章

分治算法

分治算法

分治算法总结(未完结)

数据结构与算法——分治算法

分治算法

分治算法——汉诺塔问题