第2章 递归与分治策略优秀课件

合集下载

第2章_递归与分治策略

第2章_递归与分治策略
– 将求出的小规模的问题的解合并为一个更大规模的问 题的解,自底向上逐步求出原来问题的解。
2019/9/17
算法设计与分析
25
原问题 的规模是n
子问题1 的规模是n/2
子问题2 的规模是n/2
子问题1的解
子问题2的解
原问题的解
2019/9/17
算法设计与分析
26
问题(N个输入)
合 子问题1 并 解
• •
m=2时,A(n,2)=2n。 m=3时,类似的可以推出
2 2...2
n
• m=4时,A(n,4)的增长速度非常快,以至于没
有合适的数学式子来表示这一函数。
2019/9/17
算法设计与分析
9
举例2-6:Hanoi塔问题
• 问题定义:设a, b,c是3个塔座。开始时,在塔座a上有一 叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。 各圆盘从小到大编号为1,2,…,n,现要求将塔座a上的这一叠 圆盘移到塔座b上,并仍按同样顺序叠置。
15
需要先完成:Hanoi(2,a,b,c);
三阶Ha该n工oi作塔又问可题分解成:① Hanoi(1,a,c,b);②
MOVE(a,2,c);③ Hanoi(1,b,a,c)。
完成Hanoi(1,b,a,c); 工作等价于MOVE(b,1,c)。
1
3
2
塔座a
塔座b Hanoi(2,a,塔b,c座) c
MOVE(a,2,c);③ Hanoi(1,b,a,c)。
完成MOVE(a,2,c)。
3
1
2
塔座a
塔座b
塔座c
• 分析:完成Hanoi(3,a,c,b)的工作可以分解成如下 三个步骤:Hanoi(2,a,b,c)、MOVE(a,3,b)和 Hanoi(2,c,a,b)。

第2章 递归与分治策略v3PPT课件

第2章 递归与分治策略v3PPT课件

A(1,2)=A(A(0,2),1)=A(1,1)=2,
故A(n,2)= 2n 。 m=3时,类似的可以推出A(n,3)=
22..2
,
其中2的层数为n。
m=4时,A(n,4)的增长速度非常快,以至于没有适当 的数学式子来表示这一函数。
2020/8/1
15
2.1 递归的概念
例4 排列问题
设计一个递归算法生成 n个元素{r1,r2,…,rn}的全排列。 设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。
包含一个基本部分,对于n的一个或多个值, F(n)必须是直 接定义的(即非递归)。
在递归部分中,右侧所出现的所有F的参数都必须有一个比n 小。
2020/8/1
6
2.1 递归的概念
ቤተ መጻሕፍቲ ባይዱ
直接或间接地调用自身的算法称为递归算法。
由分治法产生的子问题往往是原问题的较小模式,这 就为使用递归技术提供了方便。在这种情况下,反复 应用分治手段,可以使子问题与原问题类型一致而其 规模却不断缩小,最终使子问题缩小到很容易直接求 出其解。这自然导致递归过程的产生。
第二章 递归与分治策略
—— “分”而治之
2.1 递归的概念 2.2 分治法的基本思想 2.3 二分搜索技术(折半查找) 2.4 大整数的乘法 2.5 Strassen矩阵乘法 2.6 棋盘覆盖 2.7 合并排序 2.8 快速排序
2020/8/1
1
整体 概述
一 请在这里输入您的主要叙述内容

请在这里输入您的主要 叙述内容
被称为Fibonacci数列。它可以递归地定义为:
F(n) 1 F(n1)F(n2)n n 0 1,1
第n个Fibonacci数可递归地计算如下:

计算机专业课《算法》_第二章 递归与分治策略

计算机专业课《算法》_第二章 递归与分治策略

“Hanoi 塔”问题演示 a 初始 a 步骤1 a
c
b
c
“Hanoi 塔”问题程序
void hanoi(int n,a,b,c)
{ if n == 1 move( 1, a, b );
else { hanoi( n-1, a, c, b );
move(n, a, b ); hanoi( n-1, c,b, a) ;
• 递归优点:结构清晰,可读性强
• 递归缺点:递归算法的运行效率较低,无论是耗 费的计算时间还是占用的存储空间都比非递归算 法要多。
整数划分问题的递归关系q(n,m)
如设p(n)为正整数n的划分数,则难以找到递归关系 • q(n,m):正整数n的不同的划分中,最大加数不 大于m的划分个数个数 q(n,m)=
1 q(n,n) 1+q(n,n-1) q(n,m-1)+q(n-m,m) n=1, m=1 n<m n=m n>m>1
递归函数举例(5)
学习要点
理解递归的概念。 掌握设计有效算法的分治策略。
通过典型范例,学习分治策略设计技巧。
2.1 递归的概念
• 递归算法:一个直接或间接地调用自身的算法 • 递归方程:对于递归算法,一般可把时间代 价表示为一个递归方程 • 递归函数:使用函数自身给出定义的函数 • 解递归方程最常用的方法是进行递归扩展
递归函数举例(1)
• 阶乘函数 n !=
1 n(n-1)! n=1 n>1
• Fibonacci数列
1 n=0
F(n)=
1 F(n-1)+F(n-2)
n=1 n>1
初始条件与递归方程是递归函数的二个要素

[理学]算法设计与分析课件 第2章 递归与分治_OK

[理学]算法设计与分析课件 第2章 递归与分治_OK

• 当n>1时,perm(R) 由
(r1)perm(R1) (r2)perm(R2) ………
(rn)perm(Rn)
• 构成。(其中:Ri=R- { ri } )
12 四川师范大学 计算机科学学院 刘芳
2.1 递归的概念
• 例5 整数划分问题 • 将一个正整数n表示成形如下式的一系列正整数的和,称为n的一个划分。 • 形如:
2
A(n, 3) 222
A(A(n 1,m),m 1) n,m 1
n
2
A(3, 4) 222
65536
11
四川师范大学 计算机科学学院 刘芳
2.1 递归的概念
• 例4 数列的全排列问题
perm(R) • 求n个元素R={r1,r2,…,rn}的全排列

• 分析:
• 当n=1时,perm(R)=(r)
第2章 递归与分治策略
• 2.1 递归的概念 • 2.2 分治法的基本思想 • 2.3 分治法的应用 • 本章小结
1 Ó 2005 四川师范大学 计算机科学学院 刘芳
• 嵌套与递归
2.1 递归的概念
2 四川师范大学 计算机科学学院 刘芳
2.1 递归的概念
例1: 阶乘函数
阶乘函数可递归地定义为:
9
四川师范大学 计算机科学学院 刘芳
2.1 递归的概念
例3 Ackerman函数
当一个函数及它的一个变量是由函数自身定义时,称这个函 数是双递归函数。
Ackerman函数A(n,m)定义如下:
2
A(n,
m)
1 n
2
A( A(n 1, m), m 1)
n 1, m 0 n 0, m 0 n 2, m 0

第2章 递归与分治策略

第2章 递归与分治策略

20
实现过程

我们初始化数组p[1..n]的值为0,对于元素n,可 以依次把它放到数组的p[1],p[2],…,p[n]位臵, 在n放定一个位臵后p[k]后,剩下的n-1个元素可以 放在那些值为0的数组元素p[1..k-1]和p[k+1..n] 上。 依次递归下去,直到数组没有为0 的元素为止。 注意:在n放定一个位臵p[k],找到剩下n-1个元素 的所有排列后,在找n的下一个可放臵位臵时,即把 n放到位臵P[k+1]前,原来放n的位臵p[k]一定要臵 0。否则,将有某些元素找不到位臵。
A(n,0) = n + 2
A(n,m) = A(A(n-1,m),m-1)
n ≧2
n,m≧1
m=1时,A(n,1)=A(A(n-1,1),0)=A(n-1,1)+2,
A(1,1)=2 可以得出 A(n,1)=2*n m=2时,A(n,2)=A(A(n-1,2),1)=2A(n-1,2), A(1,2)=A(A(0,2),1)=A(1,1)=2 可以得出 A(n,2)= 2n 。 m=3时,类似的可以推出
A(1,0) = 2
A(0,m) = 1
A(n,0) = n + 2 A(n,m) = A(A(n-1,m),m-1)
m ≧0
n ≧2 n,m≧1
6
A(1,0) = 2 A(0,m) = 1 Ackerman函数的特征:A(n,m)的自变量 m的每一个值 m ≧0
都定义了一个单变量函数。
m=0时,A(n,0)=n+2
T(n)= O(1) aT(n/b)+f(n) n=1 n>1
通过求解递归方程得到递归算法的时间复杂性。
26

第2讲 递归与分治策略

第2讲 递归与分治策略
第2讲 递归与分治策略
递归的概念 分治法的基本思想
分治法范例学习
第2讲 递归与分治策略
2.1 递归的概念
• 直接或间接地调用自身的较小模式 的算法称为递归算法。
• 用函数自身的较小模式给出其定义 的函数称为递归函数。
第2讲 递归与分治策略
递归算法的特点
• 递归就是在过程或函数里调用自身。 • 在使用递归策略时,必须有一个明确的递归结 束条件,称为递归出口。 • 递归算法解题通常显得很简洁,但递归算法解 题的运行效率较低。所以一般不提倡用递归算 法设计程序。 • 在递归调用的过程当中系统为每一层的返回点、 局部量等开辟了栈来存储。递归次数过多容易 造成栈溢出等,所以一般不提倡用递归算法设 计程序。
第2讲 递归与分治策略
• 有趣的兔子问题

一般而言,兔子在出生两个月后,就有 繁殖能力,一对兔子每个月能生出一对 小兔子来。如果所有兔子都不死,那么 一年以后可以繁殖多少对兔子?
第2讲 递归与分治策略
• 分析如下: 第一个月小兔子没有繁殖能力,所以还是一对; 两个月后,生下一对小兔子,总数共有两对; 三个月以后,老兔子又生下一对,因为小兔子还没有繁殖 能力,总数共是三对; …… 依次类推可以列出下表:
例6
Hanoi塔问题
设a,b,c是3个塔座。开始时,在塔座a上有一叠共n个圆盘, 这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号 为1,2,…,n,现要求将塔座a上的这一叠圆盘移到塔座b上,并仍 按同样顺序叠臵。在移动圆盘时应遵守以下移动规则: 规则1:每次只能移动1个圆盘; 规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上; 规则3:在满足移动规则1和2的前提下,可将圆盘移至a,b,c中任 一塔座上。

第2章 递归与分治

第2章 递归与分治

/* 对右半段排序 */
20
• Example
3, 8, 2, 9, 6, 4, 1, 7, 5
3, 4, 1, 2, 5, 8, 9, 6, 7
1, 2, 4, 3, 5, 6, 7, 9, 8 1, 2, 3, 4, 5, 6, 7, 8, 9
1, 2, 3, 4, 5, 6, 7, 8, 9
19
基于上述思想,可实现快速排序算法如下:
template <class Type> void QuickSort (Type a[ ], int p, int r)
{ if (p<r)
/* 至少有两个元素 */
{int q=Partition(a,p,r); QuickSort(a, p, q-1); /*对左半段排序 */ QuickSort(a, q+1, r); } }
9
4
8
6
2
1
3
7
Divide
9 4 8 6 2 1 3 7
Merge-Sort
4 6 8 9
Merge-Sort
1 2 3 7
Combine
1 2 3 4 6 7 8 9
15
合并排序算法可递归地描述如下:
Template <class Type> void MergeSort (Type a[ ], int left, int right) { if (left<right)
求解子问题
29
求解子问题
32
合并子问题
32
5
(2)算法时间复杂性分析
Divide阶段所花时间: Conquer阶段所花时间: Combine阶段所花时间:

第2章 递归与分治策略PPT课件

第2章 递归与分治策略PPT课件
▪ 分治与递归像一对孪生兄弟,经常同时应用在 算法设计之中,并由此产生许多高效算法。
下面来看几个实例。
例1 阶乘函数 阶乘函数可递归地定义为:
边界条件
1 n0 n!n(n1)! n0
递推方程
边界条件与递归方程是递归函数的二个要素, 递归函数只有具备了这两个要素,才能在有限 次计算后得出结果。
T(n)T(n1)1
2.1 递归的概念
▪ 直接或间接地调用自身的算法称为递归算法。 用函数自身给出定义的函数称为递归函数。
▪ 由分治法产生的子问题往往是原问题的较小模 式,这就为使用递归技术提供了方便。在这种 情况下,反复应用分治手段,可以使子问题与 原问题类型一致而其规模却不断缩小,最终使 子问题缩小到很容易直接求出其解。这自然导 致递归过程的产生。
前面的几个例子中,问题本身都具有比较明显的递归关系, 因而容易用递归函数直接求解。
在本例中,如果设p(n)为正整数n的划分数,则难以找到 递于归m的关划系分,个因数此记考作虑q增(n加,m一)个。自可变以量建:立将q(最n,m大)加的数如n下1不递大归 关系。
(1) q(n,1)=1,n1;m=1 当即最n大1 1加 n 数n11不大于1时,任何正整数n只有一种划分形式, (2) q(n,m)=q(n,n),mn; 最大加数n1实际上不能大于n。因此,q(1,m)=1。
算法总体思想
▪ 将求出的小规模的问题的解合并为一个更大规模的问 题的解,自底向上逐步求出原来问题的解。
T(n)
=n
n/4
n/4
n/4
n/4
T(n/16)T(n/16)T(n/16)T(n/16) T(n/16)T(n/16)T(n/16)T(n/16) T(n/16)T(n/16)T(n/16)T(n/16) T(n/16)T(n/16)T(n/16)T(n/16)

第2章递归与分治策略.

第2章递归与分治策略.

2.2 分治法的基本思想

分治法的基本思想
分治法的基本思想是将一个规模为n的问题分
解为k个规模较小的子问题,这些子问题互相 独立且与原问题相同。 对这k个子问题分别求解。如果子问题的规模 仍然不够小,则再划分为k个子问题,如此递 归的进行下去,直到问题规模足够小,很容易 求出其解为止。 将求出的小规模的问题的解合并为一个更大规 模的问题的解,自底向上逐步求出原来问题的 解。
二分搜索实例:设在A[8]中顺序放了以下9个元素:
A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8]
-15 -6

0

7

9

23
54

82 101
③ ④

搜索x=9 9= =A[4], 一次比较,成功, 最好情况 搜索x=-15, -15<A[4], -15<A[1], -15= =A[0], 3次比较, 成功 搜索x=101 101>A[4], 101>A[6], 101>A[7], 101= =A[8], 4次比较, 成功 搜索x=8 8<A[4], 8>A[1], 8>A[2], 8>A[3], 4次比较, 不成功检索
1 5 1 F (n) 2 5
1 5 2
n 1

递归小结
优点:结构清晰,可读性强,而且容易用数学 归纳法来证明算法的正确性,因此它为设计算 法、调试程序带来很大方便。
缺点:递归算法的运行效率较低,无论是耗费 的计算时间还是占用的存储空间都比非递归算 法要多。
边界条件
1 n0 F ( n) 1 n 1 F (n 1) F (n 2) n 1

递归与分治策略讲义课件(ppt 65页)

递归与分治策略讲义课件(ppt 65页)
int prev,now,next,j; if (n<=1) return(1);
else {
prev=1; now=1; for(j=2;j<=n;j++) {
next=prev+now; prev=now; now=next; } return(next); } }
具有编译递归程序能力的程 序设计语言有:C、Pascal 、 ALGOL、 PL/A 、 ADA、 QBASIC等,不具有编译递归 程序能力的程序设计语言有: FORTRAN、 COBOL、BASIC、 低级语言。
Hanio(3,A,B,C) Hanio(2,A,C,B)
Move (A,C)
Hanio(2,B,A,C)
结束
Hanio(2,A,C,B)
Hanio(1,A,B,C) Move (A,B)
Hanio(1,C,A,B)
Hanio(1,A,B,C) Move (A,C)
Hanio(1,C,A,B) Move (C,B)
例3 Hanoi塔问题
设x,y,z是3个塔座。开始时,在塔座x上有一叠共n个圆盘,这 些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号 为1,2,…,n,现要求将塔座x上的这一叠圆盘移到塔座z上,并仍 按同样顺序叠置。在移动圆盘时应遵守以下移动规则:
规则1:每次只能移动1个圆盘;
规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上;
(1)运行开始时,首先为递归调用建立一个工作栈,其结 构包括值参、局部变量和返回地址;
(2)每次执行递归调用之前,把递归函数的值参和局部变 量的当前值以及调用后的返回地址压栈;
(3)每次递归调用结束后,将栈顶元素出栈,使相应的值 参和局部变量恢复为调用前的值,然后转向返回地址指定 的位置继续执行。

《计算机算法设计与分析》第二章 递归与分治策略PPT课件

《计算机算法设计与分析》第二章 递归与分治策略PPT课件

{
if (n <= 1) return 1;
return fibonacci(n-1)+fibonacci(n-2);
} 2020/7/31
10
例3 Ackerman函数 当一个函数及它的一个变量是由函数自身定义时,称这
个函数是双递归函数。 Ackerman函数A(n,m)定义如下:
A(1,0) 2
12
例3 Ackerman函数
A(n,m)的自变量m的每一个值都定义了一个单变量函 数:
m=0时,A(n,0)=n+2
m=1时,A(n,1)=A(A(n-1,1),0)=A(n-1,1)+2,和 A(1,1)=2故A(n,1)=2*n
m=2时,A(n,2)=A(A(n-1,2),1)=2A(n-1,2),和 A(1,2)=A(A(0,2),1)=A(1,1)=2,故A(n,2)= 2n 。
第2章 递归与分治策略
2020/7/31
1
第一部分
整体概述
THE FIRST PART OF THE OVERALL OVERVIEW, PLEASE SUMMARIZE THE CONTENT
2
学习要点:
理解递归的概念。 掌握设计有效算法的分治策略。 通过下面的范例学习分治策略设计技巧。
当n=1时,perm(R)=(r),其中r是集合R中唯一的元素; 当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),…, (rn)perm(Rn)构成。
T(nn/2
T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4

new_第2章_递归与分治策略

new_第2章_递归与分治策略

递归举例
• 在以下三种情况下,常常要用到递归的方法。 • 1. 定义是递归的:有许多数学公式、数列等的定义是递归的。例如, 求n!和Fibonacci数列等。这些问题的求解过程可以将其递归定义直 接转化为对应的递归算法。
递归举例
• 2. 数据结构是递归的:有些数据结构是递归的。例如, 单链表就是一 种递归数据结构,其结点类型定义如下,该定义中,结构体LNode的定 义中用到了它自身,即指针域next是一种指向自身类型的指针,所以它 是一种递归数据结构。
分治法的概念
• 举例:有一个老板有一袋金块。每个月将有两名雇员会因其优异的表 现分别被奖励一个金块。按规矩,排名第一的雇员将得到袋中最重的 金块,排名第二的雇员将得到袋中最轻的金块。根据这种方式,除非 有新的金块加入袋中,否则第一名雇员所得到的金块总是比第二名雇 员所得到的金块重。因为有新的金块周期性的加入袋中,所以每个月 都必须找出最轻和最重的金块。假设有一台比较重量的仪器,我们希 望用最少的比较次数找出最轻和最重的金块。 • 解:如果采用先比较其中两个金块,再拿其中重的和袋中剩下的依次 比较,则需要n-1次轻的金块,则共需比较2n-3次。本问题可转化为求最 大数、最小数问题。
分治法的概念
• 举例:有一个老板有一袋金块。每个月将有两名雇员会因其优异的表 现分别被奖励一个金块。按规矩,排名第一的雇员将得到袋中最重的 金块,排名第二的雇员将得到袋中最轻的金块。根据这种方式,除非 有新的金块加入袋中,否则第一名雇员所得到的金块总是比第二名雇 员所得到的金块重。因为有新的金块周期性的加入袋中,所以每个月 都必须找出最轻和最重的金块。假设有一台比较重量的仪器,我们希 望用最少的比较次数找出最轻和最重的金块。
递归与堆栈
• 程序的主要执行过程: • (5)CPU回到 cs:000EH处(即call指令后面的指令处)继续 执行。

第2章 递归与分治策略

第2章 递归与分治策略
A(1,2)=A(A(0,2),1)=A(1,1)=2,故A(n,2)= 2^n
• m=3时,类似的可以推出 2{22N 2
n
• m=4时,A(n,4)的增长速度非常快,以至于没有
适当的数学式子来表示这一函数。
南京邮电大学 通信与信息工程学院
课件制作:王金元
• 定义单变量的Ackerman函数A(n)为:A(n)=A(n,n)。 • 定义其拟逆函数α(n)为:α(n)=min{k|A(k)≥n},即α(n)是
南京邮电大学 通信与信息工程学院
课件制作:王金元
将求出的小规模的问题的解合并为一个更大规模 的问题的解,自底向上逐步求出原来问题的解。
T(n)
=
n
n/2
n/2
n/2
n/2
T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4)
(4) q(n,m)=q(n,m-1)+q(n-m,m),n>m>1;
正整数n的最大加数n1不大于m的划分由n1=m的划分和
n1≤m-1的划分组成。
(a)划分中包含m,即{m, {x1,x2,...xi}}, 其中{x1,x2,... xi} 的和为n-m, 此时为q(n-m,m); (b)划分中不含m,则划分中所有值都比m小,即n为q(n,m-1)。
分治法的设计思想是,将一个难以直接解决的大问题,分割 成一些规模较小的相同问题,以便各个击破,分而治之。
南京邮电大学 通信与信息工程学院
课件制作:王金元
2.2. 分治与递归的概念
• 分治法将原问题转化为较小规模的子问题,这为使用

第2章递归与分治策略PPT课件

第2章递归与分治策略PPT课件
3
算法总体思想
将要求解的较大规模的问题分割成k个更小规模的子问题。 对这k个子问题分别求解。如果子问题的规模仍然不够小,则
再划分为k个子问题,如此递归的进行下去,直到问题规模足 够小,很容易求出其解为止。
4
算法总体思想
将求出的小规模的问题的解合并为一个更大规模的问 题的解,自底向上逐步求出原来问题的解。
A(1,0)2
A(0,m)1
m0
A(n,0)n2
n2
A(n,m)A(A(n1,m),m1) n,m1
10
2.1 递归的概念
例3 Ackerman函数 A(n,m)的自变量m的每一个值都定义了一个单变
量函数: M=0时,A(n,0) =n+2 M=1时,A(n,1) =A(A(n-1,1),0)=A(n-1,1)+2,
和A(1,1)=2故A(n,1)=2*n M=2时,A(n,2) =A(A(n-1,2),1)=2A(n-1,2),和
A(1,2)=A(A(0,2),1)=A(1,1)=2,故A(n,2)= 2^n 。
22 2 2
M=3时,类似的可以推出 n
M=4时,A(n,4)的增长速度非常快,以至于没有适源自当的数学式子来表示这一函数。
11
2.1 递归的概念
例4 排列问题 设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。 设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。 集合X中元素的全排列记为perm(X)。 (ri)perm(X)表示在全排列perm(X)的每一个排列前加上前 缀得到的排列。R的全排列可归纳定义如下:
(1) q(n,1)=1,n1; 当即最n大1 加 1 数n n 11不大于1时,任何正整数n只有一种划分形式,
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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, 问 他要让大家都满意,有多少不同的寄法?
经行列变换可得
***
相关文档
最新文档