我正在处理一个非常具体的分而治之的算法,它总是将一个有n个元素的问题划分为n/2-1和n/2 + 1个元素的两个子问题。划分和征服算法的时间复杂度会产生两个不均匀的子问题。
我很确定时间复杂度仍然是O(n log n),但我不知道我怎么能正式证明它。
我正在处理一个非常具体的分而治之的算法,它总是将一个有n个元素的问题划分为n/2-1和n/2 + 1个元素的两个子问题。划分和征服算法的时间复杂度会产生两个不均匀的子问题。
我很确定时间复杂度仍然是O(n log n),但我不知道我怎么能正式证明它。
采取在每个递归级“做了有益的工作”是一些功能f(n)
:
让我们看到,当我们反复代回这本身会发生什么。
T(n)
方面:在递归深度m
:
因此,在每个级别的所有T
组术语的总和由下式给出:
f(n)
术语:看起来很熟悉吗?
的f(n)
条款只有一个递归级别背后的T(n)
条款。因此,调整之前的表现,我们得出以下的总和:
但是请注意,我们只用一个f
-term开始,所以这和有一个无效的边缘情况。然而,这很容易纠正 - m = 1
的特殊结果只是f(n)
。
综合以上,并为每个递归级别求和f
方面,我们到达(几乎)最终表现为T(n)
:
我们接下来需要发现当T
第一加法组术语终止。假设那是n ≤ c
。
的最后呼叫直观地终止了最大的论点,即呼吁:
因此最终表达式由下式给出
回到原来的问题,什么是f(n)
?
你还没有说这是什么,所以我只能假设,工作的每个呼叫完成量ϴ(n)
(正比于数组长度)。因此:
你的假设是正确的。
请注意,即使我们有更多的东西一般喜欢
我终于得到它。谢谢!如果完成的工作量是log(n),而不是n(如在有序数组中搜索)?我想复杂性会落到O(n)。如何调整证明的最后部分? –
更换'F(N)'和'的log(n)'。然而,解决方案变得不重要,所以我们可能需要做一些近似以得出最终答案。 – meowgoesthedog