- 1、本文档共43页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第2讲分治策略讲述
分治策略
3.2 分治策略
3.2.1 分治法的基本步骤
3.2.2 分治法的适用条件
3.2.3 二分搜索技术
3.2.4循环赛日程表
3.2.5 棋盘覆盖问题
3.2.6 选择问题
3.2.7输油管道问题
3.2.8 半数集问题
3.2.9 整数因子分解
3.2.10取余运算
3.3 Big String
1
递归与分治策略
任何一个可以用计算机求解的问题所需的计算时间都与其规模n有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少。
分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
如果原问题可分割成k个子问题(1<k≤n),且这些子问题都可解,并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。
由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。
2
分治策略
3
分治策略是对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同。
递归地解这些子问题,然后将各子问题的解合并得到原问题的解。
3.2.1 分治法的基本步骤
分治法在每一层递归上都有三个步骤:
分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题;
合并:将各个子问题的解合并为原问题的解。
4
算法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) //合并子问题
}
3.2.1 分治法的基本步骤
根据分治法的分割原则,原问题应该分为多少个子问题才较适宜?各个子问题的规模应该怎样才为适当?这些问题很难予以肯定的回答。
在用分治法设计算法时,最好使子问题的规模大致相同。如分成大小相等的k个子问题,许多问题可以取k=2。
这种使子问题规模大致相等的做法是出自一种平衡(Balancing)子问题的思想,它几乎总是比子问题规模不等的做法要好。
5
3.2.2 分治法的适用条件
分治法所能解决的问题一般具有以下几个特征:
该问题的规模缩小到一定的程度就可以容易地解决;
该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;
利用该问题分解出的子问题的解可以合并为该问题的解;
该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
6
给定n个元素a[0:n-1],需要在这n个元素中找出一个特定元素x。
首先对n个元素进行排序,可以使用C++标准模板库函数sort()。
比较容易想到的是用顺序搜索方法,逐个比较a[0:n-1]中的元素,直至找到元素x或搜索遍整个数组后确定x不在其中。
因此在最坏的情况下,顺序搜索方法需要 O(n)次比较。
二分搜索技术充分利用了n个元素已排好序的条件,采用分治策略的思想,在最坏情况下用O(log n) 时间完成搜索任务。
3.2.3 二分搜索技术
7
0
1
2
3
4
5
6
7
8
9
10
7
14
17
21
27
31
38
42
46
53
75
二分搜索算法的基本思想是将n个元素分成个数大致相同的两半,取a[n/2]与x作比较。
如果x=a[n/2],则找到x,算法终止。
如果x<a[n/2],则我们只要在数组a的左半部分继续搜索x。
如果x>a[n/2],则我们只要在数组a的右半部分继续搜索x。
8
算法3.6 二分搜索算法
//数组a[]中有n个元素,已经按升序排序,待查找的元素x
templateclass 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 (xa[middle]) left=middle+1;
else right=middle-1;
} return -1; //未找到x
}
3.2.4循环赛日程表
问题描述:设有n=2k个运动员要进行网球循环赛。
现要设计一
文档评论(0)