3.1-1:
证明:由题意可知 , f(n),g(n) 渐进非负 , 则存在 n′>0 ,使得当 n≥n′ 时,f(n)≥0,g(n)≥0 同时成立.
令 h(n)=max(f(n),g(n)).那么 , h(n) 可以表示为:
h(n)=|f(n)−g(n)|+g(n)+f(n)2
此题要求证明 ,
∃c1>0,c2>0 , 使得当
n≥n0 时,
0≤c1(f(n)+g(n))≤h(n)≤c2(f(n)+g(n))
成立.
注意到 :
12(f(n)+g(n))≤|f(n)−g(n)|+g(n)+f(n)2≤f(n)+g(n)
所以取 c1=12,c2=1,n0=n′ , 可使得当 n≥n0 时 ,
0≤c1(f(n)+g(n))≤h(n)≤c2(f(n)+g(n))
即 : max(f(n),g(n))=Θ(f(n)+g(n)) 成立 , 从而得证.
3.1-2:
证明:取 n0=2|a|,则当 n≥n0 ,即 n≥2|a| 时,我们有:
−n2≤a≤n2,从而有 n2≤n+a≤3n2.
则,(12)bnb≤(n+a)b≤(32)bnb 对于任意 n≥n0 均成立.
所以,可取 c1=(12)b,c2=(32)b,n0=2|a|,当 n≥n0 时,
c1nb≤(n+a)b≤c2nb
成立,即 (n+a)b=Θ(nb),得证.
3.1-3:
因为 O(n2) 描述的是算法运行时间的上界,而“至少”描述的是算法的运行时间的下界,因此“算法 A 的运行时间至少是 O(n) ”这一表述是无意义的。
3.1-4:
2n+1=O(2n) 成立,而 22n=O(2n) 不成立
3.1-5:
证明:先证明充分性
由 f(n)=O(g(n)) 可知:
存在正常数 c 和 n0,使得对所有 n≥n0,有 0≤f(n)≤cg(n).
又由 f(n)=Ω(g(n)) 可知:
存在正常数 c′ 和 n′0,使得对所有 n≥n′0,有 0≤c′g(n)≤f(n).
综上,存在正常数 c1=c′,c2=c,使得当 n≥max(n0,n′0)) 时,下式
c′g(n)≤f(n)≤cg(n) 成立,即 f(n)=Θ(g(n)) 成立.
再证明必要性:
由 f(n)=Θ(g(n)) 可知,存在正常数 c1,c2,n0 使得当 n≥n0 时,下式
0≤c1g(n)≤f(n)≤c2g(n) 成立,即 f(n)=O(g(n)) 且 f(n)=Ω(g(n)).
综上,得证.
3.1-6:
证明:其最坏情况运行时间为 O(g(n)),则 f(n)≤O(g(n)),其最好情况的运行时间为 Ω(g(n)),则 f(n)=Ω(g(n)) 由 3.1-5 的证明方法可以证明本题.
3.1-7:
本题可用反证法来证明:
证明:假设集合 A=o(g(n))∩w(g(n)) 不为空,那么存在 f(n)∈A,满足:
对于任意正常量 c1≥0,存在常量 n0≥0,使得对所有 n≥n0,有 0≤f(n)≤cg(n);同时对于任意常量 c2≥0,存在常量 n′0≥0,使得对所有 n≥n′0,有 0≤cg(n)≤f(n).
那么当 n≥max(n0,n′0),有 c2g(n)<f(n)<c1g(n),因为 c1,c2 可以是任意正常量,那么当 c1=c2=c(其中 c 为任意常量),满足条件的 f(n) 并不存在,所以集合 A 必为空.
3.1-8:
略.
3.2-1:
证明:由题意可知,f(n),g(n) 单调递增,则取 n1 ,n2,当满足 n1≤n2 时,有
f(n1)≤f(n2),g(n1)≤g(n2),则 f(n1)+g(n1)≤f(n2)+g(n2),f(g(n1))≤f(g(n2)).
所以 f(n)+g(n),f(g(n)) 为单调增函数,如果 f(n),g(n) 都为非负函数,那么有:
0≤f(n1)≤f(n2),0≤g(n1)≤g(n2),从而有 0≤f(n1)g(n1)≤f(n2)g(n2).因此
f(n)g(n) 也是增函数.
3.2-2:
证明:令 n=logbc⇒c=bn,则 clogba=bn⋅logba=an=alogbc,得证.
3.2-3:
证明:(1) 先证明 lg(n!)=Θ(nlgn).
由斯特林渐进公式,我们有:
n!=2πn−−−√⋅(ne)n⋅eαn,其中(112n+1<αn<112n)
对于上式左边的乘数因子 eαn,当 n→∞ 时,eαn→1,从而 n!≈2πn−−−√⋅(ne)n,此时,我们有:
lg(n!)≈lg(2πn−−−√⋅(ne)n)
=lg(2πn−−−√)+lg(ne)n
=12⋅lg(2π)+12⋅lg(n)+n⋅lg(n)−n⋅lg(e)
=Θ(1)+Θ(lg(n))+Θ(nlg(n))−Θ(n)
=Θ(nlg(n))
得证.
(2) 证明 n!=o(nn).
显然,当n>1 时,n⋅(n−1)⋯2⋅1<n⋅n⋅n⋯nn个n 成立,所以 n!=o(nn).
(3) 证明n!=w(2n).
与证明 (2) 类似,显然当 n≥4 时,n!>2⋅2⋯2n个2=2n,所以 n!=w(2n)
3.2-4:
(1). 先来考察 ⌈lgn⌉!
如果 f(n) 是多项式有界的,那么存在 c≥0,k≥0,n0≥0 ,对所有的 n≥n0 ,有 f(n)≤cnk,此时,我
们有:
lg(f(n))≤lg(cnk)=O(lgn)
反之亦然.
由 3.2-3,lg(n!)=Θ(nlg(n)),又 n≤⌈n⌉≤n+1≤2n,所以 ⌈n⌉=Θ(n)
对于 ⌈lgn⌉!,我们有:
lg(⌈lgn⌉!)=Θ(⌈lgn⌉lg(⌈lg(n)⌉))=Θ(lgn⋅lg(lgn))=w(lgn)
从而,lg(⌈lgn⌉)≠O(lgn),所以,⌈lgn⌉! 不是多项式有界的.
(2) 再来考察 ⌈lg(lgn)⌉!,在渐进意义下,lg(⌈lg(lgn)⌉!)≤lg(n),即lg(⌈lg(lgn)⌉!)=O(lg(n)),所以 ⌈lg(lgn)⌉! 是多项式有界的.
3.2-5:
lg∗(n)表示作用到 n 的 lg 函数的次数,从而使得其结果小于等于0.
令 lg∗n=x,则 lg(lg∗n)=lg(x),lg∗(lg(n))=x−1.
在渐进意义下,x−1≥lg(x),所以 lg∗(lg(n))的渐进大于lg(lg∗(n)).
3.2-6:
略
3.2-7:
根据定义:
ϕ=1+5√2,ϕ^=1−5√2
而斐波那契数定义如下:
Fi=⎧⎩⎨01Fi−1+Fi−2i=0i=1i≥2
(1)基本情况:
F0=ϕ0−ϕ0^5√=0
F1=ϕ1−ϕ1^5√=1
满足
Fi=ϕi−ϕi^5√
(2)归纳:
假设 k≥2,当 i=k,i=k−1时,Fi=ϕi−ϕi^5√ 成立,那么当i=k+1 时,根据斐波那契数定义,有:
Fk+1=Fk+Fk−1=ϕk−ϕk^5√+ϕk−1−ϕk−1^5√=(ϕk+ϕk)−(ϕk^+ϕk−1^)5√=ϕk−1(ϕ+1)−ϕk−1^(ϕ^+1)5√=ϕk+1ϕ2−ϕk−1^ϕ2^5√=ϕk+1−ϕk+1^5√
即:
Fk+1=ϕk+1−ϕk+1^5√,从而得证.
3.2-8:
由 klnk=Θ(n) 可知,存在常量 c1,c2,n0>0,当 n≥n0 时,有:
0≤c1n≤klnk≤c2n
这里假设
n0≥e,从而
lnn>1,进一步有:
c1nlnn≤klnklnn≤c2nlnn(1).
如果对不等式
c1n≤klnk≤c2 的各项同时取对数,则有:
ln(c1n)≤ln(klnk)≤ln(c2n)
进一步有:
lnc1+lnn≤lnk+lnlnk≤lnc2+lnn
如果
k 足够大,
lnk+lnlnk<2lnk,从而有:
lnc1+lnn<2lnk
⇒lnc12lnn+12<lnklnn
⇒12k<klnklnn(2).
同时,因为
lnk+lnlnk>lnk,从而又有:
lnk<lnc2+lnn
⇒lnklnn<lnc2lnn+1
⇒lnklnn<2
⇒klnklnn<2k
由
(1),(2) 有:
12k<klnklnn≤c2nlnn⇒k<2c2nlnn(4)
由
(1),(3) 有:
c1nlnn≤klnklnn<2k⇒k>c1n2lnn(5)
由
(4),(5)有:
c22⋅nlnn<k<2c2⋅nlnn
根据
Θ 记号的定义,
k=Θ(nlnn).
思考题:
3-1:
(a):k≥d
p(n)=∑i=0daini≤∑i=0d|ai|ni(n≥0)≤∑i=0d|ai|nk(n≥1)
根据 O 记号定义,取 n0=1,c=∑di=0|ai|,则当 n≥n0,有 0≤p(n)≤cnk,
所以 p(n)≤O(nk) 成立.
(b):k≤d
cnk≤cnd,n≥1
如果有 cnd≤∑di=0(aini),那么也就有 cnk≤∑di=0(aini),从而可根据 O 记号的定义来证明 p(n)=Ω(nk).
cnd≤∑i=0d(aind)=∑i=0d−1(aini)+adnd
⇒cnd≤∑i=0d−1(aini)+adnd(1)
在 (1) 中,令 c=ad2,并代入(1) 式,则有:
adnd2≤∑i=0d−1(aini)+adnd
⇒0≤∑i=0d−1(aini)+adnd2
⇒−∑i=0d−1(aini)≤adnd2(2)
由于:
−∑i=0d−1(aini)=∑i=0d−1(−aini)≤∑i=0d−1(|ai|ni)≤(∑i=0d−1|ai|)nd−1
所以,只要有
(∑i=0d−1|ai|)nd−1≤adnd2(3)
成立,那么 (2) 式也就成立,由 (3) 式
⇒n≥∑d−1i=0|ai|ad2
所以,当c=ad2和 n≥max{∑d−1i=0|ai|ad2,1} 有 cnk≤∑di=0aini=p(n),进一步有 p(n)=Ω(nk)
(c).k=d
由 (a) 部分可知,取 n0=1,c1=∑di=0|ai|,则当 n≥n0,有 0≤p(n)≤c1nk.
由(b) 部分可知,取 n0=max{1,∑d−1|ai|i=0ad2},c2=ad2 则当 n≥n0,有 c2nk≤p(n)≤c2nk.
综上,p(n)=Θ(nk)
(d).k>d.
即是要证明,对任意的 c>0,总能找到 n0(其值依赖于c),使得:
p(n)=∑i=0daini<cnk,∀n≥n0. (1)
成立。由于:
p(n)=∑i=0daini≤(∑i=0d|ai|)nd, (n≥1)
所以只要
(∑i=0d|ai|)nd<cnk. (2)
成立,那么
(1) 式就成立. 由
(2) 式,有:
n≥∑di=0|ai|c−−−−−−−−√k−d
所以对任意的 c>0,当 n>n0=max{1,(∑di=0|ai|c)1k−d}
时,就有
p(n)<cnk,即, p(n)=o(nk).(e).k<d.
即是要证明,对于任意的 c>0 存在 n0>0(其值依赖于 c),使得:
cnk<p(n)=∑i=0daini
成立。由(b)部分可知: ∑i=0d(aini)>(ad2nd),∀n>max{1,∑d−1i=0|ai|ad/2}>cnkadnd−k2c>cnk,∀n>(2cad)k−d
选择: n0=max{1,∑d−1i=0|ai|ad/2,(2cad)k−d}