【发布时间】:2014-02-22 21:51:39
【问题描述】:
我无法理解分治算法的以下属性。
将
N大小的问题分成两个独立的递归方法 它递归求解的(非空)部分调用自身的次数少于N次。
证明是
将
N大小的问题分成两个独立的递归函数 它递归求解的(非空)部分调用自身的次数少于N次。 如果零件的尺寸为k和尺寸为N-k之一,则总数量 我们使用的递归调用是T(n) = T(k) + T(n-k) + 1,对于N>=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;
}
在这种情况下,当 a 由 N=2 组成时,max(0,1) 将再调用自己 2 次,即 max(0,0) 和 max(1,1),等于 N。如果N=4,max(0,3)会调用自己2次,那么后面的每次调用也会调用max 2次,所以总调用次数是6 > N。我错过了什么?
【问题讨论】:
标签: algorithm recursion divide-and-conquer