使用替代方法重复

时间:2011-09-01 16:13:52

标签: algorithm

确定正数c& n0表示以下重复次数(使用替换方法):

  1. T(n)= T(上限(n / 2))+ 1 ......猜猜是大哦(n的对数基数为2)

  2. T(n)= 3T(floor(n / 3))+ n ... Guess是Big-Omega(n *的对数基数为3)

  3. T(n)= 2T(floor(n / 2)+17)+ n ......猜猜是大哦(n * n的基数2)。

  4. 我正在解决问题1:

    我们的猜测是:T(n)= O(log_2(n))。 通过归纳假设假设对于所有k <1,T(k)<= c * log_2(k)。 n,这里c是const&amp; c> 0

         T(n) = T(ceiling(n/2)) + 1
    <=>  T(n) <= c*log_2(ceiling(n/2)) + 1
    <=>   "   <= c*{log_2(n/2) + 1} + 1
    <=>   "    = c*log_2(n/2) + c + 1
    <=>   "    = c*{log_2(n) - log_2(2)} + c + 1
    <=>   "    = c*log_2(n) - c + c + 1
    <=>   "    = c*log_2(n) + 1
    <=>   T(n) not_<= c*log_2(n)      because c*log_2(n) + 1 not_<= c*log_2(n).
    

    要解决这个问题,请使用以下技巧:

        T(n) = T(ceiling(n/2)) + 1
    <=>  "  <= c*log(ceiling(n/2)) + 1 
    <=>  "  <= c*{log_2 (n/2) + b} + 1             where  0 <= b < 1
    <=>  "  <= c*{log_2 (n) - log_2(2) + b) + 1  
    <=>  "   = c*{log_2(n) - 1 + b} + 1
    <=>  "   = c*log_2(n) - c + bc + 1
    <=>  "   = c*log_2(n) - (c - bc - 1)      if c - bc -1 >= 0  
                                                 c >= 1 / (1 - b)
    <=> T(n) <= c*log_2(n) for c >= {1 / (1 - b)}
    
    so T(n) = O(log_2(n)).
    
    This solution is seems to be correct to me ... My Ques is: Is it the proper approach to   do?
    
    Thanks to all of U.
    

2 个答案:

答案 0 :(得分:1)

问题#1:

  1. T(1)= t0
  2. T(2)= T(1)+ 1 = t0 + 1
  3. T(4)= T(2)+ 1 = t0 + 2
  4. T(8)= T(4)+ 1 = t0 + 3 ... T(2 ^(m + 1))= T(2 ^ m)+ 1 = t0 +(m + 1)
  5. 设n = 2 ^(m + 1),得到T(n)= t0 + log_2(n)= O(log_2(n))

    问题#2:

    1. T(1)= t0
    2. T(3)= 3T(1)+ 3 = 3t0 + 3
    3. T(9)= 3T(3)+ 9 = 3(3t0 + 3)+ 9 = 9t0 + 18
    4. T(27)= 3T(9)+ 27 = 3(9t0 + 18)+27 = 27t0 + 81 ... T(3 ^(m + 1))= 3T(3 ^ m)+ 3 ^(m + 1)=((3 ^(m + 1))t0 +(3 ^(m + 1))(m + 1)
    5. 设n = 3 ^(m + 1),得到T(n)= nt0 + nlog_3(n)= O(nlog_3(n))。

      问题#3:

      考虑n = 34.T(34)= 2T(17 + 17)+ 34 = 2T(34)+ 34.我们可以解决这个问题,发现T(34)= -34。我们还可以看到,对于奇数n,T(n)= 1 + T(n-1)。我们继续找到修复的值:

      1. T(0)= 2T(17)+ 0 = 2T(17)
      2. T(17)= 1 + T(16)
      3. T(16)= 2T(25)+ 16
      4. T(25)= T(24)+ 1
      5. T(24)= 2T(29)+ 24
      6. T(29)= T(28)+ 1
      7. T(28)= 2T(31)+ 28
      8. T(31)= T(30)+ 1
      9. T(30)= 2T(32)+ 30
      10. T(32)= 2T(33)+ 32
      11. T(33)= T(32)+ 1
      12. 我们得到T(32)= 2T(33)+ 32 = 2T(32)+ 34,意味着T(32)= -34。工作后记,我们得到

        1. T(32)= -34
        2. T(33)= -33
        3. T(30)= -38
        4. T(31)= -37
        5. T(28)= -46
        6. T(29)= -45
        7. T(24)= -96
        8. T(25)= -95
        9. T(16)= -174
        10. T(17)= -173
        11. T(0)= -346
        12. 正如您所看到的,这种复发比其他复杂有点复杂,因此,您应该仔细看看这一点。如果我有任何其他想法,我会回来;否则,你就是自己。

          编辑:

          再看一下#3之后,你的评估看起来就像是O(nlog_2(n))。所以你可以尝试列出一堆数字 - 我是从n = 0到n = 45。你注意到一种模式:它从负数到n = 43,44左右的正数。要获取序列的下一个偶数索引元素,可按以下顺序添加2的幂:4,8,4,16,4,8,4,32,4,8,4,16,4,8 ,4,64,4,8,4,16,4,8,4,32 ......

          这些数字基本上是你标记一个任意长度的标尺......四分之一,一半,八分之一等等。因此,我们可以解决找到和1 + 2 +的顺序的等价问题1 + 4 + 1 + 2 + 1 + 8 + ......(与我们相同,除以4,我们的移位,但顺序仍然有效)。通过观察前k个数的总和(其中k是2的幂)等于和((n /(2 ^(k + 1))2 ^ k)=(1/2)sum(n)对于k = 0到log_2(n),我们得到简单的递归由(n / 2)log_2(n)给出。乘以4得到我们的,并将x向右移动34并且可能加一个常数值结果。所以我们正在玩y = 2nlog_n(x)+ k'来获得一些常数k'。

          呼。这是一个棘手的问题。请注意,此重复不承认任何仲裁“初始条件”;换句话说,复发并不描述一系列序列,而是一个特定的序列,没有参数化。

答案 1 :(得分:1)

第一次练习: 我们希望通过归纳显示T(n) <= ceiling(log(n)) + 1

我们假设T(1) = 1,而不是T(1) = 1 <= ceiling(log(1)) + 1 = 1,并且证明了归纳的基础。

现在,我们假设每个1 <= i < n持有T(i) <= ceiling(log(i)) + 1

对于归纳步​​骤,我们必须区分n为偶数且何时为奇数的情况。

如果n是偶数:T(n) = T(ceiling(n/2)) + 1 = T(n/2) + 1 <= ceiling(log(n/2)) + 1 + 1 = ceiling(log(n) - 1) + 1 + 1 = ceiling(log(n)) + 1

如果n是奇数:T(n) = T(ceiling(n/2)) + 1 = T((n+1)/2) + 1 <= ceiling(log((n+1)/2)) + 1 + 1 = ceiling(log(n+1) - 1) + 1 + 1 = ceiling(log(n+1)) + 1 = ceiling(log(n)) + 1

最后一段是棘手的,但是很可能,因为n是奇数,然后它不能是2的幂。