【问题标题】:Divide-and-conquer algorithms' property example分治算法的属性示例
【发布时间】:2014-02-22 21:51:39
【问题描述】:

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

N 大小的问题分成两个独立的递归方法 它递归求解的(非空)部分调用自身的次数少于N 次。

证明是

N 大小的问题分成两个独立的递归函数 它递归求解的(非空)部分调用自身的次数少于N 次。 如果零件的尺寸为k 和尺寸为N-k 之一,则总数量 我们使用的递归调用是T(n) = T(k) + T(n-k) + 1,对于N>=1T(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=4max(0,3)会调用自己2次,那么后面的每次调用也会调用max 2次,所以总调用次数是6 > N。我错过了什么?

【问题讨论】:

    标签: algorithm recursion divide-and-conquer


    【解决方案1】:

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

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

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

    【讨论】:

    • 现在我放心了-)。我实际上是在 Robert Sedwick 的 Algorithms in Java 中找到的。他的 C++ 书也有相同的 error
    猜你喜欢
    • 2019-10-05
    • 1970-01-01
    • 2013-02-12
    • 2013-10-12
    • 2023-03-03
    • 2021-05-06
    • 2013-02-02
    • 2014-10-28
    • 2020-07-17
    相关资源
    最近更新 更多