算法导论 — 思考题3-3 根据渐近增长率排序

根据渐近增长率排序
  a. 根据增长的阶来排序下面的函数,即求出满足 g 1 = Ω ( g 2 ) , g 2 = Ω ( g 3 ) , … , g 29 = Ω ( g 30 ) g_1 = Ω(g_2), g_2 = Ω(g_3), …, g_{29} = Ω(g_{30}) g1=Ω(g2),g2=Ω(g3),,g29=Ω(g30)的函数的一种排序 g 1 , g 2 , … , g 30 g_1, g_2, …, g_{30} g1,g2,,g30。把你的表划分成等价类,使得函数 f ( n ) f(n) f(n) g ( n ) g(n) g(n)在相同类中当且仅当 f ( n ) = Θ ( g ( n ) ) f(n) = Θ(g(n)) f(n)=Θ(g(n))
  算法导论 — 思考题3-3 根据渐近增长率排序_第1张图片
  b. 给出非负函数 f ( n ) f(n) f(n)的一个例子,使得对所有在(a)部分中的函数 g i ( n ) g_i(n) gi(n) f ( n ) f(n) f(n)既不是 O ( g i ( n ) ) O(g_i(n)) O(gi(n))也不是 Ω ( g i ( n ) ) Ω(g_i(n)) Ω(gi(n))
  
  
  a.
  在下面的表格中,表格上层的函数比下层的函数增长要快,表格同一行中的函数互为 Θ Θ Θ关系。
  算法导论 — 思考题3-3 根据渐近增长率排序_第2张图片
  一些简单的函数在这里就不做分析了,我们挑一些函数来分析。
  
  (1) g 2 ( n ) = 2 2 n g_2 (n)=2^{2^n} g2(n)=22n g 3 ( n ) = ( n + 1 ) ! g_3 (n)=(n+1)! g3(n)=(n+1)!
  先分析 g 3 ( n ) g_3 (n) g3(n),有 g 3 ( n ) = ( n + 1 ) ! < ( n + 1 ) n + 1 g_3 (n)=(n+1)!<(n+1)^{n+1} g3(n)=(n+1)!<(n+1)n+1。令 f 3 ( n ) = ( n + 1 ) n + 1 f_3 (n)=(n+1)^{n+1} f3(n)=(n+1)n+1,现在来比较 g 2 ( n ) g_2 (n) g2(n) f 3 ( n ) f_3 (n) f3(n)。直接比较二者很困难,我们分别对二者取复合对数。
     l g l g ( g 2 ( n ) ) = l g l g ( 2 2 n ) = l g ( 2 n ) = n {\rm lglg}(g_2(n))={\rm lglg}(2^{2^n})={\rm lg}(2^n)=n lglg(g2(n))=lglg(22n)=lg(2n)=n
     l g l g ( f 3 ( n ) ) = l g l g ( ( n + 1 ) n + 1 ) = l g [ ( n + 1 ) ∙ l g ( n + 1 ) ] = l g ( n + 1 ) + l g l g ( n + 1 ) < 2 l g ( n + 1 ) {\rm lglg}(f_3(n))={\rm lglg}((n+1)^{n+1})={\rm lg}[(n+1)∙{\rm lg}(n+1)]={\rm lg}(n+1)+{\rm lglg}(n+1)<2{\rm lg}(n+1) lglg(f3(n))=lglg((n+1)n+1)=lg[(n+1)lg(n+1)]=lg(n+1)+lglg(n+1)<2lg(n+1)
  当 n n n足够大时,有 2 l g ( n + 1 ) < n 2{\rm lg}(n+1)<n 2lg(n+1)<n,故 l g l g ( f 3 ( n ) ) < l g l g ( g 2 ( n ) ) {\rm lglg}(f_3(n))<{\rm lglg}(g_2 (n)) lglg(f3(n))<lglg(g2(n))。由于复合对数函数 l g l g ( x ) {\rm lglg}(x) lglg(x)是单调递增的,所以当 n n n足够大时,有 f 3 ( n ) < g 2 ( n ) f_3(n)<g_2(n) f3(n)<g2(n)。又由于 g 3 ( n ) < f 3 ( n ) g_3(n)<f_3(n) g3(n)<f3(n),所以当 n n n足够大时,有 g 3 ( n ) < g 2 ( n ) g_3(n)<g_2(n) g3(n)<g2(n),所以 g 2 ( n ) = Ω ( g 3 ( n ) ) g_2(n)=Ω(g_3(n)) g2(n)=Ω(g3(n))
  
   (2) g 8 ( n ) = ( 3 2 ) n g_8 (n)=(\frac{3}{2})^n g8(n)=(23)n g 9 ( n ) = ( l g n ) l g n g_9 (n)=({\rm lg}n)^{{\rm lg}n} g9(n)=(lgn)lgn
  同样直接比较二者很困难,我们分别对二者分取对数。
     l g ( g 8 ( n ) ) = l g ( 3 2 ) n = n l g 3 2 {\rm lg}(g_8(n))={\rm lg}(\frac{3}{2})^n=n{\rm lg}\frac{3}{2} lg(g8(n))=lg(23)n=nlg23
     l g ( g 9 ( n ) ) = l g ( ( l g n ) l g n ) = l g n ∙ l g l g n ≤ l g 2 n {\rm lg}(g_9(n))={\rm lg}(({\rm lg}n)^{{\rm lg}n})={\rm lg}n∙{\rm lglg}n≤{\rm lg}^2n lg(g9(n))=lg((lgn)lgn)=lgnlglgnlg2n
  利用3.2节的结论 “ “ 任意多项式函数都比任意多对数函数增长要快 ” ” ,所以 l g 2 n = o ( n l g 3 2 ) {\rm lg}^2 n=o(n{\rm lg}\frac{3}{2}) lg2n=o(nlg23)。这说明,当 n n n足够大时,必然有 l g 2 n < n l g 3 2 {\rm lg}^2n<n{\rm lg}\frac{3}{2} lg2n<nlg23,即 l g ( g 9 ( n ) ) < l g ( g 8 ( n ) ) {\rm lg}(g_9 (n))<{\rm lg}(g_8 (n)) lg(g9(n))<lg(g8(n))。由于对数函数是单调递增的,所以当 n n n足够大时,有 g 9 ( n ) < g 8 ( n ) g_9 (n)<g_8 (n) g9(n)<g8(n),所以 g 8 ( n ) = Ω ( g 9 ( n ) ) g_8 (n)=Ω(g_9 (n)) g8(n)=Ω(g9(n))
  
   (3) g 11 ( n ) = ( l g n ) ! g_{11}(n)=({\rm lg}n)! g11(n)=(lgn)! g 12 ( n ) = n 3 g_{12}(n)=n^3 g12(n)=n3
  利用习题3.2-4的结果“ ⌈ l g n ⌉ ! ⌈{\rm lg}n⌉! lgn!不是多项式有界”,说明 ( l g n ) ! ({\rm lg}n)! (lgn)!比多项式函数增长要快,而 g 12 ( n ) g_{12} (n) g12(n)刚好就是一个多项式函数。所以 g 11 ( n ) = Ω ( g 12 ( n ) ) g_{11} (n)=Ω(g_{12} (n)) g11(n)=Ω(g12(n))
  
   (4) g 19 ( n ) = ( 2 ) l g n g_{19}(n)=(\sqrt{2})^{{\rm lg}n} g19(n)=(2 )lgn g 20 ( n ) = 2 2 l g n g_{20}(n)=2^{\sqrt{2{\rm lg}n}} g20(n)=22lgn
   还是分别对二者取对数进行分析。
      l g ( g 19 ( n ) ) = l g ( ( 2 ) l g n ) = l g n ∙ l g 2 = 1 2 l g n {\rm lg}(g_{19}(n))={\rm lg}((\sqrt{2})^{{\rm lg}n})={\rm lg}n∙lg\sqrt{2}=\frac{1}{2}{\rm lg}n lg(g19(n))=lg((2 )lgn)=lgnlg2 =21lgn
      l g ( g 20 ( n ) ) = l g ( 2 2 l g n ) = 2 l g n = 2 ∙ ( l g n ) 1 / 2 {\rm lg}(g_{20}(n))={\rm lg}(2^{\sqrt{2{\rm lg}n}})=\sqrt{2{\rm lg}n}=\sqrt{2}∙({\rm lg}n)^{1/2} lg(g20(n))=lg(22lgn )=2lgn =2 (lgn)1/2
   如果令 m = l g n m = {\rm lg}n m=lgn,上面两个等式就变为 l g ( g 19 ( n ) ) = 1 2 m {\rm lg}(g_{19}(n))=\frac{1}{2}m lg(g19(n))=21m l g ( g 20 ( n ) ) = 2 ∙ m 1 / 2 {\rm lg}(g_{20}(n))=\sqrt{2}∙m^{1/2} lg(g20(n))=2 m1/2。显然,当 m m m足够大时,必然有 1 2 m > 2 ∙ m 1 / 2 \frac{1}{2}m>\sqrt{2}∙m^{1/2} 21m>2 m1/2,即 l g ( g 19 ( n ) ) > l g ( g 20 ( n ) ) {\rm lg}(g_{19} (n))>{\rm lg}(g_{20} (n)) lg(g19(n))>lg(g20(n)),因为 m m m m 1 / 2 m^{1/2} m1/2增长要快。由于对数函数是单调递增的,所以当 n n n足够大时,有 g 19 ( n ) > g 20 ( n ) g_{19} (n)>g_{20} (n) g19(n)>g20(n)。所以 g 19 ( n ) = Ω ( g 20 ( n ) ) g_{19} (n)=Ω(g_{20} (n)) g19(n)=Ω(g20(n))
  
   (5) g 20 ( n ) = 2 2 l g n g_{20}(n)=2^{\sqrt{2{\rm lg}n}} g20(n)=22lgn g 21 ( n ) = l g 2 n g_{21} (n)={\rm lg}^2n g21(n)=lg2n
   依然对二者取对数进行分析。
      l g ( g 20 ( n ) ) = l g ( 2 2 l g n ) = 2 l g n = 2 ∙ ( l g n ) 1 / 2 {\rm lg}(g_{20} (n))={\rm lg}(2^{\sqrt{2{\rm lg}n}})=\sqrt{2{\rm lg}n}=\sqrt{2}∙({\rm lg}n)^{1/2} lg(g20(n))=lg(22lgn )=2lgn =2 (lgn)1/2
      l g ( g 21 ( n ) ) = l g ( l g 2 n ) = 2 l g l g n {\rm lg}(g_{21} (n))={\rm lg}({\rm lg}^2n)=2{\rm lglg}n lg(g21(n))=lg(lg2n)=2lglgn
   令 m = l g n m = {\rm lg}n m=lgn,上面两个等式就变为 l g ( g 20 ( n ) ) = 2 ∙ m 1 / 2 {\rm lg}(g_{20} (n))=\sqrt{2}∙m^{1/2} lg(g20(n))=2 m1/2 l g ( g 21 ( n ) ) = 2 l g m {\rm lg}(g_{21}(n))=2{\rm lg}m lg(g21(n))=2lgm。利用3.2节的结论 “ “ 任意多项式函数都比任意多对数函数增长要快 ” ” ,可以得出当 m m m足够大时,必然有 2 ∙ m 1 / 2 > 2 l g m \sqrt{2}∙m^{1/2}>2{\rm lg}m 2 m1/2>2lgm,即 l g ( g 20 ( n ) ) > l g ( g 21 ( n ) ) {\rm lg}(g_{20} (n))>{\rm lg}(g_{21} (n)) lg(g20(n))>lg(g21(n))。由于对数函数是单调递增的,所以当 n n n足够大时,有 g 20 ( n ) > g 21 ( n ) g_{20} (n)>g_{21} (n) g20(n)>g21(n)。所以 g 20 ( n ) = Ω ( g 21 ( n ) ) g_{20} (n)=Ω(g_{21} (n)) g20(n)=Ω(g21(n))
  
   b.
   比如下面这个函数。
      在这里插入图片描述

你可能感兴趣的:(算法导论)