算法導論(3版)第4章習題的部分解答

Introduction to algorithms (3rd editon)

第四章部分解答        by zevolo

4.3-1

Show that the solution of T(n) = T(n-1) + n is O(n^2).
proof:
assume  T(m) <= c * m^2 ( m < n)
T(n) = T(n-1) + n <= c (n-1)^2 + n = c (n^2 - 2n + 1) + n
         = cn^2 - 2cn + c + n
         = cn^2 + (1 - 2c)n + c
         <= cn^2 (when c > 1 && c < 2 && n > 1)

    so modify the assumption to T(m) <= c m^2 (1 < m < 2)
for n = 1
   T(n) = T(1) = 1
   c n^2 = c (1)^2 = c
   satisfy the T(1) <= c (1)^2

so the assumption is correct


4.3-2
show that the solution of T(n) = T(ceiling(n/2)) + 1 is O(lgn)

proof:
assume that T(m) <= c * lg(m) (m < n), k = ceiling(n/2)
    T(n) <= c * k + 1
         <= c * lg((n+1)/2) + 1
         =  c * lg(n+1) - c + 1
         =  c * lg(n) + c * lg((n+1)/n) - c + 1
         <= c * lg(n) + c * lg((2+1)/2) - c + 1 (when n > 1)
         =  c * lg(n) + c * lg(3) - 2c + 1 (when n > 1)
         <= c * lg(n) (when n > 1 && c >= (1/lg(4/3)) )
              note: c * lg(3) - 2c + 1 <=0 ==>  c >= (1/lg(4/3))

the boundary n = 1:
    T(n) = 1
    c * lg(1) = 0
    not correct
change the boundary to n = 2 and n = 3:
    T(2) = 2T(1) + 1 = 3
    C * lg(2) = c
    T(3) = 2T(2) + 1 = 7
    c * lg(3) = clg3
    so require c >= 3 && c >= 7 / lg(3)
so the assumption is correct
    T(n) <= c * lg(n) (n >= 2 && c >= max(3, 7/lg(3), 1/lg(4/3)) = 1/lg(4/3))


4.3-3。。。。這個據說有錯誤,沒有改正
We saw that the solution of T(n) = 2T(floor(n/2)) + n  is W(nlgn)
proof:
assume T(m) >= cmlgm (m < n), k = floor(n/2)
    so T(n) >= 2cklgk + n
            =  2cnlgn + 2cklgk - 2cnlgn + n
            <= 2cnlgn + 2c(n-1)lgk - 2cnlgn + n
            <= 2cnlgn + 2c(n-1)lg((n-1)/2) - 2cnlgn + n
            =  2cnlgn + 2c(n-1)lg(n-1) - 2cnlgn - 2c(n-1) + n
            =  2cnlgn + 2cnlg(n-1) - 2clg(n-1) - 2cnlgn - 2c(n-1) + n
            =  2cnlgn + 2cnlg((n-1)/n) - 2clg(n-1) - 2c(n-1) + n
            <= 2cnlgn + 0 - 2clg(n-1) - 2c(n-1) + n
            <= 2cnlgn + 0 - 0 - 2c(n-1) + n
            <= 2cnlgn (when c >= 1/2 * (n/(n-1) && n != 1  ==> n > 1 && c > 1)

boundary:
   T(1)= 1
   1lg1 = 0

so assumption is correct

4.3-4
proof:
assume T(m) <= mlgm + b (b >= 1)
boundary:
       T(1) = 1
       1lg1 + b = b
prove T(n)
    T(n) <= 2cklgk +2b + n     (k = floor(n/2))
         <= 2c(n/2)lg(n/2) + 2b + n
         =  cnlgn - cn + 2b + n
         >= cnlgn              (c >= 2b/n + 1 && b >= 1)
so assumption is correct

4.3-7
assumption: T(m) <= cm^(lg_3(4)) - bn
proof:
    T(n) =  4T(n/3) + n
         <= 4(c(n/3)^(lg_3(4)) - bn) + n
         =  4c(n^lg_3(4)) / 3^(lg_3(4)) - 4bn + n
         =  c(n^lg_3(4)) - 4bn + n
         <= c(n^lg_3(4))      (when b > 1/4)
boundary:
    T(1) = 1
    c (1^lg_3(4)) = c

so
assumption: T(n) <= cn^(lg_3(4)) - bn  is correct for b > 1/4 and c >= 1


4.3-8
the problem should be T(n) = 4T(n/2) + n
origin is T(n) = 4T(n/2) + n^2


4.3-9
T(n) = 3T(n^(1/2)) + lgn
==>T(2^m) = 3T(2^(m/2)) + m         m = lgn
==>S(m)   = 3S(m/2) + m             S(m) = T(2^m)
    so S(m) = theta(m^(lg3))

==>T(n) = S(2^m) = theta ( (2^m) ^ (lg3))
                 = theta ( 2^(mlg3))
                 = theta ( 2^(lg (3^m)) )
                 = theta ( 3^m )
                 = theta (3^(lgn))


4.4-4
T(n) = 2^n


4.4-5
T(n) = T(n-1) + T(n/2) + n
expand  T(n):
    level 1 --> n
    level 2 --> 3/2 * n - 1
    level 3 --> 9/4 * n - 3 - 1/2
    level 4 --> 27/8 * n - 9 - 1/4
    ....

assume T(n) = O(n(3/2)^n)
proof:
    assume T(m) <= c(m(3/2)^m)  when m < n
    T(n) = T(n-1) + T(n/2) + n
        <= c(n-1)(3/2)^(n-1) + 1/2*cn(3/2)^(n/2) + n
        =  cn(3/2)^n -cn(3/2)^n + above
        =  cn(3/2)^n -cn(3/2)^n + cn(3/2)^(n-1) - c(3/2)^(n-1) + 1/2*cn(3/2)^(n/2) + n
        =  cn(3/2)^n + 1/2 *cn ( (3/2)^(n/2) - (3/2)^(n-1) ) + (n - c (3/2)^(n-1))
        <= cn(3/2)^n + 0                                     + (n - c (3/2)^(n-1))   (when n >= 2)
        <= cn(3/2)^n + 0                                     + 0                     (when n >=2 && c >=1 (maybe c can be more little))
        <= cn(3/2)^n
    boundary:
    T(1) = 1
    c(1(3/2)^1) = 3/2 *c
    so T(n) = O(n(3/2)^n)


4.4-8
T(n) = theta(n^2) (not prove)

4.4-9
if a=1/2, we know the result is theta(nlgn)
and if a = 1/3, the result is same
so we assume that result is theta(nlgn)

4.5-2
  a < 49

4.5-4
  guess T(n) = O(n^2 (lgn) ^ 2)        (not prove)


4-3
e T(n) = 2T(n/2) + n/lgn
   ==> T(n) = theta(nlglgn)
    because: expand recurrence tree
       T(n) =  n/(lgn - 1) + n/(lgn -2) + .... + n/(lgn -(lgn -1) + lgn * theta(1)
            = n (1/1 + 1/2 + 1/3 + ... + 1/lgn)
            = theta(nlglgn)

g T(n) = T(n-1) + 1/n
   ==> T(n) = theta(lgn)

h T(n) = T(n-1) + lgn
   ==> T(n) = theta(nlgn)


發佈了47 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章