第二节 递推方程的其他解法 主要内容 换元法 迭代归纳法--递归树 差消法 尝试法 应用实例 一、换元法 思想:通过换元转化成常系数线性递推方程 例1 an2  2an21  1  a0  2 令 bn  an2 , 代入得 bn = 2 bn-1 + 1,b0 =

Report
第二节 递推方程的其他解法
主要内容
换元法
迭代归纳法--递归树
差消法
尝试法
应用实例
一、换元法
思想:通过换元转化成常系数线性递推方程
例1
an2  2an21  1

a0  2
令 bn  an2 , 代入得
bn = 2 bn-1 + 1,b0 = 4
解得
bn  5  2 n  1, a n  5  2 n  1
例2
归并排序
T(n) = 2 T( n/2 ) + n-1 ,
n = 2
k
T(2) = 1
k
H(k)= 2 H(k-1) + 2 - 1
H(1) = 1
k
*
令 H (k) = P1k2 + P2 , 解得 P1=P2=1,
*
k
H (k) = k2 + 1
k
k
通解 H(k) = C 2 + k2 + 1,
代入初值,得 C = -1,
k
k
H(k) = - 2 + k2 +1,
T(n) = n log n– n + 1
二.叠代归纳法 (非常系数线性,特别是减半递推)
例 3 计数 a1,a2,…,an 相乘的方法数
h(n) = (4n-6) h(n-1)
h(1) = 1
h( n)  (4n  6) h( n  1)
 (4n  6)( 4n  10) h( n  2)
 ...
 (4n  6)( 4n  10) ... 6  2  h(1)
 2 n1 [( 2n  3)( 2n  5) ... 3  1]
2
n 1
( 2n  2)!
( 2n  2)!

( 2n  2)( 2n  4) ... 4  2 ( n  1)!
用归纳法验证.
例4
错位排列问题
错位排列定义:
{1,2,…,n}的排列 a1a2…an,aii,i=1,2,…,n,
n 个元素的错位排列数记作 Dn
将错位排列按首元素 2,3,…,n 分类:有 n-1 类,
第一位为 2 的类:
第二位为 1:
方法数为 Dn-2
第二位不是 1:方法数为 Dn-1
递推方程:
Dn = (n-1)(Dn-1+Dn-2)
D1 = 0, D2 = 1
解:先化简,再迭代
Dn = (n-1)(Dn-1 + Dn-2)
Dn  nDn1  [ Dn1  ( n  1) Dn 2 ]  ...
 ( 1) n 2 [ D2  2 D1 ]  ( 1) n 2
Dn  nDn1  ( 1) n ,
D1  0
Dn  n( n  1) Dn 2  n( 1) n1  ( 1) n
 n( n  1)( n  2) Dn 3  n( n  1)( 1) n 2  n( 1) n1  ( 1) n
 ...
 n( n  1) ... 2 D1  n( n  1) ... 3( 1) 2
 n( n  1) ... 4( 1) 3  ...  n( 1) n1  ( 1) n
1 1
1
 n![1    ...  ( 1) n ]
1! 2!
n!
例5
T(n) = 2T(n/2) + n-1,
n=2
k
T(2) = 1
递归树有 k 层,总数为
k-1
nk– (1 + 2 + … + 2 )
k
= nk– (2 –1) = nlog n– n + 1
T(n)= 2 T(n/2) + n-1
= 2 [2 T(n/4) + n/2–1] + n-1
= 22 T(n/22) + n-2 + n-1
= …
k-1
= 2 T(n/2
k-1
k-2
) + n-2
+ … + n-2 + n-1
k-1
k-2
= 2 T(2) + n(k-1)–(1 + 2 + … + 2 )
k-1
= 2
k-1
+ n(k-1)– (2 –1)
= nk– n + 1
= nlog n– n + 1
三、差消法
例6
快速排序
算法
快速排序 Quicksort
输入:数组 A[p..r]
输出:排好序的数组 A
Quicksort(A,p,r)
1. if p<r
2.
then qPartition(A,p,r)
3.
A[p]A[q]
4.
Quicksort(A,p,q-1)
5.
Quicksort(A,q+1,r)
Partition(A,1,13)的实例:
27
99
i
0
8
13
64
86
16
7
10
88
25
j
90
27
25
0
8
13
64
i
86
16
7
10
j
88
99
90
27
25
0
8
13
10
86
i
16
7
j
64
88
99
90
27
25
0
8
13
10
7
16
j
86
i
64
88
99
90
16
25
0
8
13
10
7
27
86
64
88
99
90
时间复杂度分析
最坏情况
最好划分
W ( n)  W ( n  1)  n  1
W (1)  0
1
W ( n)  n( n  1)  ( n 2 )
2
T ( n)  2T ( n2 )  n  1
T (1)  0
T ( n)  ( n log n)
平均情况

2 n 1
 T ( n)   T ( i )  n  1, n  2

n i 1
T (1)  0


2 n 1
 T ( n)   T ( i )  n  1, n  2

n i 1
T (1)  0

n 1
nT ( n)  2  T ( i )  n 2  n
i 1
n 2
( n  1)T ( n  1)  2  T ( i )  ( n  1) 2  ( n  1)
i 1
nT ( n)  ( n  1)T ( n  1)  2T ( n  1)  2n
nT ( n)  ( n  1)T ( n  1)  2n
T ( n) T ( n  1)
2
2
2
2 T (1)



  ...  
n1
n
n1 n1 n
3
2
1
1
 1
 2
  ...    O(log n)
3
n  1 n
T ( n)  O( n log n)
1
1
1 n 1 1
  ...    dx
n1 n
3
2 x
 ln x
n 1
2
 ln(n  1)  ln 2  O(log n)
四、尝试法
例7
(1)
2 n 1
T ( n)   T ( i )  n  1
n i 1
T(n)=C, 左边=O(1),
2
2C
右边= C (n  1)  n  1  2C 
 n  1 =O(n)
n
n
(2)
T(n)=cn, 左边=cn,
2 n 1
右 边   ci  n  1
n i 1
2c (1  n  1)( n  1)

 n1
n
2
 c( n  1)  n  1  (c  1)n  c  1
(3)
T(n)=cn2, 左边=cn2
2 n 1 2
右 边   ci  n  1
n i 1
2 cn 3
2c 2
 [
 O( n 2 )]  n  1 
n  O( n)
n 3
3
(4)
T(n)=cnlogn , 左边=cnlogn
2c n1
右 边
i log i  n  1

n i 1
2c n 2
n2
 [ log n 
 O( n log n)]  n  1
n 2
4 ln 2
c
 cn log n  (1 
)n  O(log n)
2 ln 2
x
1 x2
x2
 x log xdx   ln 2 ln xdx  ln 2 [ 2 ln x  4 ]
2
2
n
n
1 n2
n2
1 4
4

( ln n 
)
( ln 2  )
ln 2 2
4
ln 2 2
4
n2
n2

log n 
 O ( n log n)
2
4 ln 2
n
2
五、应用实例
例 8 n 条封闭曲线,两两相交于两点,任意三条封闭曲
线不交于同一点.求这 n 条封闭曲线把平面分割成
几个部分?
解:第 n 条曲线与前 n-1 条曲线有 2(n-1)个交点,
这些点将第 n 条曲线截成 2(n-1)段,
每段都会增加 1 个区域.
an = an-1 + 2(n-1)
a1 = 2
a*n = P1n2 + P2 n , 解得 a*n = n2- n
an = C1n + n2 – n
2
2
a n= 2 + n – n = n - n + 2
(代入初值)
例 9 分治策略与递归算法
n 为输入规模,n/b 为子问题输入规模,
a 为子问题个数,d(n)为分解及综合的代价
T ( n)  aT ( n / b )  d ( n), n  b k
T (1)  1
T ( n)  a 2T ( n / b 2 )  ad ( n / b )  d ( n)  ...
 a k T ( n / b k )  a k 1 d ( n / b k 1 )  a k  2 ( n / b k  2 ) 
...  ad ( n / b )  d ( n)
a 
k
k 1
 a i d (n / b i )
i 0
a a
k
logb n
n
logb a
T ( n)  a k 
k 1
logb a
i
i
k
a
d
(
n
/
b
),
a

n

i 0
(1) d(n)=c
 k
ak  1
a  c
 O(a k )  O( nlogb a ) a  1
T ( n)  
a 1
a k  kc  O( kc )  O(log n)
a 1

二分搜索
W(n) = W(n/2) + 1
a = 1, b = 2, d(n) = c
W(n) = O(logn)
(1) d(n)=cn
k 1
i
cn
k 1
a i
T ( n)  a   a i  a  cn  ( )
b
i 1
i 1 b
k
k
k
 log a
(
a
/
b
)
1
b
 cn
 O ( n)
ab
n
a/b1

  n  cnk  O( n log n)
ab
k
k
 k
(a / b) k  1
a

b
 ak  c
 O( n logb a ) a  b
 a  cn
a/b1
a/b1

归并排序
W(n) = 2W(n/2) + n1
a = 2, b = 2, d(n) = O(n),
W(n)= O(nlogn)
k
位乘问题:X,Y 为 n 位二进制数,n=2 , 求 XY
一般方法 W(n)= O(n2)
分治法:令 X = A2
n
n/2
n/2
+ B, Y = C2
XY = AC 2 + (AD+BC)2
W(n)= 4 W(n/2) + cn
n/2
+ D, 则
+ BD
W(1)= 1
log4
2
a = 4,b = 2, W(n)= O(n )= O(n )
变换:AD + BC = (A-B)(D-C) + AC + BD
W(n) = 3 W(n/2) + cn
W(1)= 1
log3
1.59
a = 3,b = 2, W(n)= O(n )= O(n )

similar documents