《算法导论》第三章 练习题 Exercise

时间:2023-02-23 15:38:46

3.1-1


  

  假设存在 h(n) = Θ(f(n)+g(n)) ,由渐进符号 Θ 的性质知存在三个正常量c1、 c2、n0,当n ≥ n0时,使得 c1·(f(n)+g(n)) ≤ h(n) ≤  c2·(f(n)+g(n)),当 h(n) = max(f(n), h(n)) 时,令 c1 = 0.5,此时 max((f(n)+g(n))) > 0.5×(f(n)+g(n)); 令c2 = 1 ,有 max((f(n)+g(n))) < 1×(f(n)+g(n)) 。所以有 c1·(f(n)+g(n)) ≤ h(n) ≤  c2·(f(n)+g(n)) 成立。

 

3.1-2


  

  等价于证明 c1、c2为正常量,n0 ≥ n 时,c1·n≤ (n+a) ≤ c2·n成立。

  由定理 3.1 知,我们应该从渐进上界和渐进下界来证明渐进确界。所以我们即要证明上式的左半部分也要证明上式的右半部分。

  令 c2 = 2b,当 n0 足够大( n0 ≥ 2|a| )时,对于所有的 n ≥ n0,有 (n+a) ≤ (2n)b = c·nb成立。所以 (n+a) = O(nb)

  令 c1 = 0.5,当 n0 足够大( n0 ≥ 2|a| )时对于所有 n ≥ n0,有 c·nb = 0.5·n≤ (n+a)b 成立。所以 (n+a) = Ω(nb)

  所以 (n+a) = Θ(nb)

 

3.1-3


  

  由渐进符号 O 的性质知,它是表示一个函数f(n)的上界,通俗地说就是表示增长率小于等于 n^2 的一些函数。而 “一个算法的运行时间至少是 O(n^2)” 表示运行时间函数 T(n) 取的是 f(n) 上方直到上界的区域,显然 O(1)等等的函数很可能也在这个区域里面,而T(n) 比 O(1) 增长率快并没有什么卵用。所以这种说法是没有意义的。

 

3.1-4


 

  成立。令 c >= 2 即可。

  不成立。找不到一个正常量 c,当 n足够大时,还可以保持 c >= 2n

  

3.1-5


  

  充分性:令 f(n) = Θ(g(n)),则 存在三个正常量c1、 c2、n0,当n ≥ n0时,使得 c1·g(n) ≤ f(n) ≤  c2·g(n),对于 c1·g(n) ≤ f(n),有 f(n) = Ω(g(n));对于 f(n) ≤  c2·g(n),有 f(n) = O(g(n))。

  必要性:存在 c1 > 0、n0 > 0,当n ≥ n0时,使得 c1·g(n) ≤ f(n);存在 c1 > 0、n2 > 0,当n ≥ n2时,使得 f(n) ≤  c2·g(n) 。取 max(n0, n2) ,有存在 c1>0、c2>0,当 n ≥  max(n0, n2) 时,c1·g(n) ≤ f(n) ≤  c2·g(n) 成立

 

3.1-6


  

  充分性:利用定理3.1,可以知道如果一个算法的运行时间是 Θ(g(n)),那么存在 c2 > 0,只要 n > n0,不论你输入的 n 为何值,运行时间都会小等于 c2·g(n),此时包含了最坏情况的运行时间;再次利用定理3.1,可以知道如果一个算法的运行时间是 Θ(g(n)),那么存在 c1 > 0,只要 n > n0,不管你输入的 n 为何值,运行时间都会大等于 c1·g(n),此时包含了最好情况的运行时间。

  必要性:如果在一个算法中,任何输入的运行时间都在最坏情况与最好情况的运行时间之间,那么可知它既是 O(g(n)),又是 Ω(g(n)),这儿的”是“相当于”∈“。由定理 3.1 知,它是 Θ(g(n))

 

3.1-7


  

  由于 ω(g(n)) = {f(n) | 对任意 c > 0,存在 n0 >0, 使得 n > n0 时有 0 ≤ c·g(n) < f(n)} ,它表示的是非渐进紧确的下界。现在令f(n) = ω(g(n)) ,则 f(n) ∩ g(n) = φ ,所以 ο( f(n) ∩ g(n) ) = φ

  或者利用反证法,假设 f(n) ∈ o(g(n)) ∩ ω(g(n)),则出现如下情况:

    《算法导论》第三章 练习题 Exercise

  矛盾。所以原命题不成立。

 

3.1-8


  

  Ω(g(n, m)) = {f(n, m) | 存在 c > 0、n0 > 0、m0 > 0,使得对所有 n ≥ n0 或 m ≥ m0,有 0 ≤ c·g(n,m) ≤ f(n, m)}

  Θ(g(n, m)) = {f(n,m) | 存在 c1 > 0、c2 > 0、n0 > 0、m0 > 0,使得对所有 n ≥ n0 或 m ≥ m0,有 c1·g(n,m) ≤ f(n, m) ≤ c2·g(n,m)}

  这儿的函数都是渐进非负的。

 

3.2-1


  

  已知对于 m <= n 时,f(m) <= f(n) ,g(m) <= g(n ) ,则由两函数相加,有 f(m) + g(m) <= f(n) + g(n) ,所以函数 f(n) + g(n) 是单调递增的。

  令 a = g(m), b = g(n) ,由于 g(n) 是单调递增的,则对于 a <= b,有f(a) <= f(b) 恒成立,所以 f(g(n)) 是单调递增的。

 

3.2-2


 

  alogbc = a · (logac / logab) = c / logab = c · logba

 

3.2-3


  

  我们用 stirling 公式将 lg(!n) 化简,有下式:

  《算法导论》第三章 练习题 Exercise

  将最后一项化成对数相减的形式,发现这两项是近似相等的,可以消去,则式子主要受 n·lg(n) 的影响,所以 lg(n!) = lg(n·lg(n))

  若证明 n! = ω(2n) ,可以令 f(n) = n!,g(n) = 2n,求 n 趋于无穷时 g(n)/f(n) 的极限,即

  《算法导论》第三章 练习题 Exercise

  让 n >= 4e,右式 = 0。所以证明成立。

  若想证明 n! = o(nn),同理,令 g(n) = nn,f(n) = n!,求 n 趋于无穷时 g(n)/f(n) 的极限为无穷即可。有

  《算法导论》第三章 练习题 Exercise

 

3.2-4 


  

  多项式有界就是指存在常量 k ,使得 f(n) = O(nk) 成立。可以把这个等式两边取对数,有 lgf(n) ≤ lgc + k·lgn ,所以只要满足 lgf(n) = O(lgn) ,则称 f(n) 是多项式有界的。

  对于函数 f(n) = ⌈lgn⌉ ! ,有 lgf(n) = lg(⌈lgn⌉!) = Θ(⌈lgn⌉·lglgn⌉) > O(lgn)   ,所以

lgn⌉ ! 不是多项式有界。

  对于函数 f(n) = ⌈lg(lgn)⌉ ! ,令 m = lg(lgn) ,有 lgf(n) = lg(m!) = Θ(m·lgm) = Θ(lg(lgn)·lg(lg(lgn))) = O(lg(lgn)·lg(lgn)) = O(lgn) ,所以函数 f(n) =  ⌈lg(lgn)⌉ ! 是多项式有界

 

3.2-5


 

  根据迭代对数的性质: 《算法导论》第三章 练习题 Exercise

  可知 lg*n 是一个增长很慢的函数,比对数函数都慢。

  记 n = 2n,则 lg* 2n = 1 +  lg* (lg 2n) ,有如下推导:

  《算法导论》第三章 练习题 Exercise

  所以第二种增长的要更快。

 

 

3.2-6


  

   《算法导论》第三章 练习题 Exercise

    

3.2-7


 

  当 i = 0 时,《算法导论》第三章 练习题 Exercise  ;

  当 i = 1 时,《算法导论》第三章 练习题 Exercise  ;

  假设当 i = i - 1 时, 《算法导论》第三章 练习题 Exercise 成立;

  当 i  = i 时, 《算法导论》第三章 练习题 Exercise ;

  证毕。

 

3.2-8


  

  设存在 c1、c2 使得 c1·n ≤ k·lnk ≤ c2·n 。

  对 ( c1·n ≤ k·lnk )两边取对数,则有 lnc1 + lnn ≤ lnk + ln(lnk) ,得 lnn = O(lnk) 。设存在 c3 使得   lnn ≤ c3·lnk ,则有 《算法导论》第三章 练习题 Exercise ,所以 《算法导论》第三章 练习题 Exercise

  同理对 ( k·lnk ≤ c2·n)进行相同的推导,有 《算法导论》第三章 练习题 Exercise ,所以 《算法导论》第三章 练习题 Exercise

  由定理3.1 知,《算法导论》第三章 练习题 Exercise

  由于 Θ 的对称性,得 《算法导论》第三章 练习题 Exercise