| | 网站首页 | USACO译题 | 编程语言 | 算法艺术 | 数据结构 | 竞赛试题 | oier天地 | 历史荣誉 | 相关软件 | 学校网站 | 留言本 | | |
![]() |
|
| 站内导航: 温中信息学竞赛 >> 算法艺术 >> 分治算法 >> 文章正文 |
|
|||||
| 分治法 | |||||
| 作者:网络 文章来源:网络 点击数: 更新时间:2005-7-30 | |||||
|
分治法 一、算法思想 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。问题规模越小,解题所需的计算时间往往也越少,从而也越容易计算。想解决一个较大的问题,有时是相当困难的。分治法的思想就是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 分治的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。找出各部分的解,然后把各部分的解组合成整个问题的解。
分治的具体过程: CODE: [Copy to clipboard]二、例题分析 1、[金块问题]老板有一袋金块(共n块,n是2的幂(n>=2)),将有两名最优秀的雇员每人得到其中的一块,排名第一的得到最重的那块,排名第二的雇员得到袋子中最轻的金块。假设有一台比较重量的仪器,我们希望用最少的比较次数找出最重的金块。 分析:问题可以简化为:在含n(n是2的幂(n>=2))个元素的集合中寻找极大元和极小元。 明显的方法是逐个的进行比较查找。 (一次冒泡排序) CODE: [Copy to clipboard]需要n-1次比较得到max,而再经过n-2次比较得到min,共进行2*n-3次比较可以找出极大元和极小元。 用分治法可以较少比较次数地解决上述问题: 如果集合中只有1个元素,则它既是最大值也是最小值; 如果有2个元素,则一次maxnum(i,j) 一次minnum(i,j)就可以得到最大值和最小值; 如果把集合分成两个子集合,递归的应用这个算法分别求出两个子集合的最大值和最小值,最后让子集合1的最大值跟子集合2的最大值比较得到整个集合的最大值;让子集合1的最小值跟子集合2的最小值比较得到整个集合的最小值。 可得解题思想: CODE: [Copy to clipboard]分析比较次数: 比较运算均在函数maxnum和minnum中进行, 当n=2时,比较次数T(n)=1 当n>2时,比较次数T(n)=2T(n/2)+2 ∵n是2的k次幂 ∴设n=2^k 2、快速排序 快速排序是基于分治策略的一个排序算法。按照分治法的思想分析快速排序:
在上面三个步骤中,第一步:分解是关键。一次快速排序确定划分元素的位置,具体参见排序算法----快速排序 3、归并排序 归并排序也是基于分治策略的另一个算法。归并的思路是把两个已经排好序的数组合并为一个。(源程序) 2-路归并排序示例: 初始值 E Y U K S L B 一趟归并排序 E Y K U L S B 两趟归并排序 E K U Y B L S 三趟归并排序 B E K L S U Y 习题:对数字49 38 40 97 76 13 27进行归并排序 procedure mergesort(var r,r1:listtype;s,t:integer); {r,r1:均为链表,存储排序数据;过程mergesort(r,r1,s,t)完成把链表r中的关键字进行归并排序、并存放到链表r1中,其中s是下界t是上界} {过程merge(r2,s,m,t,r1)把链表r2中排好序的子链r2[s..m]和子链r2[m+1..t]合并到r1中} if 问题不可分 then 求解 if s=t then r1[s]:=r[s] else else (1)分出问题的一个子问题1,并求解子问题1 mergesort(r,r2,s,(s+t)div 2); (2)分出问题的一个子问题2,求解子问题2 mergesort(r,r2,(s+t)div 2,t); (3)合并子问题1和子问题2 merge(r2,s,(s+t)div 2,t,r1); 4、[循环赛问题](1999年广东省青少年信息学奥林匹克竞赛 第三题:棒球联赛) 问题描述:广州市体委将举行一次由N支队伍(队伍编号为1..N)参加的少年棒球联赛。联赛总共不能多于N轮(同一时间内若干支队进行一次比赛为一轮),并且每两支队之间必须而且仅必须进行一次比赛。请编程为这次比赛设计一个赛程表。 循环赛问题可以用分治法解决。下面是先假定n=2^k CODE: [Copy to clipboard]三、练习题 [二分检索]假定在A[1..9]中顺序存放这九个数:-7,-2,0,5,16,43,57,102,291 要求检索291,16,101是否在数组中。 给定已排好序的n个元素A1,A2,A3,…,An, 找出元素x是否在A中,如果x在A中,指出它在A中的位置。 用到递归调用的源程序binSearch.pas 非递归源程序binSe2.pas |
|||||
| 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 管理登录 | |
|
温州中学信息学竞赛组 本站资料多从网络收集,若有版权问题,请联系! 站长:舒老师 (办)0577-86786615 |