我正在尝试按照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符号的答案。
答案 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) ≤ 0
和T(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.
我想这并不能很好地解释原因,但(希望)至少在所有细节中推导都是正确的。编写这类证据的人经常跳过基本案例并忽略floor
和ceil
因为,这些细节通常只会影响常数c
(大多数计算机科学家没有名叫Knuth不关心)。
对我来说,替换方法是用于确认猜测而不是制定一个猜测。有趣的问题是如何提出猜测。就个人而言,如果复发是(i)不是看起来像Fibonacci的东西(例如,线性齐次复发)和(ii)Akra–Bazzi未涵盖的,是主定理的推广,那么我将去想出一个好的猜测会有些麻烦。
另外,我应该提一下替换方法最常见的失败模式:如果一个人不能选择c
足够大以从子问题中吞下额外的术语,那么绑定可能是错的。另一方面,更多基础案例可能就足够了。在前面的证明中,我使用了两个基本案例,因为除非我知道n > 2/log 2
,否则我无法证明最后的不等式。