解决复发:替代方法

时间:2011-12-08 12:40:44

标签: algorithm math computer-science

我正在尝试按照Cormen的书“算法导论”(第59页,我相信)关于解决复发的替代方法。我没有得到用于MERGE-SORT替换的符号:

T(n) ≤ 2(c ⌊n/2⌋lg(⌊n/2⌋)) + n
≤ cn lg(n/2) + n
= cn lg n - cn lg 2 + n
= cn lg n - cn + n
≤ cn lg n

第一部分我不明白你怎么把⌊n/2⌋变成n / 2,假设它表示递归。您能以一种简单易懂的方式解释替代方法及其一般思维过程(尤其是数学归纳部分)吗?我知道在SO中有一个关于大O符号的答案。

1 个答案:

答案 0 :(得分:2)

替换方法背后的想法是通过强感应来约束由重现定义的函数。我将假设T(n)是合并排序用于对n元素进行排序的比较数的上限,并通过以下具有边界条件T(1) = 0的重复来定义它。

T(n) = T(floor(n/2)) + T(ceil(n/2)) + n - 1.

Cormen等。使用n代替n - 1以简化并使用floor两次作弊。我们不要作弊。

H(n)成为T(n) ≤ c n lg n的假设。从技术上讲,我们现在应该选择c,所以让我们设置c = 100。 Cormen等。选择记下每个(正)c的语句,直到明确c应该是什么,这是一种优化。

基本案例为H(1)H(2),即T(1) ≤ 0T(2) ≤ 2 c。好的,我们不需要进行任何比较来排序一个元素,T(2) = T(1) + T(1) + 1 = 1 < 200

感性地,当n ≥ 3时,假设1 ≤ n' < n持有的所有H(n')。我们需要证明H(n)

T(n) = T(floor(n/2)) + T(ceil(n/2)) + n - 1
     ≤ c floor(n/2) lg floor(n/2) + T(ceil(n/2)) + n - 1
         by the inductive hypothesis H(floor(n/2))
     ≤ c floor(n/2) lg floor(n/2) + c ceil(n/2) lg ceil(n/2) + n - 1
         by the inductive hypothesis H(ceil(n/2))
     ≤ c floor(n/2) lg (n/2) + c ceil(n/2) lg ceil(n/2) + n - 1
         since 0 < floor(n/2) ≤ n/2 and lg is increasing

现在我们必须处理诚实和约束的后果lg ceil(n/2)

lg ceil(n/2) = lg (n/2) + lg (ceil(n/2) / (n/2))
             < lg (n/2) + lg ((n/2 + 1) / (n/2))
                 since 0 < ceil(n/2) ≤ n/2 + 1 and lg is increasing
             = lg (n/2) + log (1 + 2/n) / log 2
             ≤ lg (n/2) + 2/(n log 2)
                 by the inequality log (1 + x) ≤ x, which can be proved with calculus

好的,回到T(n)

T(n) ≤ c floor(n/2) lg (n/2) + c ceil(n/2) (lg (n/2) + 2/(n log 2)) + n - 1
         since 0 < floor(n/2) ≤ n/2 and lg is increasing
     = c n lg n - c n + n + 2 c ceil(n/2) / (n log 2) - 1
         since floor(n/2) + ceil(n/2) = n and lg (n/2) = lg n - 1
     ≤ c n lg n - (c - 1) n + 2 c/log 2
         since ceil(n/2) ≤ n
     ≤ c n lg n
         since, for all n' ≥ 3, we have (c - 1) n' = 99 n' ≥ 297 > 200/log 2 ≈ 288.539.

评论

我想这并不能很好地解释原因,但(希望)至少在所有细节中推导都是正确的。编写这类证据的人经常跳过基本案例并忽略floorceil因为,这些细节通常只会影响常数c(大多数计算机科学家没有名叫Knuth不关心)。

对我来说,替换方法是用于确认猜测而不是制定一个猜测。有趣的问题是如何提出猜测。就个人而言,如果复发是(i)不是看起来像Fibonacci的东西(例如,线性齐次复发)和(ii)Akra–Bazzi未涵盖的,是主定理的推广,那么我将去想出一个好的猜测会有些麻烦。

另外,我应该提一下替换方法最常见的失败模式:如果一个人不能选择c足够大以从子问题中吞下额外的术语,那么绑定可能是错的。另一方面,更多基础案例可能就足够了。在前面的证明中,我使用了两个基本案例,因为除非我知道n > 2/log 2,否则我无法证明最后的不等式。