第5章5 分治 算法设计基本方法.ppt

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分析:很显然此问题分解出的子问题相互独立,即在a[i]的前面或 后面查找x是独立的子问题,因此满足分治法的第四个适用条件。
Example: Find 9
3 5 7 8 9 12 15
2019/10/25
南京信息工程大学计算机与软件学院
24
5.5.3 例1 二分搜索技术(Binary search)
下周二下午交作业
1)简述回溯法的基本思想和主要步 骤。 2)比较回溯法与穷举法的异同。 3)简述分支限界法的基本思想和主 要步骤。
明日3、4节BN604上机
2019/10/25
南京信息工程大学计算机与软件学院
1
第5-5 分治算法
闫雷鸣
2019/10/25
南京信息工程大学计算机与软件学院
2
复习 递归的概念
• 直接或间接地调用自身的算法称为 递归算法。
• 用函数自身给出定义的函数称为递 归函数。
2019/10/25
南京信息工程大学计算机与软件学院
3
例 阶乘函数
阶乘函数可递归地定义为: 边界条件
n!
1 n(n 1)!
n0 n0
递归方程
边界条件与递归方程是递归函数的二个要素,递归函 数只有具备了这两个要素,才能在有限次计算后得出结 果。
金块,设为HA、LA、HB、LB 3)比较HA与HB,得到最重的,比较LA与
LB,得到最轻的
2019/10/25
南京信息工程大学计算机与软件学院
18
• 比较次数=[3n/2]-2 [ ]表示向上取整.
• 该算法在比较次数上是优化的 • 比较次数比逐个比较法(2n-3)
少25%
2019/10/25
给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一 特定元素x。 分析:
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
2019/10/25
南京信息工程大学计算机与软件学院
11
分治与递归的关系
• 由分治法产生的子问题往往是原问题的较小模 式,这就为使用递归技术提供了方便。
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
2019/10/25
南京信息工程大学计算机与软件学院
9
算法总体思想
题到。问题规模足够小,很容易求出其解为止。
T(n)
=n
T(n/2)
2019/10/25
T(n/2)
T(n/2)
南京信息工程大学计算机与软件学院
T(n/2)
8
算法总体思想
对将这求出k个的子小问规题模分的别问求题解的。解如合果并子为问一题个的更规大模规仍模然的不问够 小题,的则解再,划自分底为向上k个逐子步问求题出,原如来此问递题归的的解进。行下去,直 到问题规模足够小,很容易求出其解为止。
} 人们从大量实践中发现,在用分治法设计算法时,
最好使子问题的规模大致相同。即将一个问题分成
大小相等的k个子问题的处理方法是行之有效的。
这种使子问题规模大致相等的做法是出自一种平衡
(balancing)子问题的思想,它几乎总是比子问题
规模不等的做法要好。
2019/10/25
南京信息工程大学计算机与软件学院
21
分治法的复杂性分析
一个分治法将规模为n的问题分成k个规模为n/m的子问题去解。 设分解阀值n0=1,且adhoc解规模为1的问题耗费1个单位时间。 再设将原问题分解为k个子问题以及用merge将k个子问题的解合 并为原问题的解需用f(n)个单位时间。用T(n)表示该分治法解 规模为|P|=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
而可如独增以果立加满具的,足备因的了则此,前分大此两治部特条法分征特要问反征做题映,许满了而多足递不这归具必个思备要特想第的征的三工。应条作用特,征重,复则地
ቤተ መጻሕፍቲ ባይዱ
可解以公考共虑的子贪问心题算,法此或时动虽态然规也划可。用分治法,但一般
用动态规划较好。
2019/10/25
南京信息工程大学计算机与软件学院
13
Example: Find 9
3 5 7 8 9 12 15
2019/10/25
南京信息工程大学计算机与软件学院
23
5.5.3 例1 二分搜索技术(Binary search)
给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一 特定元素x。 分析:
该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题; 分解出的子问题的解可以合并为原问题的解; 分解出的各个子问题是相互独立的。
该问题的规模缩小到一定的程度就可以容易地解决;
该问题可以分解为若干个规模较小的相同问题,即该 问题具有最优子结构性质
利用该问题分解出的子问题的解可以合并为该问题的 解;
该问题所分解出的各个子问题是相互独立的,即子问 题之间不包含公共的子问题。
因这能为条否问特利题征用的是分涉计应治及算用法到复分完杂治全性法取一的决般前于效是提问率随,题着它是如问也否果题是具各规大有子模多这问的数条题增问特是加题征不,
例1 [找出伪币]
给你一个装有16个硬币的袋子。16个硬币中有一 个是伪造的,并且伪币比真币要轻一些。
你的任务是找出这个伪造的硬币。 为了帮助你完成这一任务,将提供一台可用来比 较两组硬币重量的仪器,利用这台仪器,可以知道 两组硬币的重量是否相同。 怎样做使得比较次数较少?
2019/10/25
南京信息工程大学计算机与软件学院
O(1)
n 1
T (n) kT(n / m) f (n) n 1
通过迭代法求得方程的解:T (n)

nlogm k
logm n1
k
j
f
(n / m j )
j0
注意:递归方程及其解只给出n等于m的方幂时T(n)的值,但
是如果认为T(n)足够平滑,那么由n等于m的方幂时T(n)的值
divide P into smaller subinstances P1,P2,...,Pk;//分解问题
for (i=1,i<=k,i++)
yi=divide-and-conquer(Pi); //递归地解各子问题
return merge(y1,...,yk); //将各子问题的解合并为原问题的解
可以估计T(n)的增长速度。通常假定T(n)是单调上升的,从而
当201m9/10i≤/25n<mi+1时,T(mi)南≤京T信(息n工)程<大T学(计m算机i+与1)软。件学院
22
5.5.3 例1 二分搜索技术(Binary search)
给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一 特定元素x。 分析:
子问题 . .. . .. 子问题
求解子 问题
.
.....
求解子 问题
Conquer
子问题解 . . . . . . 子问题解
合并子 问题解
原问题 的解
Combine
2019/10/25
南京信息工程大学计算机与软件学院
20
分治法的基本步骤
divide-and-conquer(P)
{
if ( | P | <= n0) adhoc(P); //解决小规模的问题
14
例1 [找出伪币]
解法1:两两比较,最多通过8次比较来判断伪币的存在并 找出这一伪币。
解法2:利用分治法 ,16硬币的问题就被分为两个8硬币(A 组和B组)的问题。通过比较这两组硬币的重量,可以判断伪
币是否存在。如果没有伪币,则算法终止。否则,继续划分轻 的那组硬币来寻找伪币。直到最后的那个组里只有两个硬币, 因此不必再细分。比较组中两个硬币的重量,可以立即知道哪 一个硬币轻一些。较轻的硬币就是所要找的伪币。需要四次即 能找到伪币
• 反复应用分治手段,可以使子问题与原问题类 型一致而其规模却不断缩小,最终使子问题缩 小到很容易直接求出其解。这自然导致递归过 程的产生。
• 分治与递归像一对孪生兄弟,经常同时应用在 算法设计之中,并由此产生许多高效算法。
2019/10/25
南京信息工程大学计算机与软件学院
12
分治法的适用条件
分治法所能解决的问题一般具有以下几个特征:
2019/10/25
南京信息工程大学计算机与软件学院
10
算法总体思想
将求出的小规模的问题的解合并为一个更大规模的问 题的解,自底向上逐步求出原来问题的解。
分分治割T法成(n的一) 设 些计 规思 模想 较是小=,的将相一同n个问难题以,直以接便解 各决 个的 击大 破问 ,题,
分而治之。
n/2
将求出的小规模的问题的解合并为一个更大 规模的问题的解,自底向上逐步求出原来问题 的解。
2019/10/25
南京信息工程大学计算机与软件学院
7
算法总体思想
对这k个子问题分别求解。如果子问题的规模仍然不够 将小要,求则解再的划较分大为规k个模子的问问题题,分如割此成递k归个的更进小行规下模去的,子直问
该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题; 分解出的子问题的解可以合并为原问题的解; 分解出的各个子问题是相互独立的。
分析:很显然此问题分解出的子问题相互独立,即在a[i]的前面或 后面查找x是独立的子问题,因此满足分治法的第四个适用条件。
2019/10/25
南京信息工程大学计算机与软件学院
15
例2 金块问题
有一个老板有一袋金块。每个月将有两名雇员会因其优 异的表现分别被奖励一个金块。按规矩,排名第一的雇员将 得到袋中最重的金块,排名第二的雇员将得到袋中最轻的金 块。根据这种方式,除非有新的金块加入袋中,否则第一名 雇员所得到的金块总是比第二名雇员所得到的金块重。
5
递归小结
解决方法:在递归算法中消除递归调用,使其 转化为非递归算法。
1、采用一个用户定义的栈来模拟系统的递归调 用工作栈。该方法通用性强,但本质上还是递 归,只不过人工做了本来由编译器做的事情, 优化效果不明显。
2、用递推来实现递归函数。
3、通过变换能将一些递归转化为尾递归,从而 迭代求出结果。
2019/10/25
南京信息工程大学计算机与软件学院
4
递归小结
优点:结构清晰,可读性强,而且容易用 数学归纳法来证明算法的正确性,因此它 为设计算法、调试程序带来很大方便。
缺点:递归算法的运行效率较低,无论是 耗费的计算时间还是占用的存储空间都比 非递归算法要多。
2019/10/25
南京信息工程大学计算机与软件学院
再用类似的方法在剩下的n-1个金块通过n-2次比 较找出最轻的金块,则共需比较2n-3次
本问题可转化为求最大数、最小数问题。
2019/10/25
南京信息工程大学计算机与软件学院
17
解2 分治法:参看教材P112
n≤2,一次比较,得到最重与最轻 n>2: 1)金块平均分为A、B两袋; 2)递归,分别找出A、B中的最重与最轻的
因为有新的金块周期性的加入袋中,所以每个月都必须 找出最轻和最重的金块。假设有一台比较重量的仪器,我们 希望用最少的比较次数找出最轻和最重的金块。
2019/10/25
南京信息工程大学计算机与软件学院
16
解1 逐个比较法:如果采用先比较其中两个金块,
再拿其中重的和袋中剩下的依次比较,则需要n-1次
比较;
南京信息工程大学计算机与软件学院
19
5.5.2分治法的基本步骤
设计过程分为三个阶段: Divide= 整 个 问 题 划 分
为多个子问题 Conquer=求解每个子问
题(递归调用正在设计的算 法)
Combine=合并子问题的 解,形成原始问题的解
子问题
求解子 问题
子问题解
问题 问题分解
Divide
后两种方法在时空复杂度上均有较大改善, 但其适用范围有限。
2019/10/25
南京信息工程大学计算机与软件学院
6
5.5.1 divide-and-conquer分治法总体思想
对这k个子问题分别求解。如果子问题的规 模仍然不够小,则再划分为k个子问题,如此递 归的进行下去,直到问题规模足够小,很容易 求出其解为止。
相关文档
最新文档