算法导论课后题和思考题 第3章

本文详细解答了《算法导论》第三章的课后习题与思考题,涵盖函数渐近性质、算法运行时间分析、数学证明等内容,包括单调递增函数性质、对数和指数的等式证明、斐波那契数列与黄金分割率的关系等重点问题。

一、课后习题

3.1-1 假设f(n)g(n)都是渐近非负函数。使用\Theta记号的基本定义来证明  max(f(n),g(n))=\Theta(f(n)+g(n))

不妨假设 max(f(n),g(n))=g(n), 要证明max(f(n),g(n))=\Theta(f(n)+g(n)), 即证明存在正常量c_1c_2 使得c_1(f(n)+g(n))\leqslant g(n)\leqslant c_2(f(n)+g(n)),因此当c_1=1/2, c_2=1 时,上式成立,得证。

3.1-2  证明:对任意实常量a和b,其中b>0,有(n+a)^b=\Theta(n^b)

要证明(n+a)^b=\Theta(n^b), 即证明 存在正常量c_1c_2 使得c_1n^b\leqslant (n+a)^b\leqslant c_2n^b,取c_1=1和c_2=(1+a)^b即成立,得证。

3.1-3  解释为什么“算法A的运行时间至少是O(n^2)”这一表述是无意义的。

因为O(n^2)的含义是函数的紧确上界为O(n^2),说算法A的运行时间至少是O(n^2)指出的是下界,因此这一表述是无意义的。

3.1-4   2^{(n+1)} = O(2^n)成立吗?2^{2n}=O(2^n)成立吗?

2^{(n+1)} = O(2^n) 成立

2^{2n}=O(2^n) 不成立,因为不存在c_2使得 (2^n)^2\leqslant c_2*2^n 

3.1-5   证明定理 对任意两个函数f(n)g(n),我们有f(n)=\Theta(g(n)),当且仅当f(n)=O(g(n))且 f(n)=\Omega(g(n))

首先证明f(n) = \Theta(g(n)) 可以推出f(n)=O(g(n)) 和  f(n)=\Omega(g(n)),由于f(n) = \Theta(g(n))表示 存在正常量c_1c_2使得0\leqslant c_1g(n)\leqslant f(n)\leqslant c_2g(n),即0\leqslant f(n)\leqslant c_2g(n) 和0\leqslant c_1g(n)\leqslant f(n) 成立,因此 f(n)=O(g(n))f(n)=\Omega(g(n))成立

其次证明当f(n)=O(g(n))f(n)=\Omega(g(n))时, f(n)=\Theta(g(n)), 由于f(n)=O(g(n)) 表示0\leqslant f(n)\leqslant c_2g(n), f(n)=\Omega(g(n))表示0\leqslant c_1g(n)\leqslant f(n),因此0\leqslant c_1g(n)\leqslant f(n)\leqslant c_2g(n),即f(n) = \Theta(g(n)), 得证。

3.1-6   证明:一个算法的运行时间为\Theta(g(n))当且仅当其最坏情况运行时间为O(g(n)),且其最好情况运行时间为\Omega(g(n))

一个算法的运行时间为\Theta(g(n)),即表示这个算法的运行时间f(n) = \Theta(g(n)), 由3.1-5提到的定理可得,f(n)=O(g(n))并且f(n)=\Omega(g(n)), 因此该算法的下界(最好情况运行时间)为\Omega(g(n)),上界(最坏情况运行时间)为O(g(n))

3.1-7   证明:o(g(n))\cap \omega(g(n))为空集

根据定义,o(g(n)) 代表的集合是 o(g(n)) = \left \{ f(n):对任意正常量c>0,存在常量n_0>0,使得对所有n\geqslant n_0,有 0\leqslant f(n)< cg(n) \left. \right \}

\omega(g(n)) 代表的集合是  \omega(g(n)) = \left \{ f(n):对任意正常量c>0,存在常量n_0>0,使得对所有n\geqslant n_0,有 0\leqslant cg(n) < f(n)\left. \right \}

用反证法,假设存在一个函数f(n) 同时满足上述两个条件,即0\leqslant f(n)<cg(n) 并且 0\leqslant cg(n)< f(n)同时成立,由于和均为正常量,定义要求对任意正常量c 均满足不等式,因此上述两式引发出矛盾,cg(n)<f(n)<cg(n),因此假设不成立,得证。

3.1-8   可以扩展我们的记号到有两个参数n和m的情形,其中的n和m可以按不同速率独立第趋于无穷。对于给定的函数g(n,m),用O(g(n,m))来表示以下函数集:

O(g(n,m)) = \left \{ f(n,m): 存在正常量 c,n_0 和 m_0,使得对于所有n\geqslant n_0m\geqslant m_0,有0\leqslant f(n,m)\leqslant cg(n,m) \left. \right \}

\Omega(g(n,m))\Theta(g(n,m))给出相应的定义

\Omega(g(n,m)) = \left \{ f(n,m): 存在正常量 c,n_0 和 m_0,使得对于所有n\geqslant n_0m\geqslant m_0,有0\leqslant cg(n,m)\leqslant f(n,m) \left. \right \}

\Theta(g(n,m)) = \left \{ f(n,m): 存在正常量 c_1,c_2,n_0 和 m_0,使得对于所有n\geqslant n_0m\geqslant m_0,有0\leqslant c_1g(n,m)) \leqslant f(n,m)\leqslant c_2g(n,m) \left. \right \}

3.2-1   证明: 若f(n) 和 g(n) 是单调递增的函数,则函数f(n)+g(n) 和 f(g(n)) 也是单调递增的,此外,若f(n) 和 g(n) 是非负的,则f(n) · g(n) 是单调递增的。

由于f(n) 和 g(n) 为单调递增函数,因此对于n_1<n_2, 有f(n_1)<f(n_2)g(n_1)<g(n_2),将不等式左右分别相加可得f(n_1)+g(n_1)< g(n_1)+g(n_2),因此f(n)+g(n)也是单调递增的。

若f(n) 和 g(n) 是非负的,则对于所有的n有f(n)\geqslant 0g(n)\geqslant 0,则f(n)\cdot g(n)>0,同时f(n_1)<f(n_2)g(n_1)<g(n_2),因此f(n_1)\cdot g(n_1)<f(n_2)\cdot g(n_2),因此f(n)\cdot g(n)是单调递增的。

3.2-2   证明等式 a^{log_bc}=c^{log_ba}

首先对左右两边分别lg,log_bclga = log_balgc

由于log_xy=lgy/lgx,因此上式可转为\frac{lgc}{lgb}lga=\frac{lga}{lgb}lgc,得证。

3.2-3   证明等式 lg(n!)=\Theta(nlgn)。并证明n!=\omega(2^n), n!=o(n^n)

1) 证明等式lg(n!)=\Theta(nlgn),即证明存在正常量c_1,c_2 和 n_0, 使得对所有n\geqslant n_0,有0\leqslant c_1nlgn\leqslant lg(n!)\leqslant c_2nlgn

首先证明左边成立,用斯特林公式代替n!,即证明存在c_1,使得0\leqslant c_1nlgn\leqslant lg(\sqrt{2\pi n}( \frac{n}{e})^{n}e^{\alpha _{n}})

\because lg(\sqrt{2\pi n}( \frac{n}{e})^{n}e^{\alpha _{n}})-c_1nlgn > lg(\sqrt{2\pi n}( \frac{n}{e})^{n}e^{1/(12n+1)})-c_1nlgn

所以证明0\leqslant c_1nlgn\leqslant lg(\sqrt{2\pi n}( \frac{n}{e})^{n}e^{\alpha _{n}}) 即证明上式大于0。由于当n=e,c_1=1/2时,上式大于0,因此只要证明lg(\sqrt{2\pi n}( \frac{n}{e})^{n}e^{1/(12n+1)})-c_1nlgn 为单调递增函数即可,将c_1=1/2带入,并对该式求导可得lg(\sqrt{2\pi n}( \frac{n}{e})^{n}e^{1/(12n+1)})-c_1nlgn = ((lnn-1)n(12n+1)^2+144n^2+1)/(2n(12n+1)^2ln2)

该导数对于n>e 恒大于0,因此lg(\sqrt{2\pi n}( \frac{n}{e})^{n}e^{1/(12n+1)})-c_1nlgn为单调递增函数,即对于n\geqslant e,存在c_1=1/2使得0\leqslant c_1nlgn\leqslant lg(\sqrt{2\pi n}( \frac{n}{e})^{n}e^{\alpha _{n}})成立

其次证明右边成立,即证明lg(n!)\leqslant c_2nlgn,由于lg1+lg2+...+lgn\leqslant \sum_{i=1}^{n}lgn,因此存在c_2=1使得lg(n!)\leqslant nlgn成立。

结合以上两步可得lg(n!)=\Theta(nlgn),得证。

2)证明n!=\omega(2^n)

\because \frac{n!}{2^n}=\frac{1*2*3*...*n}{2*2*2*...*2}>1

\therefore n!>2^n

即对任意正常量c>0,存在常量n_0=4>0,使得对所有n\geqslant n_0,有 0\leqslant c*2^n < n!,因此n!=\omega(2^n)

3) 证明n!=o(n^n)

\because \frac{n!}{n^n}=\frac{1*2*3*...*n}{n*n*n*...*n}<1

\therefore n!<n^n

即对任意正常量c>0,存在常量n_0=2>0,使得对所有n\geqslant n_0,有 0\leqslant n!< cn^n,因此n!=o(n^n)

3.2-4   函数 \left \lceil lgn \right \rceil!多项式有界吗?函数 \left \lceil lglgn \right \rceil!多项式有界吗?

首先,函数f(n)多项式有界表示 f(n)\leqslant cn^k,两边求对数lg(f(n))\leqslant lgc+klgn,即lg(f(n)) = O(lgn)

1) \left \lceil lgn \right \rceil!不是多项式有界

结合lg(n!)=\Theta(nlgn)\left \lceil lgn \right \rceil=\Theta(lgn)

lg(\left \lceil lgn \right \rceil!)=\Theta(\left \lceil lgn \right \rceil\,lg\left \lceil lgn \right \rceil)=\Theta(lgnlglgn)=\omega(lgn)\neq O(lgn)

2)    \left \lceil lglgn \right \rceil! 是多项式有界的

lg(\left \lceil lglgn \right \rceil!)=\Theta(\left \lceil lglgn \right \rceil\,lg\left \lceil lglgn \right \rceil)=\Theta(lglgnlglglgn)=o((lglgn)^2)=o(lg^2(lgn))=o(lgn)

3.2-5   如下两个函数中,哪一个渐近更大些:lg(lg^*n)还是lg^*(lgn)

因为 lg^*(lgn)=lg^*n-1, 所以lg(lg^*n)渐近更大一点。

3.2-6   证明: 黄金分割率\o及其共轭数\hat{\o }都满足方程x^2=x+1

\o =\frac{1+\sqrt{5}}{2}代入方程,x^{2} = (\frac{1+\sqrt{5}}{2})^2=\frac{1+2\sqrt{5}+5}{4}=\frac{3+\sqrt{5}}{2}=\frac{1+\sqrt{5}}{2}+1=x+1

\hat{\o} =\frac{1-\sqrt{5}}{2}代入方程,x^{2} = (\frac{1-\sqrt{5}}{2})^2=\frac{1-2\sqrt{5}+5}{4}=\frac{3-\sqrt{5}}{2}=\frac{1-\sqrt{5}}{2}+1=x+1

3.2-7   用归纳法证明:第i个斐波那契数满足等式F_i = (\o ^i- \hat{\o }^i)/\sqrt{5}, 其中\o是黄金分割率且\hat{\o }是其共轭数。

当i=0时,F_0=\frac{1-1}{\sqrt{5}}=0成立,假设当i=k-1和i=k-2时,上式成立,

F_{k-1} = (\o ^{k-1}- \hat{\o }^{k-1})/\sqrt{5}F_{k-2} = (\o ^{k-2}- \hat{\o }^{k-2})/\sqrt{5},

F_{k}=F_{k-2}+F_{k-1}=(\o ^{k-2}- \hat{\o }^{k-2})/\sqrt{5}+(\o ^{k-1}- \hat{\o }^{k-1})/\sqrt{5}

由于(\o ^{k-2}- \hat{\o }^{k-2}+\o ^{k-1}- \hat{\o }^{k-1})/\sqrt{5}=\frac{\o ^{k-2}(\o +1)-\hat{\o} ^{k-2}( \hat{\o}+1)}{\sqrt{5}}=\frac{\o ^k-\hat{\o }^k}{\sqrt{5}},得证。

3.2-8   证明: klnk = \Theta(n)蕴含着k=\Theta(n/lnn)

根据对称性,有klnk = \Theta(n)蕴含n=\Theta(klnk )

两边取对数,lnn=\Theta(lnk+lnlnk )=\Theta(lnk)

上述两式相除可得  \frac{n}{lnn}=\Theta(k),再应用一次对称性,可得,k=\Theta(n/lnn),得证。

 

二、思考题

3-1    (多项式的渐近行为)假设p(n)=\sum_{i=0}^{d}a_in^i是一个关于n的d次多项式,其中a_d>0,k是一个常量。使用渐近记号的定义来证明下面的性质。

a. 若k\geqslant d,则p(n)=O(n^k)

b. 若k\leqslant d,则p(n)=\Omega(n^k)

c. 若k=d, 则p(n)=\Theta(n^k)

d. 若k>d, 则p(n)=o(n^k)

e. 若k<d, 则p(n)=\omega(n^k)

  • a)  因为k\geqslant dp(n)=\sum_{i=0}^{d}a_in^i\leqslant d*n^k,即存在c =d>0 使得p(n)\leqslant c*n^k,因此p(n)=O(n^k)
  • b)  因为k\leqslant d,因此p(n)=\sum_{i=0}^{d}a_in^i \geqslant n^k,即存在c=1>0使得p(n)\geqslant n^k,因此从p(n)=\Omega(n^k)
  • c)  因为k=d,因此0\leqslant c_1g(n)\leqslant f(n)\leqslant c_2g(n),该式对于c_1=1 和 c_2=a_d+d时成立,因此p(n)=\Theta(n^k)
  • d)  因为k>d,因此p(n)=\sum_{i=0}^{d}a_in^i < d*n^k,即存在c=d>0使得p(n) < c*n^k,因此p(n)=o(n^k)
  • e)   因为k<d,因此p(n)=\sum_{i=0}^{d}a_in^i > n^k,即存在c=1>0使得p(n) > n^k,因此p(n)=\omega(n^k)

3-2    (相对渐近增长) 为下表中的每对表达式(A,B)指出A是否是B的O,o,\Omega,\omega\Theta。假设k\geqslant 1,\varepsilon >0c>1均为常量。回答应该以表格的形式,将“是”或“否”写在每个空格中。

ABOo\Omega\omega\Theta
lg^knn^\varepsilon
n^kc^n
\sqrt{n}n^{sinn}
2^n2^{n/2}
n^{lgc}c^{lgn}
lg(n!)lg(n^n)

3-3    (根据渐近增长率排序)

a. 根据增长的阶来排序下面的函数,即求出满足g_1=\Omega(g_2), \,g_2=\Omega(g_3),...,g_{29}=\Omega(g_{30})的函数得到一种排列g_1,g_2,...,g_{30}。把你的表划分成等价类,使得函数f(n)和g(n)在相同类中当且仅当f(n)=\Theta(g(n))

lg(lg^*n)2^{lg^*n}(\sqrt{2})^{lgn}n^2n!(lgn)!
(\frac{3}{2})^nn^3lg^2nlg(n!)2^{2^n}n^{1/lgn}
lnlnnlg^*nn\cdot 2^nn^{lg\,lgn}lnn1
2^{lgn}(lgn)^{lgn}e^n4^{lgn}(n+1)!\sqrt{lgn}
lg^*(lgn)2^{\sqrt{2lgn}}n2^nnlgn2^{2^{(n+1)}}

b.  给出非负函数f(n)的一个例子,使得对所有在(a)部分中的函数g_i(n),f(n)既不是O(g_i(n))也不是\Omega(g_i(n))

  • a)  排序如下
    1.  1n^{1/lgn}
    2.  lg(lg^*n)
    3.  lg^*(lgn)
    4. lg^*n
    5. 2^{lg^*n}
    6. lnlnn
    7. \sqrt{lgn}
    8. lnn
    9. (\sqrt{2})^{lgn}
    10. 2^{\sqrt{2lgn}}
    11. lg^2n
    12. n2^{lgn}
    13. nlgnlg(n!)
    14. n^24^{lgn}
    15. n^{lg\,lgn}(lgn)^{lgn}
    16. n^3
    17. (\frac{3}{2})^n
    18. 2^n
    19. n\cdot 2^n
    20. e^n
    21. (lgn)!
    22. n!
    23. (n+1)!
    24. 2^{2^n}
    25. 2^{2^{(n+1)}}
  •   b) 只要函数本身处于随着n振荡的状态,且f(n) 的最大值比2^{2^{(n+1)}}大即可,因此可以设置 f(n)=sinn2^{2^{n^2+1}}

3-4    (渐近记号的性质)假设f(n)和g(n)为渐近正函数。证明或反驳下面的每个猜测。

a. f(n) = O(g(n))蕴含g(n)=O(f(n))

b. f(n)+g(n)=\Theta(min(f(n),g(n)))

c. f(n) = O(g(n))蕴含lg(f(n))=O(lg(g(n))),其中对所有足够大的n,有lg(g(n))\geqslant 1f(n)\geqslant 1

d. f(n)=O(g(n))蕴含2^{f(n)}=O(2^{g(n)})

e. f(n)=O((f(n))^2)

f. f(n)=O(g(n))蕴含g(n)=\Omega(f(n))

g. f(n)=\Theta(f(n/2))

h. f(n)+o(f(n))=\Theta(f(n))

  • a) 不成立。因为f(n) = O(g(n))f(n)\leqslant c_1g(n),且c_1> 0,推不出g(n)\leqslant {c_1}'f(n),其中 {c_1}'> 0
  • b) 不成立。因为假设 min(f(n),g(n))=f(n),则不存在c_2>0,使得f(n)+g(n)\leqslant c_2f(n)
  • c)  成立。因为  f(n) = O(g(n))表示 存在c_1> 0使得f(n)\leqslant c_1g(n),两边取对数即lg(f(n))\leqslant lgc_1+lg( g(n))\leqslant {c_1}'lg(g(n)), 只要{c_1}'> 1上式即成立,因此lg(f(n))=O(lg(g(n)))
  • d)  成立。因为要证明  2^{f(n)}=O(2^{g(n)})即证明存在{c_1}',c_1> 0使得2^{f(n)}\leqslant c_12^{g(n)},两边取对数f(n)\leqslant lgc_1+g(n)\leqslant {c_1}'g(n),由于f(n) = O(g(n)),因此上式成立。
  • e)  不成立。假设f(n)=1/n即不存在f(n)=O((f(n))^2)
  • f)   成立。因为f(n)=O(g(n)),即表示存在c_1> 0使得f(n)\leqslant c_1g(n),因此1/c_1f(n)\leqslant g(n), 所以g(n)=\Omega(f(n))
  • g)  不成立。假设f(n)=2^n,则不存在c_1,c_2> 0使得c_12^{n/2}\leqslant 2^n\leqslant c_22^{n/2}
  • h)  成立。假设g(n)=of(n)<c_1f(n),因此c_1f(n)\leqslant f(n)+o(f(n))=f(n)+g(n)\leqslant ( c_1+1)f(n)即存在c_1 = c_1, c_2=c_1+1使得c_1f(n)\leqslant f(n)+o(f(n))\leqslant c_2f(n),因此f(n)+o(f(n))=\Theta(f(n))

3-5    (O\Omega的一些变形)  某些作者用一种与我们稍微不同的方式来定义\Omega;假设我们使用\overset{\infty}{\Omega}(读作“\Omega无穷”)来表示这种可选的定义。若存在正常量c,使得对无穷多个整数n,有f(n)\geqslant cg(n)\geqslant 0,则称f(n)=\overset{\infty}{\Omega}(g(n))

a. 证明:对渐近非负的任意两个函数f(n)和g(n),或者f(n)=O(g(n))或者f(n)=\overset{\infty}{\Omega}(g(n))或者二者均成立,然而,如果使用\Omega来代替\overset{\infty}{\Omega},那么该命题并不为真

b. 描述用\overset{\infty}{\Omega}代替\Omega来刻画程序运行时间的潜在优点与缺点。

某些作者也用一种稍微不同的方式来定义O,假设使用{O}'来表示这种可选的定义。我们称f(n)={O}'(g(n))当且仅当\left | f(n) \right |=O(g(n))

c. 如果使用{O}'代替O但仍然使用\Omega,定理3.1中的“当且仅当”的每个方向将出现什么情况?

有些作者定义\tilde{O}(读作“软O”)来意指忽略对数因子的O:

\tilde{O}(g(n))={f(n):存在正常量c,kn_0,使得对所有n\geqslant n_0,有0\leqslant f(n)\leqslant cg(n)lg^k(n)\left. \right \}

d. 用一种类似的方式定义\tilde{\Omega}\tilde{\Theta}。证明与定理3.1相对应的类似结论。

  • a)  首先证明对于0\leqslant cg(n)\leqslant f(n),只可能对无限个n,有限个n或者0个n成立,即只可能存在f(n)=\overset{\infty}{\Omega}(g(n))f(n)=O(g(n))或者二者均成立。 如果使用\Omega来代替\overset{\infty}{\Omega},假设f(n)=n,g(n)=n^{sinn},该式对于\overset{\infty}{\Omega}成立,但是并不满足当n\geqslant n_0时,n\geqslant c_1n^{sinn},即\Omega不成立。
  • b)  优点:这个界相较于\Omega更为宽松。缺点:不是紧确的渐近下界,实际意义不大。
  • c)  当且仅当会变为蕴含,即f(n)=\Theta(g(n))\rightarrow f(n)={O}'(g(n)),但是反向推不出来。
  • d)   \tilde{\Omega} 的定义为 : \tilde{\Omega}(g(n))={f(n):存在正常量c,kn_0,使得对所有n\geqslant n_0,有0\leqslant cg(n)lg^{-k}(n)\leqslant f(n) \left. \right \}                                          \tilde{\Theta} 的定义为:\tilde{\Theta}(g(n))={f(n):存在正常量c_1,k_1,c_2,k_2n_0,使得对所有n\geqslant n_0,有                                                                                  0\leqslant c_1g(n)lg^{-k_1}(n)\leqslant f(n)\leqslant c_2g(n)lg^{k_2}(n) \left. \right \}

3-6    (多重函数) 我们可以把用于函数lg^*中的重复操作符*应用于实数集上的任意单调递增函数f(n)。对给定的常量c\in R,我们定义多重函数f_c^*f_c^*(n)=min\left \{ i\geqslant 0:f^{(i)}(n)\leqslant c\left. \right \} \right.

该函数不必在所有情况下都为良定义的。换句话说,值f^*_c(n)是为缩小其参数到c或更小所需要函数f重复应用的数目。

对如下每个函数f(n)和常量c,给出f^*_c(n)的一个尽量紧确的界。

f(n)cf_c^*(n)
n-10\Theta(n)
lgn1\Theta(lg^*n)
n/21\Theta(lgn)
n/22\Theta(lgn)
\sqrt{n}2\Theta(lglg(n))
\sqrt{n}1does not converge
n^{1/3}2\Theta(log_3(lgn))
n/lgn2\omega(lglgn) ,o(lgn)

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值