Algorithms
算法概论
习题试解 β
吴彧文(atyuwen)
atyuwen@gmail.com
http://hi.baidu.com/atyuwen
(如有错误,敬请指正)
0 Prologue
Ex.0.1
( )g
f Θ=
a)
b)
( )gOf =
c)
f Θ=
( )g
d)
f Θ=
( )g
e)
f Θ=
( )g
f)
( )gOf =
g)
f Ω=
( )g
h)
f Ω=
( )g
i)
j)
f Ω=
( )g
f Ω=
( )g
k)
f Ω=
( )g
l)
( )gOf =
m)
( )gOf =
n)
f Θ=
( )g
o)
f Ω=
( )g
p)
( )gOf =
q)
( )gOf =
Ex.0.2
根据等比数列求和公式:
( )
nS
( )
nS
=
=
a
1
a
1
n
,
×
c
1(
−
c
1
−
cif
n
)
,
=
1
cif
≠
1
易得结论。
Ex.0.3
a) 数学归纳法,显然有:
F
6
F
7
65.0
×
2
8
≥=
13
2
=
≥
8
=
3.11
75.0
×
≈
若
nF
− ≥
1
2
5.0
(
)1
n
−×
,
nF
− ≥
2
2
5.0
(
n
−×
)2
成立,则有:
F
n
=
F
n
1
−
+
F
n
−
2
≥
2
(5.0
n
−×
)1
(5.0
n
−×
)2
+
2
×>
22
(5.0
n
−×
)2
5.0
×
n
=
2
得证。
b) 同样是数学归纳法,显然,对任意 0>c
21
≤=
21
≤=
F
1
F
2
,有:
c
2
c
考虑归纳的递推过程,若
nF
− ≤
1
(
)1
2 −
nc
,
nF
− ≤
2
(
2 −
nc
)2
成立,有:
F
n
=
F
n
1
−
+
F
n
−
2
≤
2
(
nc
1
−
)
(
nc
−
2
)
+
2
=
cn
2
×
1
2
c
⎛
⎜
⎝
+
1
2
2
c
⎞
⎟
⎠
于是只需要
1
c
2
+
1
2 ≤
c
2
1
即可,令
x
= ,即有
1
c
2
2
x
≤−+ x
01
,于是有:
1
−−
2
5
≤≤
x
1
+−
2
5
将
x
= 代入上式,可解得:
1
c
2
≥c
log 2φ
,
其中
=φ
5
1+
2
,为黄金分割率,从
这里也可以看到 Fibonacci 数列与黄金分割之间的奇妙联系。用计算器可以算得
c
694
。
min ≈
.0
c) 即上面的
c
min ≈
.0
694
Ex.0.4
a) 两个 22× 的矩阵相乘,仍然得一个 22× 的矩阵,其中计算每个元素都分别需
要两次乘法和一次加法,所以总共需要 8 次乘法和 4 次加法。
b) 分治,若 n 为偶数,有
n
X
=
(
X
n
)22/
,若 n 为奇数,有
X
n
=
XX
•
1-n
。显然
计算 nX 只需要 (
O log 次矩阵乘法。
)n
c) 若某次的中间结果为
a
11
a
21
⎡
⎢
⎣
a
12
a
22
⎤
⎥
⎦
,则有:
a
11
a
21
⎡
⎢
⎣
a
12
a
22
⎤
×⎥
⎦
10
⎤
=⎥
11
⎦
⎡
⎢
⎣
a
12
a
21
⎡
⎢
⎣
a
11
a
21
+
+
a
12
a
22
⎤
⎥
⎦
由上式可知,任意中间结果矩阵,与 X 相乘后,其最大元素不会大于原先的最大
的,因此 bit 数是 ( )nO 的。
元素的 2 倍,所以可得,所有的中间结果都是
)2( nO
d)
(
O log 次矩阵乘法,每次相乘为 ( )nM ,当然总共是
)n
(
( )
nMO
log 。
( )
)n
e) 设总的计算次数为 nC ,则有以下递归式:
C
n
=
C
n
2/
( )nM
+
,由主定理知
Cn =
( )
(
)nMO
。
因 ( )
)2nOnM =
(
1 Algorithms with numbers
Ex.1.1
n 位数所能表示的最大值为
1nb − ,根据下列关系式:
b
2 1 3
− ≥
(
b
)
1
− =
b
3
− ⇔ −
3
b
(
)(
1
b
−
2
)
0
≥
b ≥ 时,有 3 个 1 位数的和不超过 2 位。
知,当 2
Ex.1.2
=
16 10
> ,所以可知一个数的 2 进制位数不超过 10 进制位数的 4 倍。
因为 42
设b 为 2 进制表示的位数, d 为 10 进制表示的位数,则有:
b
d
≈
2
log
log
10
n
n
=
log 10 3.322
≈
2
Ex.1.3
设只含根节点的树的高度为 1,则高度为 h 的满树的节点数为:
( )
N h
= + +
1
d
2
d
+
d
h
1
−
=
d
1
h
−
d
1
−
于是由 ( )
N h
≥ ⇒ = Ω
n
h
(
logd
n
)
。
准确表示的话有:
h
=
log (
d
⎡
⎢
dn n
− +
1)
⎥ 。
⎤
Ex.1.4
Hint 很强大:
log
(
n
)
!
=
O
log
(
n
)
!
= Ω
(
⎛
⎜
⎜
⎝
log
n
n
(
⎛
⎜
⎜
⎝
⎛
⎜
⎝
)
n
2
)
⎞
⎟
⎠
=
n
/2
(
O n
⎞
⎟
⎟
⎠
⎞
⎟
⎟
⎠
log
log
n
)
n
2
⎛
⎜
⎝
= Ω •
于是有: (
log
n
)
!
= Θ
(
n
log
n
)
。
= Ω
(
n
log
n
)
log
n
2
⎞
⎟
⎠
Ex.1.5
这题的 Hint 更强大,考虑调和级数
1
3
将每个分母约束到不大于它的 2 的幂形式,有:
1
4
1 1
1 2
H O H
1
4
=
(
u
) 1 1
= + + + + + + +
1 2
1
1
4 8
1
4
1
2
1
4
1
5
1
6
H = + + + + + + +
1
7
1
8
将这个新的级数想象成一颗二叉树的层序遍历,则每层和为 1,由 Ex.1.3 我们知道
树的高度是 (
Θ
然后,将每个分母约束到不小于它自身的 2 的幂,有:
的,即 uH 也是 (
Θ
H O
log n
log n
,于是
log
。
=
n
)
)
(
)
H
= Ω
(
H
l
) 1 1
= + + + + + + +
1 2
1
1 1 1 1
4 8 8 8 8
1
4
忽略到第一项 1,后面又是一颗二叉树的层序遍历,且每层和为 1/2,以上同理可
得,
H
= Ω
n
(log )
,于是得到
H
= Θ
n
(log )
。
Ex.1.6
设有两二进制数 a ,b ,其中
a
=
a a
n n
1
−
a a a a
3 2 1 0
,则有:
a b
× =
n
∑
i
=
0
(
a
i
)
b
× ×
n
2
=
n
∑
i
=
0
(
a
i
×
b
)
<<
n
这正是 Grade-School 方法的数学意义,于是得证。
Ex.1.7
)
设 (
换一下两个乘数即可),则有:
,
(
T n m T n m
)
1
− +
=
)
(
,
,
( )
O n
T n m 为计算 n 位数乘 m 位数所需步数,且假设 n m≥ ,(如果不满足的话交
后面的 ( )O n 包含了一些不超过 mn + 位数的加法和移位操作,(前面之所以需要
n m≥ 就是为了保证在这里的所有操作都是 ( )O n 的,因为
mn
+
2≤
n
),于是可
以得到: (
)nmOmnT
=
)
(
,
。
Ex.1.8
关于正确性:
a) 当 0=x 时该算法显然是正确的。
b) 因 y
r < ,所以
21
<+
2
y
r
总是成立。
c) 当 x 为偶数时,有
x
⎢=
⎢⎣
x
2
⎥
2
=×⎥⎦
(
yq
+
r
2)
=×
2
yp
+
2
r
d) 当 x 为奇数时,有
x
⎢=
⎢⎣
x
2
⎥
(12
=+×⎥⎦
yq
+
r
212)
=+×
yp
+
2
r
+
1
希望我已经“证明”了它的正确性了,下面来看时间复杂度:总共迭代 n 次,每次
迭代需要 ( )O n 次操作,于是 ( )
Ex.1.9
根据同余的定义,有:
(
T n O n
)2
。
=
x
y
≡
≡
x
y
'mod
'mod
N
N
x
'
⇒ = +
y
'
⇒ = +
x
y
rN
sN
于是:
x
x
)
(
s N
r
'
+ = + +
+
ry
sx
'
'
(
+
+
× =
x
'
x y
'
y
'
+
y
y
y
x
'
⇒ + ≡ +
rsN N
)
⇒ ≡
x
xy
y
'mod
x y
'
N
'mod
N
Ex.1.10
a
≡
b
mod
N
⇒ = +
b rN b rsM a
= +
⇒ ≡
a
b
mod
M
Ex.1.11
一般解这种题的思路就是要想方设法的凑 1,注意到:
1536
4
≡
64
512
(
−≡
6
512
)
≡
36
256
≡
1
256
≡
,有:
66
=×
(
mod
35
1
+
)35
1
4824
9
≡
(
999
××
1608
)
(
−≡
6
1608
)
≡
36
804
≡
1
804
≡
1
(
mod
)35
即:
1536
4
−
9
4824
≡−≡
011
(
mod
)35
。
Ex.1.12
这题很简单:
2006
2
2
≡
2
4
2005
≡
1
2
2005
≡
1
(
)3mod
Ex.1.13
同样是凑 1,注意到:
5
≡
(
−≡
30000
5
65
1
31
=×
−
,有:
5
25
5
20000
10000
10000
10000
×
≡
×
)
(
10000
1
mod
10000
30
≡
≡
1
)31
(
−≡
6
10000
)
×
5
10000
123456
6
≡
≡
6
×
41152
82304
6
(
30
)
41152
(
−≡
≡
)
1
36
41152
41152
41152
6
×
(
mod
1
≡
)31
≡
41152
5
×
6
41152
即:
30000
5
−
6
123456
≡−≡
011
(
mod
)31
。
Ex.1.14
采用 Ex.0.4 中的矩阵形式,但是对每一步的中间结果都进行模 p 操作,这样使得
)2
(
)
所有的中间结果都小于 p 。每一步的乘法以及求模运算均是 (
p ,于是得
到总的时间复杂度为:
log
O
(
T n p O
=
)
,
log
n
(
log
p
)
)2
(
log
n
)
。
如果 p 为一常数,则有: ( )
Ex.1.15
T n O
=
(
欲使得
ax bx
≡
mod
c
⇒ ≡
a
b
mod
c
成立,只需要保证 1 mod
x
−
c
存在:
ax bx
≡
mod
c
⇒
axx
1
−
≡
bxx
1
−
mod
c
⇒ ≡
a b
mod
c
由书可知, 1 mod
x
−
c
存在的条件是 (
gcd
x c = ,即: x , c 互素。
,
1
)
另 外 可 以 看 出 来 , 这 个 条 件 其 实 是 充 分 必 要 的 , 下 面 来 换 个 方 式 证 明 , 设
ax bx
,则有:
mod
c
≡