更改递归关系中的变量


20

目前,我正在研究算法简介(CLRS),书中概述了一种解决递归关系的特定方法。

此示例可以说明以下方法。假设我们有复发

T(n)=2T(n)+logn

最初,他们进行替换m = lg(n),然后将其重新插入递归并获得:

T(2m)=2T(2m2)+m

到目前为止,我完全理解。下一步是使我感到困惑的步骤。

他们现在“重命名”递归并令,这显然会产生S m = T 2 mS(m)S(m)=T(2m)

S(m)=2S(m/2)+m

出于某种原因,我不清楚这种重命名为何起作用,而且似乎只是作弊。谁能更好地解释这一点?

Answers:


15

当然不是在作弊。在微积分中思考如何使用替代来解决棘手的积分。替换使方程更易于管理。此外,替换可能会将有些复杂的重复转化为熟悉的重复。

这正是您的示例中发生的情况。我们定义一个新复发。请记住,T 2 m= 2 T 2 mS(m)=T(2m)。请注意,Sm/2=T2mT(2m)=2T(2m2)+m。如果仍然不清楚这一点,则令k=m/2并注意,我们所做的只是此Sk=T2k。现在,我们可以将Sm扩展为: Sm=2Sm/2+m求解S,我们看到它解决了我们熟悉的朋友OmlogmS(m/2)=T(2m2)k=m/2S(k)=T(2k)S(m)

S(m)=2S(m/2)+m.
S。现在我们已经解决了 S,我们想用 T n )表示。要做到这一点,仅仅插回我们原来的价值,我们有牛逼Ø 日志ñ 日志记录ñ O(mlogm)ST(n)mTO(lognloglogn)

是的,我完全理解替换是如何帮助简化问题的,以及如何重新插入值以获取n的复杂度。我想我的问题是,让S(m)= T(2 ^ m)之后,如何推导S(m / 2)?由于某种原因,这对我来说并不明显。更具体地说,如何得出T(2 ^(m / 2))= S(m / 2)的结论。似乎在重复次数T中,子问题的大小是平方根,而在重复次数S中,子问题的大小正在减半

我唯一不了解的部分是当您说“注意,S(m / 2)= T(2 ^(m / 2))”时,这是唯一对我不明显的部分。我习惯了进行变量替换的想法,但是我并不习惯于替换整个重复项。

好的,那最后的编辑为我做了。现在很清楚,谢谢!

1
我有点怀疑。如果我写来讲函数S()k我得到等式S(K)= 2S以下(K / 2)+ M如何获得替代mk
Atinesh

4

S(m)=T(2m)STm2m

S

  1. Sm2m

  2. T

因此,过渡是:

m2mT(2m)=S(m)
m22m/2T(2m/2)=S(m2).
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.