![7a9c553450daa3d55a280c0749651896.png](https://i-blog.csdnimg.cn/blog_migrate/acd684650e8cf2b5205096414b269490.png)
NOI2019 夏令营课程报名中!
摘要
之前我们已经发布过(点击标题即可查看):
算法专题(1)-信息学基本解题流程!
算法专题(2)-模拟
算法专题(3)-枚举
算法专题(4)-递归与递推
五、 分治算法
概述:
将一个难以直接解决的大问题,分割成若干规模较小的相同问题,通过对子问题的求解来得到原问题的解。这种算法设计策略叫做分治法。
1.知识点梳理:
Ø 分治法的使用
分治法的使用基本是基于递归与回溯。先按照一定的分割方法,将原问题一步步分割为规模较小的子问题,递归调用求解子问题;然后在回溯时,利用子问题求解原问题的解。
Ø 用分治法解决的问题特点
分治法所能解决的问题一般具有以下几个特征:
1. 该问题的规模缩小到一定的程度就可以容易地解决。
2. 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
3. 利用该问题分解出的子问题的解可以合并为该问题的解。
4. 该问题所分解出的各个子问题是相互独立的,即子问题之间没有交集。
Ø 分治法相关的常用算法
分治法是一个非常实用的算法思想,在设计检索、分类算法或某些速算算法中很有效。用分治法思想的常用算法有二分枚举、二分检索、快速排序、归并排序等。
2. 重难点分析:
分治算法设计时,子问题之间必须独立。
分治算法设计时,应考虑其复杂度。有时会设计出复杂度跟直接求解一样的“伪分治法”。
分治法实现时,应注意递归调用时的边界条件。
3. 例题解析:
例题5-1:求逆序对个数
【问题描述】对于一个序列a1,a2,a3,…,an,如果存在i,使ai>aj,那么ai,aj就是一个逆序对。现在给你一个有N (N≤100000) 个元素的序列,请求出序列内逆序对的个数。
【分析】此题如果朴素枚举,复杂度为O(N2)。考虑分治的策略,可以将序列分成两部分,分别求出子序列的逆序对个数,再算出横跨两个序列的逆序对数。计算后者时,如果单纯枚举,又回到了原来的算法复杂度。那我们假设前后两个序列已经排好序,那是否就简单一些。
在计算横跨两个序列的逆序对数时,假设前后两个序列已排序完成(升序排列),即,,对于给定需要在序列b中找到比小的最大的值,记做,那么与对应的逆序对个数为j。由于a序列已按升序排好,对于,对应的即。因此,在从前往后枚举a序列的过程中,b序列也只会从前往后扫描一次。一次计算的复杂度为O(n1+n2)。
因此我们边统计边排序。由于子序列内逆序对个数的统计是在排序之前完成的,排序又不影响两序列之间的逆序对个数,所以排序不会影响最终结果。整个解法跟归并排序的方式差不多。复杂度变为O(N log N)。
例题5-2:循环赛日程表问题
【问题描述】设有2n(n≤6)个球队进行单循环比赛,计划在2n-1天内完成,每个队每天进行一场比赛。设计一个比赛的安排,使在2n-1天内每个队都与不同的对手比赛。例如n=2时的比赛安排为:
第一天 | 第二天 | 第三天 | |
1 | 2 | 3 | 4 |
2 | 1 | 4 | 3 |
3 | 4 | 1 | 2 |
4 | 3 | 2 | 1 |
【分析】
此题很难直接给出结果,我们先将问题进行分解。
设m=2n,并将规模减半。假如n=3(即m=8),8个球队的比赛,减半后变成4个球队的比赛(m=4)。4个球队的比赛的安排方式还不是很明显,再减半到两个球队的比赛(m=2)。
两个球队的比赛安排方式很简单,只要让两个球队直接进行一场比赛即可:1-2
分析两个球队的比赛的情况不难发现,表格主体是一个对称的方阵,我们把这个方阵分成4部分(即左上、右上、左下、右下),右上部分可由左上部分加1(即加m/2)得到,而左上与右下部分、右上与左下部分分别相等。因此我们也可以把这个方阵看作是由m=1的方阵所生成的。同理,可得m=4的方阵:
同理可由m=4方阵生成m=8的方阵:
这样就构成了整个比赛的安排表。在算法设计中,用数组a记录2n个球队的循环比赛表,整个循环比赛表从最初的1×1方阵按上述规则生成2×2的方阵,再生成4×4的方阵……直到生成出整个循环比赛表为止。
温馨提示
暑期对于学习竞赛的同学们来说是难得的提升自我的好机会。清北学堂OI金牌教研团队集结清华北大金牌名师在全国六大校区将同步开展NOIP2019夏令营!各种水平班级不容错过!
往期精选内容
(点击标题即可查看)
NOI2019 夏令营课程报名中!
2019年NOI省队选拔规定及NOI2019名额分配方案发布!
信息学竞赛入选!2019年度面向中小学生全国性竞赛活动名单公示
关于举办第34届全国青少年科技创新大赛的通知
最详细解析低分进名校三大途径:自主招生、综合评价、高校专项计划!
2018年自主招生高校对信息学奖项报考要求及优惠政策参考!报考时要注意哪些问题?
2019年保送生资格名单公示
NOIP2018复赛提高组各省中学 获一等奖人数排行榜及分析!
NOIP2018复赛提高组各省各中学获奖总数排行榜
NOIP2018各省各中学复赛普及组获奖总数分析!
CCF NOI2019冬令营报到通知及冬令营名额分配方案!
再见,OI-大牛HZW亲笔,分享OI生涯记录,不变的是坚持和热爱!
NOIP复赛知识点简述及复赛算法总结!
重磅!NOIP2018初赛普及组提高组真题及答案发布
NOIP2018提高组试题解析
根据信息学竞赛之路带你了解信息学竞赛流程
清华“姚班”2018级名单-看50名学霸到底多牛,同学们又如何能进姚班?
全国自主招生高校对各项学科竞赛奖项要求大汇总!签约路径
教育部出台高中新课标,信息学竞赛相关内容被编入必修课程!
北京大学自主招生初审通过1719人名单公布,看清华北大更青睐哪些省市中学?
IOI 2018国际信息学奥林匹克竞赛中国代表队选拔结果揭晓,看大牛们的竞赛之路!2018年五大学科竞赛国家队名单全部出炉,各省中学大比拼!
从搜狗CEO王小川(信息学金牌),看这二十几年中国奥赛金牌的去向
揭晓高薪专业排行榜,计算机专业薪资最高!哪些专业最具潜力?
2018中国大学排行榜出炉,北大清华连续11年蝉联冠亚军
一个清华保送生妈妈对竞赛的感受,自主招生家长都要看看!
计算机科学与技术专业全国大学排行榜!
为什么这些孩子初中就能被清华北大签约
2018五大学科竞赛国家集训队成员及所在学校名单
(1) 为什么有“编程思维”和数学能力强的人更优秀?(2)清北独家录制NOIP成功者说学习视频!!!
(3)我们为什么要对孩子进行编程教育?
(4)信息学竞赛答家长问题
1.信息学竞赛,你想了解的知识都在这里
2.信息学奥赛(NOIP)初赛学习方法推荐
3.信息学奥赛(NOIP)复赛学习方法推荐
4.大牛为你推荐十本最适合信息学竞赛的书籍
5.信息学奥赛有那么重要吗?
6.参加编程竞赛对实际工作的用处
7.清北学堂独家录制NOIP考试技巧讲座
8.在线编程挑战赛第一名:我是这么学算法的
9.信息学竞赛如何学习及准备攻略!
10.凭什么我得了信息学奥赛国家一等奖
11.榜样 | 北大降200分要这个诸暨天才少年
12.OI金牌教练胡芳:爱和成长的故事
13.信息学竞赛,一个让孩子不需要再去挤独木桥的方向
14.新学期必须了解的学科竞赛与自主招生时间!
15.北大录取生陈代超:在信息学中找到“思维图谱”
16.国务院发文支持编程教育进入中小学,中国人工智能厚积薄发
(1)NOIP报名,申诉,查成绩方式介绍
(2)NOIP复赛考前需要注意的那些事儿!!!
(3)NOIP测评环境,数据提交你都了解吗?请注意这些问题!
(4)关于NOI系列赛编程语言使用限制的规定
关注「信息学竞赛」
看更多信息学趣闻与知识
↓↓↓