Algorithm 分治算法';属性示例
我在理解分治算法的以下特性时遇到了困难 将大小Algorithm 分治算法';属性示例,algorithm,recursion,divide-and-conquer,Algorithm,Recursion,Divide And Conquer,我在理解分治算法的以下特性时遇到了困难 将大小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的证明如下 同样的归纳论点 我完全理解上面
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
的证明如下
同样的归纳论点
我完全理解上面的正式证明。我不明白的是,这个属性是如何与通常用于演示分而治之思想的示例联系在一起的,特别是如何与寻找最大问题联系在一起的:
静态双最大值(双a[],整数l,整数r)
{
如果(l==r)返回一个[l];
int m=(l+r)/2;
双u=最大值(a、l、m);
双v=最大值(a,m+1,r);
如果(u>v)返回u;否则返回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
。我错过了什么?你没有错过任何东西。这个定理及其证明是错误的。错误在这里:
T(n) = T(k) + T(n-k) + 1
常数项1应该是2,因为函数对它将问题分成的两部分中的每一部分进行一次递归调用。正确的界限是2N-1,而不是N。希望这个错误能在下一版教科书中得到纠正,或者至少在勘误表中得到纠正。现在我感到放心了-)。我在Robert Sedwick的Java算法中发现了。他的C++书也一样。