我正在使用一种非常具体的分而治之算法,该算法总是将n个元素的问题分为两个子问题,其中n / 2 - 1和n / 2 + 1个元素。
我很确定时间复杂度仍然是O(n log n),但我想知道我怎么能正式证明它。
答案 0 :(得分:0)
在每个递归级别上完成“有用的工作”是一些函数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)
(与数组长度成正比)。因此:
你的假设是正确的。
请注意,即使我们有像
这样的更通用的东西