用递归关系代替变量的方法

时间:2014-02-17 23:50:36

标签: math recurrence

in或Data Structures类我们正在学习如何解决1变量中的递归关系。不幸的是,有些事情似乎“出乎意料”。 例: 一些练习已经告诉你如何替换变量n:

计算T(n)n = 2 ^ k

T(n)= a,n =< 2

T(n)= 8T(n / 2)+ bn ^ 2(a和b> 0)

但是有些练习只给你T(n)而没有提供变量n的替换:

T(n)= 1 n =< 1

T(n)= 2T(n / 4)+ sqrt(n)

我使用迭代方法并得出正确的答案:sqrt(n)+(1/2)* sqrt(n)* Log(n)。 但当教授解释说她开始说:“设n = 4 ^ k”。这就是我所说的“突然出现”。使用这个事实,答案更容易获得。 但是学生应该怎么想出来呢?

这是另一个例子:

T(n)= 1 n =< 1

T(n)= 2T((n-1)/ 2)+ n

在这里,我再次尝试使用迭代方法,但我无法得出明确的答案,它看起来更复杂。 经过3个迭代步骤,我到达了这个:

(1)T(n)= 4T((n-2)/ 4)+ 2n - 1

(2)T(n)= 8T((n-3)/ 8)+ 3n - 3

(3)T(n)= 16T((n-4)/ 16)+ 4n - 6

我倾向于说T(i)= 2 ^ i * T((n-i)/ 2 ^ i)+ i * n - ??? ,这最后一部分我无法弄清楚,也许我犯了一个错误。

然而,在她给出的答案中,她又用另一个替换开始:设n =(2 ^ k)-1。 WTF ??

背后的逻辑是什么? 谢谢。

1 个答案:

答案 0 :(得分:0)

在所有这些情况下,这些替换是合理的,因为它们将重现重写为S(k)= aS(k-1)+ f(k)的形式之一。这些重现通常比其他重现更容易解决,因为它们纯粹用S(k - 1)来定义S(k)。

让我们举一些例子来看看它是如何工作的。考虑一下这种情况:

  

T(n)= 1(如果n≤1)

     

T(n)= 2T(n / 4)+ sqrt(n)(否则)

这里,问题的大小在每次迭代时缩小了四倍。因此,如果输入是4的完美幂,则输入将从4 k 缩小到4 k-1 ,从4 k-1 < / sup>到4 k-2 等,直到递归到底为止。如果我们做这个替换并让S(k)= T(4 k ),那么我们得到帽子

  

S(0)= 1

     

S(k)= 2S(k-1)+ 2 k

现在这是一个递归关系,其中S(k)是用S(k - 1)定义的,这可以使重现更容易解决。

让我们来看看你原来的复发:

  

T(n)= a(对于n≤2)

     

T(n)= 8T(n / 2)+ bn 2

请注意,递归步骤将n除以2。如果n是2的完美幂,则递归步骤考虑n之前的2的幂。设S(k)= T(2 k )给出

  

S(k)= a(对于k≤1)

     

S(k)= 8S(k-1)+ b2 2k

注意S(k)是如何用S(k-1)定义的,这是一个更容易解决的重复。两个权力的选择在这里是“自然的”,因为它使得递归步骤纯粹是关于S的先前值而不是S的任意小值。

现在,看看最后一次重复:

  

T(n)= 1(n≤1)

     

T(n)= 2T((n-1)/ 2)+ n

我们想做一些替换k = f(n)使得T(f(n))= 2T(f(n)-1)+ n。问题是如何做到这一点。

通过一些试验和错误,我们得到设置f(n)= 2 n - 1适合账单,因为

  

(f(n) - 1)/ 2 =((2 n - 1) - 1)/ 2 =(2 n - 2)/ 2 = 2 n-1 - 1 = f(n)-1

因此,让k = 2 n - 1并设置S(k)= T(2 n - 1),我们得到

  

S(n)= 1(如果n≤1)

     

S(n)= 2S(n - 1)+ 2 n - 1

希望这有帮助!