Karatsuba算法涉及递归关系T(n) = 3T(n/2) + n
。
通过递归树方法,我们可以将T
的大O近似为O(nlog23)
然而,通过替换方法我无法验证递归树方法找到的近似结果
我只需使用lg 3
来表示log23
。
替代方法:
Hypothesis -> T(n) <= cnlg 3 where c is a positive constant
Proof -> T(n) <= 3c(n/2)lg 3 + n
= cnlg 3 + n
但证据的第2步显示我无法证明我的假设是因为n个术语。
我修改了证明的第2步
T(n) <= cnlg 3 + nlg 3
= (c+1)nlg 3
后来意识到我犯了一个错误,因为这个假设没有得到证实。
必须证明 T(n) <= cnlg 3
,而不是T(n) <= (c+1)nlg 3
但答案是T(n)
是O(nlg 3)
答案 0 :(得分:2)
当使用替代方法时,你有时必须加强归纳假设,并猜测一种更复杂的表达形式,这种形式是复发的上限。
尝试猜测形式T(n)≤c 0 n lg 3 - c 1 n。现在您要减去c 1 n形式的某个项,您可以通过使用一些线性项来抵消稍后添加的n项,从而使重复计算成功。
例如:
T(n)≤3T(n / 2)+ n
≤3(c 0 (n / 2) lg 3 - c 1 (n / 2))+ n
= 3(c 0 (n / 2) lg 3 ) - 3c 1 n / 2 + n
现在,选择c 1 ,使-3c 1 n / 2 + n = -c 1 n。这解决了
-3c 1 n / 2 + n = -c 1 n
-3c 1 / 2 + 1 = -c 1
-3c 1 + 2 = -2c 1
2 = c 1
这个c 1 的选择将让你成功取消+ n项,让归纳成功。
希望这有帮助!