分而治之算法的属性示例

时间:2014-01-30 14:26:18

标签: algorithm recursion divide-and-conquer

我无法理解分而治之算法的以下属性。

  

将大小N的问题划分为两个独立的递归方法       (非空)部分它以递归方式求解自身的次数少于N次。

证据是

  

一个递归函数,它将大小为N的问题分成两个独立的问题       (非空)它以递归方式求解的部分调用自身的次数少于N次。       如果部件尺寸为k,尺寸为N-k,则为总数       我们使用的递归调用是T(n) = T(k) + T(n-k) + 1N>=1的{​​{1}}。       解决方案T(1) = 0是通过归纳立即实现的。如果大小总和为一个值       小于T(N) = N-1,证明呼叫数小于N       相同的归纳论点。

我完全理解上面的正式证据。我不明白的是这个属性是如何与通常用于展示分而治之的想法的例子相关联的,特别是找到最大问题:

N-1

在这种情况下,如果由static double max(double a[], int l, int r) { if (l == r) return a[l]; int m = (l+r)/2; double u = max(a, l, m); double v = max(a, m+1, r); if (u > v) return u; else return v; } 元素组成N=2,则会自我调用2次,即max(0,1)max(0,0),等于max(1,1) 。如果N,则N=4会自行调用2次,然后每个后续调用也会调用最多2次,因此调用总数为max(0,3)。我错过了什么?

1 个答案:

答案 0 :(得分:2)

你没有遗漏任何东西。该定理及其证明是错误的。错误在这里:

T(n) = T(k) + T(n-k) + 1

常量项1应该是2,因为该函数对它分成问题的两个部分中的每个部分进行一次递归调用。正确的界限是2N-1,而不是N.希望这个错误将在下一版教科书中修正,或者至少在勘误表中修正。