zoukankan      html  css  js  c++  java
  • 《算法导论》第三章 练习题 Exercise

    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)),则出现如下情况:

        

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

    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) 化简,有下式:

      

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

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

      

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

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

      

    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


      根据迭代对数的性质: 

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

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

      

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

    3.2-6


      

       

        

    3.2-7


      当 i = 0 时,  ;

      当 i = 1 时,  ;

      假设当 i = i - 1 时,  成立;

      当 i  = i 时,  ;

      证毕。

    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 ,则有  ,所以 

      同理对 ( k·lnk ≤ c2·n)进行相同的推导,有  ,所以 

      由定理3.1 知,

      由于 Θ 的对称性,得 

      

    ————全心全意投入,拒绝画地为牢
  • 相关阅读:
    【整理】Dword、LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR
    C/C++中printf和C++中cout的输出格式
    左值的理解(给渴望学习的新手)
    c++ 指针精髓
    c++中的函数前面加个LRESULT是什么意思啊?
    pb调用vc写的动态链接库文件
    C++问题 & *用法
    vs2008下MFC内存泄露问题一点经验
    mysql5.6.41winx64安装
    开发是一件需要非常小心的工作
  • 原文地址:https://www.cnblogs.com/Bw98blogs/p/8287674.html
Copyright © 2011-2022 走看看