TL;DR:我认为递归是 nO(log n),这是超多项式但次指数。我没有匹配的下限,我怀疑这很严格,但这是进步!
我想我可以得到一个次指数但超多项式的上限。结合@Adam Rosenfield 的回答表明没有多项式界限,这表明
- 递归没有多项式界限,但是
- 任何指数界限都必须是弱的。
我们要解决的递归是
T(n) = T(n - 2) + T(n / 2) + 1
T(1) = T(2) = 1
我的一个想法是,我们也许可以按特定顺序评估这种重复。假设您要评估 T(n)。这样做一步会产生
T(n - 2) + T(n / 2) + 1
现在,假设我们扩展 T(n - 2) 项。这给了
T(n - 4) + T(n / 2 - 1) + T(n / 2) + 2
现在,展开 n - 4 项。这样做会给
T(n - 6) + T(n / 2 - 2) + T(n / 2 - 1) + T(n / 2) + 3
我们可以一遍又一遍地重复扩展减法项(形式为 T(n - 2k) 的项)的过程。那么,如果我们将它扩展到 n - 2k 大约为 n / 2 的程度会发生什么?这将发生大约 n / 4 次。如果我们这样做,我们就会得到那个
T(n) = T(n / 2) + T(n / 2) + T(n / 2 - 1) + T(n / 2 - 2) + ... + T(n / 2 - n / 4) + n / 4
我将假设 T(n) 不减。如果我们这样做,我们就会得到那个
T(n) ≤ T(n / 2) + T(n / 2) + T(n / 2) + ... + T(n / 2) + n / 4
T(n) ≤ (n / 4 + 1) T(n / 2) + n / 4
我将在这里稍微粗略地计算数学并进行另一个简化:不是让 T(n / 2) 的系数为 (n / 4 + 1),而是我将拥有它为 n / 4。我知道这不安全,但我猜想它不会对结果造成太大影响。不过,最好仔细检查其余部分是否仍然有效!
这意味着我们可以(粗略地)简化上面的递归来得到它
T(n) ≤ (n / 4) T(n / 2) + n / 4
这是非常更容易处理的事情,我们现在可以尝试直接解决它。我们将使用迭代方法,并一遍又一遍地将其插入自身,直到我们发现一个模式。如果我们这样做,我们会看到以下模式:
T(n) ≤ (n / 4) T(n / 2) + n / 4
≤ (n / 4)((n / 8) T(n / 4) + n / 8) + n / 4
= (n2 / 32) T(n / 4) + n / 4 + n2 / 32
≤ (n2 / 32) ((n / 16) T(n / 8) + n / 16) + n / 4 + n2 / 32
= (n3 / 512) T(n / 8) + n / 4 + n2 / 32 + n3 / 512
≤ (n3 / 512) ((n / 32) T(n / 16) + n / 32) + n / 4 + n2 / 32 + n3 / 512
= (n4 / 16384) T(n / 16) + n / 4 + n2 / 32 + n3 / 512 + n4 / 16384
让我们看看正在出现的模式。这样做 k 次后,T(n / 2k) 的系数为 nk 除以 2 的某个幂。到目前为止,2 的幂是 4、32、512、16384。这些数字似乎没有任何明显的规律,但如果我们将它们重写为 22, 25 , 29, 214 我们看到它们遵循模式 0, 2, 5, 9, 14, ... 。这比三角形数 1, 3, 6, 10, 15, ... 小一。这不是巧合:如果你仔细想想,每次我们展开递归式时,分母都会不断地乘以 2 的下一个幂,这会将 2 的幂的指数从一个三角形数增加到下一个三角形数。因此,我们期望 k 次迭代后的分母由下式给出
2(k + 1)(k + 2) / 2 - 1
在此之后,剩下的项是 n 的幂的总和除以 2 的幂的各种三角数。因此,如果我们将事物扩展 k 次,我们得到
T(n) ≤ (nk / 2(k + 1)(k + 2) / 2 - 1) T(n / 2 k) + Σi = 0k (ni / 2(i + 1)(i + 2 ) / 2 - 1)
好的!所以这是一团糟,但并不是那么糟糕。我们知道递归在 n / 2k = 1 时停止,这发生在 k = lg n 时。为了使事情更简单,我将更改基本情况,以便在 n / 2k = 2 时停止递归,这在 k = lg n - 1 时发生。这不会改变任何东西都不止一个常数因素。因此,如果我们将 k = lg n - 1 代入上述公式,我们可以化简为上界的封闭式表达式。这样做会得到以下结果:
T(n) ≤ (nk / 2(k + 1)(k + 2) / 2 - 1) T(n / 2 k) + Σi = 0k (ni / 2(i + 1)(i + 2 ) / 2 - 1)
= (nlg n - 1 / 2(lg n)(lg n + 1) / 2 - 1) T(2) + Σ i = 0lg n - 1 (ni / 2(i + 1)(i + 2) / 2 - 1)
哎呀,这不漂亮。然而,它并没有看起来那么糟糕。我们来看看第一项的分母:
2(lg n)(lg n + 1) / 2 - 1
使用基本的指数定律,我们得到了
2(lg n)(lg n + 1) / 2 - 1
= (2lg n)(lg n + 1) / 2 - 1
= n(lg n + 1) / 2 - 1
这还不错!因此,如果我们采用表达式
nlg n - 1 / 2(lg n)(lg n + 1) / 2 - 1
我们看到它简化如下:
nlg n - 1 / 2(lg n)(lg n + 1) / 2 - 1
= nlg n - 1 / n(lg n + 1) / 2 - 1
= n(lg n - 1 - ((lg n + 1) / 2 - 1))
= n(lg n - (lg n + 1) / 2)
= n(2 lg n - lg n - 1) / 2)
= n(lg n - 1) / 2)
= nO(lg n)
漂亮!该主导词最终的形式为 nO(lg n)!
那么剩下的呢?好吧,我们有这个可怕的总结要对付:
Σi = 0lg n - 1 (ni / 2(i + 1)(i + 2) / 2 - 1)
幸运的是,我们可以注意到一件事
ni / 2(i + 1)(i + 2) / 2 - 1
≤ni / 2(i + 1)(i + 2)
≤ni / 2(i + 1)
≤ni / 2i
= (n / 2)i
因此,如果我们想要做的只是求和的上限,我们可以使用这个更简单的求和来实现:
Σi = 0lg n - 1 (n / 2)i
由于 n / 2 > 0,这个和又是上限
Σi = 0lg n - 1 (n / 2)lg n - 1
= (lg n)(nlg n - 1) / (2lg n - 1)
= (2 lg n)(nlg n - 1) / n
= (2 lg n)nlg n - 2
= nO(lg n)
还有宾果游戏,这个可怕总和的第二项也是 nO(lg n)!这意味着我们有 T(n) = nO(log n)。这个界限不一定很严格,但它确实表明递归绝对是次指数的,因为 nO(log n) 的增长速度比任何指数函数都慢!
希望这会有所帮助!