第2讲 分治策略

合集下载

第2章 递归与分治_作业答案讲解

第2章 递归与分治_作业答案讲解

具体执行过程:求最大值
0 1 2 3 4 5 6 7 8 9 10 11 12 13 24 -13 29 113 87 65 -9 36 14 76 44 83 67 5 0 1 2 3 4 5 6 24 -13 29 113 87 65 -9 0 1 2 3 24 -13 29 113 0 1 24 -13 2 3 29 113 4 5 6 87 65 -9 7 8 9 10 11 12 13 36 14 76 44 83 67 5 7 8 9 10 36 14 76 44 7 8 36 14 7 36 9 10 76 44 11 12 13 83 67 5 11 12 83 67 11 83 12 67 13 5
课后练习
• 练习2:分析如下时间函数的复杂度,并说明 原因。 1. 利用递归树说明以下时间函数的复杂度:
O(1) T ( n) 3T ( n ) O( n) 4 n1 n1
2. 利用主定理说明以下时间函数的复杂度:
T(n) = 16T(n/4) + n
T(n) = T(3n/7) + 1
课后练习
• 练习1:给定数组a[0:n-1], 1. 试设计一个分治法算法,找出a[0:n-1]中元素最 大值和最小值; 2. 写出该算法时间函数T(n)的递推关系式; 3. 分析该算法的时间复杂度和空间复杂度。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 24 -13 29 113 87 65 -9 36 14 76 44 83 67 5
• 递归公式:
– 设n个元素的集合可以划分为F(n,m)个不同的由 m个非空子集组成的集合。 F(n,m) = 1, when n=0, n=m, n=1, or m=1 F(n,m) = 0, when n<m 否则 F(n,m)=F(n-1,m-1)+m*F(n-1,m)

分治算法及其典型应用

分治算法及其典型应用

分治算法及其典型应用
分治算法是一种重要的算法设计策略,它将一个大问题分解成若干个规模较小的子问题,然后递归地解决这些子问题,最后将它们的解合并起来,得到原问题的解。

分治算法在计算机科学和算法设计中有着广泛的应用,可以解决许多实际问题,下面将介绍一些典型的应用。

1. 排序算法。

分治算法在排序算法中有着重要的应用。

其中最著名的就是归并排序和快速排序。

在归并排序中,算法将数组分成两个子数组,分别进行排序,然后合并这两个有序的子数组。

而在快速排序中,算法选择一个基准值,将数组分成两个子数组,分别小于和大于基准值,然后递归地对这两个子数组进行排序。

2. 搜索算法。

分治算法也可以用于搜索问题,例如二分搜索算法。

在这种算法中,将搜索区间分成两个子区间,然后递归地在其中一个子区间中进行搜索,直到找到目标元素或者子区间为空。

3. 求解最大子数组问题。

最大子数组问题是一个经典的动态规划问题,也可以用分治算法来解决。

算法将数组分成两个子数组,分别求解左右子数组的最大子数组,然后再考虑跨越中点的最大子数组,最后将这三种情况的最大值作为整个数组的最大子数组。

4. 矩阵乘法。

分治算法也可以用于矩阵乘法。

在矩阵乘法中,算法将两个矩阵分成四个子矩阵,然后递归地进行矩阵乘法,最后将四个子矩阵的结果合并成一个矩阵。

总的来说,分治算法是一种非常重要的算法设计策略,它在许多实际问题中有着广泛的应用。

通过将一个大问题分解成若干个规模较小的子问题,然后递归地解决这些子问题,最后将它们的解合并起来,我们可以高效地解决许多复杂的问题。

分治法-PPT精选

分治法-PPT精选
或第k+1级, 故:成功检索在i级终止所需要的元素比较次数是i
不成功检索在i级外部结点终止的元素比较次数是i-1
2019/11/26
BINSRCH计算复杂度的理论分析
1)不成功检索的最好、最坏和平均情况的计算时
间均为Θ(logn) ——外结点处在最末的两级上; 2)最好情况下的成功检索的计算时间为 Θ(1)
2019/11/26
以比较为基础的有序检索问题最坏情况的时间下界
定理2.3 设A(1:n)含有 n(n≥1)个不同的元素,排序为A(1)< A(2) < …< A(n)。又设用以比较为基础的算法去判断是 否 xA(:1n) ,则这样的任何算法在最坏情况下所需的最小 比较次数FIND(n)有:
2019/11/26
FIND k(lo ng )1()n
任何一种以比较为基础的算法,在最坏情况 下的计算时间都不低于Ο (logn)。因此, 不可能存在最坏情况比二分检索数量级还低 的算法。
最坏情况下的成功检索的计算时间为 Θ(logn)
2019/11/26
3)平均情况下的成功检索的计算时间分析
利用外部结点和内部结点到根距离和之间的关系进行推导: 记,
由根到所有内结点的距离之和称为内部路径长度,记为I; 由根到所有外部结点的距离之和称为外部路径长度,记为E。
则有,E=I+2n
解。
2019/11/26
DANDC的计算时间
若所分成的两个子问题的输入规模大致相等,则DANDC 总的计算时间可用递归关系式表示,如下:
g(n)
n足够小
T(n) =
2T(n/2) + f(n) 否则
注: T(n):表示输入规模为n的DANDC计算时间 g(n):表示对足够小的输入规模直接求解的计算时间 f(n):表示COMBINE对两个子区间的子结果进行合并

NOIP基础算法讲解2

NOIP基础算法讲解2
if(a[i]>a[j])then begin temp[p]:=a[j];inc(p);inc(j);end else begin temp[p]:=a[i];inc(p);inc(i);end
while(i<=mid)do begin temp[p]:=a[i];inc(p);inc(i);end while(j<=right)do begin temp[p]:=a[j];inc(p);inc(i);end for i:=left to right do a[i]:=temp[i]; end;
数据范围:n≤10^6。所有数之和不超过10^9。
例题8:快速幂
【问题】计算an mod k的值 ,其中n<=109。
方法1:朴素算法。每次乘以a,时间复杂度O(n)。 function power(a,n:longint):longint; var x:longint; begin x:=1; for i:=1 to n do x:=x*a; power:=x; end;
时间效率不尽如人意….. 问题出现在哪里呢??
方法2:分治策略
采用分治求解: ➢划分问题:把序列分成元素个数尽量相等的两半; ➢递归求解:统计i和j均在左边或者均在右边的逆序对个数; ➢合并问题:统计i在左边,但j在右边的逆序对个数。
记数列a[st]~a[ed]的逆序对数目为d(st,ed); mid=(st+ed)/2,则有:
三、分治的三步骤
①划分问题:将要解决的问题分解成若干个规模较 小的同类子问题;
②递归求解:当子问题划分得足够小时,求解出子 问题的解。
③合并问题:将子问题的解逐层合并成原问题的解。
四、分治的框架结构
procedure Divide() begin

分治法

分治法
分 治 法
顾铁成
1
引例:称硬币
如果给你一个装有16枚硬币的袋子,其中有一
枚是假的,并且其重与真硬币不同。你能不能 用最少的比较次数,找出这个假币?

为了帮助你完成这个任务,将提供一台可用来 比较两组硬币重量的仪器,利用这台仪器,可
以知道两组硬币的重量是否相同。
2
引例:称硬币
常规的解决方法是先将这些硬币分成两
15
当 k = 1 时,各种可能的残缺棋盘
16
三格板的四个不同方向
17
【输入】
第一行输入棋盘 的总行数,第二 行输入残缺棋盘 的格子坐标。
【样例输入】 4
4 1
【样例输出】 2 2 3 3 2 1 1 3 4 4 1 5
【输出】
覆盖的矩阵图。
0 4 5 5
18
问题分析
很明显,当K=0时,是不需要三格板的,而当
24
【样例输入】 5 3 23 8 91 56 4 【样例输出】 1
25
问题分析
对于一组混乱无序的数来说,要找到第k
小的元素,通常要经过两个步骤才能实 现:
第一步:将所有的数进行排序; 第二步:确定第k个位置上的数。
26
问题分析
传统的排序算法(插入排序、选择排序
、冒泡排序等)大家都已经很熟悉了, 但已学过的排序方法无论从速度上பைடு நூலகம்还 是从稳定性方面,都不是最佳的。


将7作为一个参照数;
将这个数组中比7大的数放在7的左边; 比7大的数放在7的右边;

这样,我们就可以得到第一次数组的调整:
[ 4 2 6 6 1 ] 7 [ 10 22 9 8 ]
29

信息工程系课程的介绍XXXX专业宣讲会

信息工程系课程的介绍XXXX专业宣讲会

文库贡献者物理与电子信息工程学院信息工程系课程介绍2013年11月目录1. 《算法设计与分析》课程介绍 (1)2. 《离散数学》课程介绍 (2)3. 《计算机组成原理》课程介绍 (3)4. 《网络应用终端开发》课程介绍 (4)5. 《数据结构》课程介绍 (5)6. 《面向对象程序设计(Java)》课程介绍 (6)7. 《嵌入式操作系统基础》课程介绍 (8)8. 《数据结构》课程介绍 (9)9. 《操作系统A》课程介绍 (11)10. 《多媒体技术A》课程介绍 (12)11. 《ARM原理与应用》课程介绍 (13)12. 《ERP系统实施及二次开发技术》课程介绍 (14)13. 《Internet开发基础(JSP)》课程介绍 (15)14. 《IP统一通信技术》课程介绍 (17)15. 《IT项目管理》课程介绍 (18)16. 《嵌入式系统软件开发》课程介绍 (19)17. 《面向对象程序设计A》课程介绍 (20)18. 《Web应用开发》课程介绍 (22)19. 《Xml与Web Service》课程介绍 (24)20. 《编译原理》课程介绍 (26)21. 《数据库原理与应用》课程介绍 (27)22. 《电子商务概论》课程介绍 (28)23. 《企业运作模拟》课程介绍 (29)24. 《信息系统分析与设计》课程介绍 (31)25. 《管理学原理》课程介绍 (32)26. 《会计学原理》课程介绍 (34)27. 《数字电路与逻辑设计》课程介绍 (35)28. 《程序设计基础》课程介绍 (36)29. 《计算机网络》课程介绍 (38)30. 《计算机网络安全》课程介绍 (39)31. 《计算机网络规划与设计》课程介绍 (40)32. 《路由与交换技术》课程介绍 (41)33. 《企业管理与ERP》课程介绍 (43)34. 《软件工程B》课程介绍 (44)35. 《软件质量与测试基础》课程介绍 (45)36. 《网络协议分析与设计》课程介绍 (46)37. 《物流与供应链管理》课程介绍 (47)38. 《网络性能测试与分析》课程介绍 (48)39. 《信息系统分析与设计》课程介绍 (49)40. 《现代通信技术》课程介绍 (50)41. 《计算机网络基础》课程介绍 (51)42. 《计算机组成与体系结构》课程介绍 (53)43. 《运筹学B》课程介绍 (54)44. 《大型数据库系统基础》课程介绍 (55)1.《算法设计与分析》课程介绍2)教学目的和要求算法设计与分析是计算机科学与技术专业的专业课程,在计算机科学与应用的理论研究中具有重要的地位。

分治算法设计(求第K个最小数)

分治算法设计(求第K个最小数)

福建工程学院计算机与信息科学系实验报告2010 – 2011 学年第一学期任课老师:实验题目1.设计程序利用分治策略求n个数的最大值和最小值。

2.利用分治策略,在n个不同元素中找出第k个最小元素。

实验时间实验开始日期:报告提交日期:实验目的、要求一、算法设计技术当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。

对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。

如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。

这就是分治策略的基本思想。

下面通过实例加以说明。

【例】在n个元素中找出最大元素和最小元素。

我们可以把这n个元素放在一个数组中,用直接比较法求出。

算法如下:void maxmin1(int A[],int n,int *max,int *min){ int i;*min=*max=A[0];for(i=2;i < n;i++){ if(A[i] > *max) *max= A[i];if(A[i] < *min) *min= A[i];}}上面这个算法需比较2(n-1)次。

能否找到更好的算法呢?我们用分治策略来讨论。

把n个元素分成两组:A1={A[1],...,A[int(n/2)]}和A2={A[int(N/2)+1],...,A[N]}分别求这两组的最大值和最小值,然后分别将这两组的最大值和最小值相比较,求出全部元素的最大值和最小值。

如果A1和A2中的元素多于两个,则再用上述方法各分为两个子集。

直至子集中元素至多两个元素为止。

例如有下面一组元素:-13,13,9,-5,7,23,0,15。

用分治策略比较的过程如下:图中每个方框中,左边是最小值,右边是最大值。

从图中看出,用这种方法一共比较了10次,比直接比较法的14次减少4次,即约减少了1/3。

2.分治法

2.分治法

计算机学院
甘靖
2014-5-21
- 计算机算法基础 -
二次取中间值
计算机学院
甘靖
2014-5-21
- 计算机算法基础 -
算法时间复杂度分析
最坏情况下
T(n)cn if n24
T(n)T(n/5)+T(3n/4)+cn T(n) 20cn
计算机学院
甘靖
2014-5-21
- 计算机算法基础 -
summary
Divide-and-Conquer
A problem’s instance is divided into several smaller instances of the same problem, ideally of about the same size. The smaller instances are solved. If necessary, the solutions obtained for the smaller instances are combined to get a solution to the original problem.
计算机学院
甘靖
2014-5-21
- 计算机算法基础 -
五、 选择问题
方案一: 先用排序算法排序,然后输出第k个元素 算法复杂度O(nlog2n) 要排序整个l-5-21
- 计算机算法基础 -
方案二: 不必排序整个list,只需排序包含kth最小元的子集
A[j] A[j]
平均情况下(和下面递归式有相同的复杂度)
T(n)=T(n/2)+(n+1) T(n)=(n)
计算机学院
甘靖
2014-5-21
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0 7
left
1 14
2 17
3 21
4 27
5 31
6 38
7 42
8 46
9 53
10 75
right
7
middle
二分搜索算法的基本思想是将n个元素分成个数大致相 同的两半,取a[n/2]与x作比较。
如果x=a[n/2],则找到x,算法终止。 如果x<a[n/2],则我们只要在数组a的左半部分继续搜索x。 如果x>a[n/2],则我们只要在数组a的右半部分继续搜索x。
12
3.2.5 棋盘覆盖问题
在一个 2k×2k个方格组成的棋盘中,若恰有一个方格与其他方格不 同,称该方格为特殊方格,且称该棋盘为特殊棋盘(Defective Chessboard)。
特殊方格在棋盘中出现的位置有 4k种情形,就有4k种不同的棋盘。
图中的特殊棋盘是当 k=2时16个特殊棋盘中一个。在棋盘覆盖问题 中,要求用图所示的4种不同形状的L型骨牌覆盖给定棋盘上除特殊 方格以外的所有方格,且任何两个L型骨牌不得重叠覆盖。在任何一 个个 2k×2k的棋盘覆盖中,用到的L型骨牌个数为 (4k-1)/3。
2
分治策略
分治策略是对于一个规模为n的问题,若该问题可以 容易地解决(比如说规模n较小)则直接解决,否则 将其分解为k个规模较小的子问题,这些子问题互相 独立且与原问题形式相同。 递归地解这些子问题,然后将各子问题的解合并得 到原问题的解。
3
3.2.1 分治法的基本步骤
分治法在每一层递归上都有三个步骤:
15
棋盘覆盖问题的分治算法
16
3.2.6 选择问题
对于给定的n个元素的数组a[0:n—1],要求从中找出第 k小的元素。 输入
输入有多组测试例。 对每一个测试例有2行,第一行是整数n和k(1≤k<n≤1000), 第二行是n个整数。
输出
第k小的元素。
输入样例 52 39416 73 4 59 7 23 61 55 46 输出样例 3 23
9
3.2.4循环赛日程表
1 2 1 3 4 4 3 5 6 6 5 7 8 8 7
1
2 3 4 5
2
1 4 3 6
3
4 1 2 7
4
3 2 1 8
5
6 7 8 1
6
7 8 5 4
7
8 5 6 3
8
5 6 7 2
第1天, 1与2比, 2与1比
1
天数 ①
2
3
4 2 1 4 3 3 4 1 2 4 3 2 1 5 6 7 8
do…while语句: 当条件为true时继续 循环的处理过程

输入样例 52 39416
left
输出样例 3
right
3 9 4 1 6
pivot i
j right
left
3 9 4 1 6
pivot i j
21
3.2.7输油管道问题
某石油公司计划建造一条由东向西的主输油管道。该管道 要穿过一个有n口油井的油田。从每口油井都要有一条输 油管道沿最短路经(或南或北)与主管道相连。 如果给定n口油井的位置,即它们的x坐标(东西向)和y 坐标(南北向),应如何确定主管道的最优位置,即使各 油井到主管道之间的输油管道长度总和最小的位置? 给定n口油井的位置,编程计算各油井到主管道之间的输 油管道最小长度总和。
1
递归与分治策略
任何一个可以用计算机求解的问题所需的计算时间都与其规 模n有关。问题的规模越小,越容易直接求解,解题所需的 计算时间也越少。 分治法的设计思想是,将一个难以直接解决的大问题,分割 成一些规模较小的相同问题,以便各个击破,分而治之。 如果原问题可分割成k个子问题(1<k≤n),且这些子问 题都可解,并可利用这些子问题的解求出原问题的解,那么 这种分治法就是可行的。 由分治法产生的子问题往往是原问题的较小模式,这就为使 用递归技术提供了方便。
输入样例 52 39416 输出样例 3 1 3 9 4 6
此算法在最坏情况时间复杂度为 O(n2) , 此时nleft总是为0,左子集为空,即第 k小元素总是位于right子集中。 平均时间复杂度为 O(n )。
20
算法3.9 采用分治策略 找出第K小元素的算法
i=1 j=3 31496 i=2 j=1 j=1 left=0 3
4
3.2.1 分治法的基本步骤
根据分治法的分割原则,原问题应该分为多少个子问题才 较适宜?各个子问题的规模应该怎样才为适当?这些问题 很难予以肯定的回答。 在用分治法设计算法时,最好使子问题的规模大致相同。 如分成大小相等的k个子问题,许多问题可以取k=2。 这种使子问题规模大致相等的做法是出自一种平衡 (Balancing)子问题的思想,它几乎总是比子问题规模 不等的做法要好。
记一趟快速排序后,分解出左子集中元素个数为 nleft,则选 择问题可能是以下几种情况之一: ① nleft =k﹣1,则分界数据就是选择问题的答案。 ② nleft >k﹣1,则选择问题的答案继续在左子集中找, 问题规模变小了。 ③ nleft <k﹣1,则选择问题的答案继续在右子集中找, 问题变为选择第k-nleft-1 小的数,问题的规模变小了。
算法3.6 二分搜索算法 //数组a[]中有n个元素,已经按升序排序,待查找的元素x template<class Type> int BinarySearch(Type a[],const Type& x,int n) { int left=0; //左边界 int right=n-1; //右边界 while(left<=right) { int middle=(left+right)/2; //中点 if (x==a[middle]) return middle; if (x>a[middle]) left=middle+1; else right=middle-1; } return -1; //未找到x }
22
3.2.7输油管道问题
输入
第1行是一个整数n,表示油井的数量(1≤n≤10 000)。 接下来n行是油井的位置,每行两个整数x和y (﹣10 000≤x,y≤10 000)。
8
3.2.4循环赛日程表
问题描述:设有n=2k个运动员要进行网球循环赛。 现要设计一个满足以下要求的比赛日程表:
1. 每个选手必须与其他n-1个选手各赛一次; 2. 每个选手一天只能参赛一次; 3. 循环赛在n-1天内结束。 请按此要求将比赛日程表设计成有n行和n-1列的一个表。 在表中的第i行,第j列处填入第i个选手在第j天所遇到的选手, 其中1≤i≤n,1≤j≤n-1。
1. 分解:将原问题分解为若干个规模较小,相互独立,与原问题 形式相同的子问题; 2. 解决:若子问题规模较小而容易被解决则直接解,否则递归地 解各个子问题; 3. 合并:将各个子问题的解合并为原问题的解。
算法3.5 分治策略的算法设计模式 Divide_and_Conquer(P) { if (|P|<=n0 ) return adhoc(P); divide P into smaller substances P1,P2,…,Pk; for (i=1; i<=k; k++) yi=Divide-and-Conquer(Pi) //递归解决Pi Return merge(y1,y2,…,yk) //合并子问题 }
4
3 6 5 8 7
1
2 7 8 5 6
2
1 8 7 6 5
7
8 1 2 3 4
8
7 2 1 4 3
5
6 3 4 1 2
6
5 4 3 2 1
2 3 4
6
7 8
5
8 7
8
5 6
7
6 5
2
3 4
1
2 3
4
1 2
3
4 1
1 2
2 1
教材中的表格有误
1个选手
4个选手
8个选手
每个选手必须与其他n-1个选手各赛一次; 每个选手一天只能参赛一次; 循环赛在n-1天内结束。
14
采用分治算法解决棋盘覆盖问题的数据结构
令size=2k ,表示棋盘的规格。 1. 棋盘:使用二维数组表示:
int board[1025][1025]; 为了方便递归调用,将数组board设为全局变量。board[0][0]是棋 盘的左上角方格。
2. 子棋盘:由棋盘左上角的坐标tr,tc和棋盘大小s表示。 3. 特殊方格:在二维数组中的坐标位置是(dr,dc)。 4. L型骨牌:用到的L型骨牌个数为(4k-1)/3 ,将所有L型骨牌从 1开始连续编号,用一个全局变量表示: static int tile=1;
5
3.2.2 分治法的适用条件
分治法所能解决的问题一般具有以下几个特征:
1. 该问题的规模缩小到一定的程度就可以容易地解决; 2. 该问题可以分解为若干个规模较小的相同问题,即该问题具有 最优子结构性质; 3. 利用该问题分解出的子问题的解可以合并为该问题的解; 4. 该问题所分解出的各个子问题是相互独立的,即子问题之间不 包含公共的子子问题。
13
3.2.5 棋盘覆盖问题
用分治策略,可以设计解棋盘覆盖问题的一个简捷算法。 分治的技巧在于如何划分棋盘,使划分后的子棋盘大小相 同,并且每个子棋盘均包含一个特殊方格,从而将原问题 分解为规模较小的棋盘覆盖问题。
当k>0时,将2k×2k的棋盘划分为4个2k-1×2k-1子棋盘。 原棋盘只有一个特殊方格,则其余3个子棋盘中没有特殊方格。 用一个L型骨牌覆盖这3个较小棋盘的会合处。从而将原问题转化 为4个较小规模的棋盘覆盖问题,以便采用递归方法求解。 递归地使用这种划分策略,直至将棋盘分割为1×1的子棋盘。
相关文档
最新文档