Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 分治算法';属性示例_Algorithm_Recursion_Divide And Conquer - Fatal编程技术网

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++书也一样。