第2章 递归与分治策略优秀课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第2章 递归与分治策 略
以Rk( c ) 记放k个车的不同放法,令R0( c ) = 1 上面的棋盘C的棋盘多项式等于:
R( c )=1+n2x+
(
n
2
)2x2
+……+
(
n
r
)2
+n!xn
但是,我们经常碰到的是不完整的棋盘,这类棋盘 称残缺棋盘。
R( )= 1+X
R(
R ( ) = R ( ) = 1+2X R(
1 2 3 45
a
b c
d
e
(1+3X+X2) (1+4X+3X2)
正交的相乘
R(C)= (1+3X+X2)*(1+4X+3X2) = 1+7X+16X2+13X3+3X4
对照得到: B(0)= 5!- 7*4!+16*3!-13*2!+3*1!+ 0
= 25
这是简单的棋盘多项式能解决的问题,如果 有不正交的情况,我们主要采用下面的方法 进行构造。
) = 1+3X+X2 ) = 1+2X+X2 = (1+X)2
R ( ) = 1+4X+2X2
R(
) = 1+6X+7X2+X3
下面我们看一些应用: example: 在a,b,c,d,e的全排列中,要求a不出现在 第1和第5位,b不出现在第2和第3位,c不出现在 第3和第4位,e不出现在第5位,问:满足这些要 求的全排列有多少?
设所有元素互不相同。在这种情况下,找 出的基准x至少比3(n-5)/10个元素大,因为在 每一组中有2个元素小于本组的中位数,而 n/5个中位数中又有(n-5)/10个小于基准x。同 理,基准x也至少比3(n-5)/10个元素小。而当 n≥75时,3(n-5)/10≥n/4所以按此基准划分所 得的2个子数组的长度都至少缩短1/4。
B(0) = 6!-8*5!+22*4!-25*3!+11*2!-1!=159
2.9 线性时间选择
给如定果线将性 这序n个集元中素n依个其元线素性和序一排个列整时数k,,排1在≤k第≤nk,个要求 找位出置这的元n个素元即素为中我第们k要小找的的元元素素. 。
在最坏情况下,算法randomizedSelect需要O(n2)计 算时te间mplate<class Type> 但可T{以yp证e R明an,do算m法izeradSnedloecmt(iTzyepdeSae[],lienct pt可,int以r,i在nt Ok)(n)平 均时间内if (找p=出=r)nr个etu输rn入a[p元];素中的第k小元素。
//找中位数的中位数,r-p-4即上面所说的n-5 Type x = Select(a, p, p+(r-p-4)/5, (r-p-4)/10); int i=Partition(a,p,r, x), j=i-p+1; if (k<=j) return Select(a,p,i,k); else return Select(a,i+1,r,k-j); }
a
** *
**
u1 u2 u3 a1 a2 a3
c1 c2 c3 c4 c5 c6
***
a
** *
**
C
*** * * **
Ca
*** **
Ca’
R(Ca) = (1+x)(1+3x+x2)2 R(Ca’) = (1+x)(1+2x)2
R(C) = (1+x)(1+3x+x2)2 +x (1+x)(1+2x)2 = 1+8x+22x2+25x3+11x4+x5
例如,若ε=9/10,算法递归调用所产生的子 数组的长度至少缩短1/10。所以,在最坏情 况下,算法所需的计算时间T(n)满足递归式 T(n)≤T(9n/10)+O(n) 。由此可得T(n)=O(n)。
我们可以按以下步骤来寻找一个好的划分基准:
l 将n个输入元素划分成n/5个组,每组5个元素, 只可能有一个组不是5个元素。用任意一种排序算 法,将每组中的元素排好序,并取出每组的中位 数,共n/5个。 l 递归调用select来找出这n/5个元素的中位数。 如果n/5是偶数,就找它的2个中位数中较大的一 个。以这个元素作为划分基准。
如果用一般方法:过程复杂 结果为25。
下面让我们来用棋盘多项式的方法来求解。
example: 在a,b,c,d,e的全排列中,要求a不出现在第1和 第5位,b不出现在第2和第3位,c不出现在第3和第4位, e不出现在第5位,问:满足这些要求的全排列有多少?
建立残缺棋盘在 5*5的棋盘中,在 被禁止的小方格中 用红色填充,不难 看出它由两个正交 的子图组成:
复杂度分析
ቤተ መጻሕፍቲ ባይዱ
T(n) C2nT(n/C 51 )T(3n/4)
n75 n75
T(n)=O(n)
上述算法将每一组的大小定为5,并选取75作为是 否作递归调用的分界点。这2点保证了T(n)的递归 式中2个自变量之和n/5+3n/4=19n/20=εn,0<ε<1。 这是使T(n)=O(n)的关键之处。当然,除了5和75之 外,还有其他选择。
Type Select(Type a[], int p, int r, int k) {
if (r-p<75) { 用某个简单排序算法对数组a[p:r]排序; return a[p+k-1]; };
for ( int i = 0; i<=(r-p-4)/5; i++ ) 将a[p+5*i]至a[p+5*i+4]的第3小元素 与a[p+i]交换位置;
int i=RandomizedPartition(a,p,r), j=i-p+1; if (k<=j) return RandomizedSelect(a,p,i,k); else return RandomizedSelect(a,i+1,r,k-j); }
如果能在线性时间内找到一个划分基准,使得 按这个基准所划分出的2个子数组的长度都至少 为原数组长度的ε倍(0<ε<1是某个正常数),那 么就可以在最坏情况下用O(n)时间完成选择任 务。
Exm.小孩给他的三个叔叔u1,u2,u3和三个婶婶 a1,a2,a3送6张不同的贺卡c1,c2,c3,c4,c5,c6,他 知道u2不喜欢c1, u1和a1不喜欢c2, u1和a2不 喜欢c4, u2和a1不喜欢c5, a3不喜欢c6, 问 他要让大家都满意,有多少不同的寄法?
经行列变换可得
***
以Rk( c ) 记放k个车的不同放法,令R0( c ) = 1 上面的棋盘C的棋盘多项式等于:
R( c )=1+n2x+
(
n
2
)2x2
+……+
(
n
r
)2
+n!xn
但是,我们经常碰到的是不完整的棋盘,这类棋盘 称残缺棋盘。
R( )= 1+X
R(
R ( ) = R ( ) = 1+2X R(
1 2 3 45
a
b c
d
e
(1+3X+X2) (1+4X+3X2)
正交的相乘
R(C)= (1+3X+X2)*(1+4X+3X2) = 1+7X+16X2+13X3+3X4
对照得到: B(0)= 5!- 7*4!+16*3!-13*2!+3*1!+ 0
= 25
这是简单的棋盘多项式能解决的问题,如果 有不正交的情况,我们主要采用下面的方法 进行构造。
) = 1+3X+X2 ) = 1+2X+X2 = (1+X)2
R ( ) = 1+4X+2X2
R(
) = 1+6X+7X2+X3
下面我们看一些应用: example: 在a,b,c,d,e的全排列中,要求a不出现在 第1和第5位,b不出现在第2和第3位,c不出现在 第3和第4位,e不出现在第5位,问:满足这些要 求的全排列有多少?
设所有元素互不相同。在这种情况下,找 出的基准x至少比3(n-5)/10个元素大,因为在 每一组中有2个元素小于本组的中位数,而 n/5个中位数中又有(n-5)/10个小于基准x。同 理,基准x也至少比3(n-5)/10个元素小。而当 n≥75时,3(n-5)/10≥n/4所以按此基准划分所 得的2个子数组的长度都至少缩短1/4。
B(0) = 6!-8*5!+22*4!-25*3!+11*2!-1!=159
2.9 线性时间选择
给如定果线将性 这序n个集元中素n依个其元线素性和序一排个列整时数k,,排1在≤k第≤nk,个要求 找位出置这的元n个素元即素为中我第们k要小找的的元元素素. 。
在最坏情况下,算法randomizedSelect需要O(n2)计 算时te间mplate<class Type> 但可T{以yp证e R明an,do算m法izeradSnedloecmt(iTzyepdeSae[],lienct pt可,int以r,i在nt Ok)(n)平 均时间内if (找p=出=r)nr个etu输rn入a[p元];素中的第k小元素。
//找中位数的中位数,r-p-4即上面所说的n-5 Type x = Select(a, p, p+(r-p-4)/5, (r-p-4)/10); int i=Partition(a,p,r, x), j=i-p+1; if (k<=j) return Select(a,p,i,k); else return Select(a,i+1,r,k-j); }
a
** *
**
u1 u2 u3 a1 a2 a3
c1 c2 c3 c4 c5 c6
***
a
** *
**
C
*** * * **
Ca
*** **
Ca’
R(Ca) = (1+x)(1+3x+x2)2 R(Ca’) = (1+x)(1+2x)2
R(C) = (1+x)(1+3x+x2)2 +x (1+x)(1+2x)2 = 1+8x+22x2+25x3+11x4+x5
例如,若ε=9/10,算法递归调用所产生的子 数组的长度至少缩短1/10。所以,在最坏情 况下,算法所需的计算时间T(n)满足递归式 T(n)≤T(9n/10)+O(n) 。由此可得T(n)=O(n)。
我们可以按以下步骤来寻找一个好的划分基准:
l 将n个输入元素划分成n/5个组,每组5个元素, 只可能有一个组不是5个元素。用任意一种排序算 法,将每组中的元素排好序,并取出每组的中位 数,共n/5个。 l 递归调用select来找出这n/5个元素的中位数。 如果n/5是偶数,就找它的2个中位数中较大的一 个。以这个元素作为划分基准。
如果用一般方法:过程复杂 结果为25。
下面让我们来用棋盘多项式的方法来求解。
example: 在a,b,c,d,e的全排列中,要求a不出现在第1和 第5位,b不出现在第2和第3位,c不出现在第3和第4位, e不出现在第5位,问:满足这些要求的全排列有多少?
建立残缺棋盘在 5*5的棋盘中,在 被禁止的小方格中 用红色填充,不难 看出它由两个正交 的子图组成:
复杂度分析
ቤተ መጻሕፍቲ ባይዱ
T(n) C2nT(n/C 51 )T(3n/4)
n75 n75
T(n)=O(n)
上述算法将每一组的大小定为5,并选取75作为是 否作递归调用的分界点。这2点保证了T(n)的递归 式中2个自变量之和n/5+3n/4=19n/20=εn,0<ε<1。 这是使T(n)=O(n)的关键之处。当然,除了5和75之 外,还有其他选择。
Type Select(Type a[], int p, int r, int k) {
if (r-p<75) { 用某个简单排序算法对数组a[p:r]排序; return a[p+k-1]; };
for ( int i = 0; i<=(r-p-4)/5; i++ ) 将a[p+5*i]至a[p+5*i+4]的第3小元素 与a[p+i]交换位置;
int i=RandomizedPartition(a,p,r), j=i-p+1; if (k<=j) return RandomizedSelect(a,p,i,k); else return RandomizedSelect(a,i+1,r,k-j); }
如果能在线性时间内找到一个划分基准,使得 按这个基准所划分出的2个子数组的长度都至少 为原数组长度的ε倍(0<ε<1是某个正常数),那 么就可以在最坏情况下用O(n)时间完成选择任 务。
Exm.小孩给他的三个叔叔u1,u2,u3和三个婶婶 a1,a2,a3送6张不同的贺卡c1,c2,c3,c4,c5,c6,他 知道u2不喜欢c1, u1和a1不喜欢c2, u1和a2不 喜欢c4, u2和a1不喜欢c5, a3不喜欢c6, 问 他要让大家都满意,有多少不同的寄法?
经行列变换可得
***