创建两个不均匀子问题的分治算法的时间复杂度。
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)
。然而,解决方案变得非常重要,因此我们可能需要做出一些近似来得出最终答案。以上是关于创建两个不均匀子问题的分治算法的时间复杂度。的主要内容,如果未能解决你的问题,请参考以下文章