重命名变量以解决递归方法
Renaming variables to solve recursion method
我知道重命名将循环转换为您以前见过的变量的想法。
我对第 4 行之前的幻灯片没意见。他们将 T(2^m) 重命名为 S(m) >> 这意味着他们制作了 2^m = m
所以 S(m) 应该是:
S(m)= 2T(m^(0.5)) + m
还有 m 我认为我们不应该保持原样,因为它在这里表示 2^m 但它们实际上不是
谁能给我解释一下吗?
还有我怎么知道我应该使用哪些变量来简化我的操作?
你所说的一切都是正确的,直到你声称因为 S(m) = T(2m),所以 m = 2m.
定义S(m) = T(2m)的步骤类似于根据旧函数f定义一些新函数g。例如,如果您定义一个新函数 g(x) = 2f(5x),您并不是说 x = 5x。您只是定义了一个根据 f.
求值的新函数
让我们看看这里会发生什么。我们定义了 S(m) = T(2m)。也就是说
S(m) = T(2m)
= 2T(√(2m)) + lg (2m)
我们可以做一些代数化简来证明
S(m) = 2T(2m/2) + m
并且,使用 T 和 S 之间的连接,我们看到
S(m) = 2S(m/2) + m
请注意,我们最终得到了递归 S(m) = 2S(m/2) + m,这不仅仅是在原始递归中用 S 替换 T,而是通过代数替换和简化。
到了这里,我们就可以用大定理求解S(m),得到S(m) = O(m log m),所以
T(n) = S(lg n) = O(lg n lg lg n).
至于您最初是如何想到这个的 - 这只是需要练习。关键的见解是,要使用主定理,您需要每次将问题的规模缩小一个常数因子,因此您需要找到一个将平方根转换为常数除法的转换。平方根是求幂的一种,而对数是专门用来将求幂转化为乘除法的,所以尝试对数或指数代换是合理的。既然您知道了诀窍,我想您会在更多地方看到它。
您也可以将第一个方程除以 log(n) 得到
T(n)/log(n)=T(sqrt(n))/log(sqrt(n)) + 1
然后只需使用
S(n) = T(n)/log(n) with S(n) = S(sqrt(n)) + 1
或以不同的方式
S(k) = T(n^(2^(-k)))/log(n^(2^(-k)))
那么
S(k+1)=S(k)+1
又是一个well-known递归方程。
我知道重命名将循环转换为您以前见过的变量的想法。
我对第 4 行之前的幻灯片没意见。他们将 T(2^m) 重命名为 S(m) >> 这意味着他们制作了 2^m = m
所以 S(m) 应该是: S(m)= 2T(m^(0.5)) + m
还有 m 我认为我们不应该保持原样,因为它在这里表示 2^m 但它们实际上不是
谁能给我解释一下吗?
还有我怎么知道我应该使用哪些变量来简化我的操作?
你所说的一切都是正确的,直到你声称因为 S(m) = T(2m),所以 m = 2m.
定义S(m) = T(2m)的步骤类似于根据旧函数f定义一些新函数g。例如,如果您定义一个新函数 g(x) = 2f(5x),您并不是说 x = 5x。您只是定义了一个根据 f.
求值的新函数让我们看看这里会发生什么。我们定义了 S(m) = T(2m)。也就是说
S(m) = T(2m)
= 2T(√(2m)) + lg (2m)
我们可以做一些代数化简来证明
S(m) = 2T(2m/2) + m
并且,使用 T 和 S 之间的连接,我们看到
S(m) = 2S(m/2) + m
请注意,我们最终得到了递归 S(m) = 2S(m/2) + m,这不仅仅是在原始递归中用 S 替换 T,而是通过代数替换和简化。
到了这里,我们就可以用大定理求解S(m),得到S(m) = O(m log m),所以
T(n) = S(lg n) = O(lg n lg lg n).
至于您最初是如何想到这个的 - 这只是需要练习。关键的见解是,要使用主定理,您需要每次将问题的规模缩小一个常数因子,因此您需要找到一个将平方根转换为常数除法的转换。平方根是求幂的一种,而对数是专门用来将求幂转化为乘除法的,所以尝试对数或指数代换是合理的。既然您知道了诀窍,我想您会在更多地方看到它。
您也可以将第一个方程除以 log(n) 得到
T(n)/log(n)=T(sqrt(n))/log(sqrt(n)) + 1
然后只需使用
S(n) = T(n)/log(n) with S(n) = S(sqrt(n)) + 1
或以不同的方式
S(k) = T(n^(2^(-k)))/log(n^(2^(-k)))
那么
S(k+1)=S(k)+1
又是一个well-known递归方程。