第四讲分治策略PPT课件

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
将问题表示为:I=(n,a1,…,an,x) 选取一个下标k,可得到三个子问题:
I1=(k-1,a1,…,ak-1,x) I2=(1,ak,x) I3=(n-k,ak+1,…,an,x)
19.09.2020
a[k]
17
二元比较树
含9个元素的情况
4
1
6
0
2
5
7
3
8
19.09.2020
18
二元比较树
x:A[1]
不成功
x:A[2]
19.09.2020
不成功
x:A[n]
X>A[n]
A[n-1]<x<A[n]
不成功
不成功 15
线性算法复杂度
该方法没有很好利用已经排好序这个条件, 顺序搜索方法平均需要 O(n)次比较。
19.09.2020
16
2 二分搜索方法
基本思想
取一个中间元素做比较元素,如果x等于它,则 结束,如果小于,去左半部查找,否则去右半 部搜索
时,可知c(n) = 3n/ 2 - 2。
使用分而治之方法比逐个比较的方法少用 了2 5%的比较次数。
19.09.2020
7
4.1 分治法的基本思想
分而治之方法与软件设计的模块化方法非 常相似。为了解决一个大的问题,可以:
1) 把它分成两个或多个更小的问题; 2) 分别解决每个小问题; 3) 把各小问题的解答组合起来,即可得到
0
1
9
12ቤተ መጻሕፍቲ ባይዱ
2
3
15
27
4 mid = (left+right)/2
39
=(0+4)/2=2
left
9
12
mid
15
27
9
left mid
9
12
right
12
mid left
15
27
15
27
left mid right
19.09.2020
5
假设袋中有n 个金块。通过n-1次比较找到最重的金块。 找到最重的金块后,可以从余下的n-1个金块中用类似 的方法通过n-2次比较找出最轻的金块。这样,比较的 总次数为2n-3。
n≤2时,识别出最重和最轻的金块,做一次比较。
n>2时,
第一步,把这袋金块平分成两个小袋A和B。
最后结果
}19.09.2020
10
问题
应把原问题分为多少个子问题才较适宜? 每个子问题是否规模相同或怎样才为适当?
19.09.2020
11
分治法计算效率
原问题规模——n
分成k个子问题,每个规模——n/m
设分解阈值n0=1,Adhoc解规模为1的 问题耗费1个单位时间
设分解原问题及用Merge将k个子问题的 解合并需要f(n)个单位时间
T(n)表示分治法的解规模为|P|=n的问题 所需的计算时间
19.09.2020
12
计算时间分析
由上可得
O(1)
n=1
T(n)=
kT(n/m)+f(n) n>1
解上式得到
lom gn1
T(n)nlom gk kjf(n/mj) j0
19.09.2020
13
4.2 二分搜索技术
问题提出
给定已排好序的n个元素a[0:n-1],现要在这n个 元素中找出一特定元素x,找到则将其位置赋于变 量j中,否则j置-1。
x:A[(n-1)/2]
x:A[(n-3)/4]
x:A[(3n-1)/4]
x:A[0]
x:A[(n-1)/2-1] x:A[(n-1)/2+1]
x:A[n-1]
不成 功
不成 不 成


19.09.2020
不成不成


不成 功
不 成不 成


19
例2-6 在[9,12,15,27,39]中分别查找27,12,14
如果只允许进行元素间的比较而不允许 对它们进行其它的运算,则所设计的算法称为
以比较为基础的算法。
19.09.2020
14
1 线性搜索
任何以比较为基础的搜索算法的执行过程都可以用一棵二元 比较树来描述。每次可能的比较用一个内顶点表示,对应于 不成功的结果有一个外顶点与之对应。
线性搜索二元比较树如下:
原问题的解答。小问题通常与原问题相 似,可以递归地使用分而治之策略来解 决。
19.09.2020
8
原问题 子问题1 子问题2
相 同
子问题k 类

子问题1‘ 子问题2’ 子问题3‘
不可再 分,直 接求解
19.09.2020
9
分治法流程
用P表示问题的输入。
Divide-and-Conquer(P) {
第4讲 分治策略
19.09.2020
1
主要内容
分治法基本思想 二分搜索算法 合并排序算法 快速排序算法 线性时间选择
19.09.2020
2
4.1 分治法的基本思想
例:[找伪币问题]给你一个装有1 6个硬币的 袋子。1 6个硬币中有一个是伪造的,并 且那个伪造的硬币比真的硬币要轻一些。 你的任务是找出这个伪造的硬币。为了帮 助你完成这一任务,将提供一台可用来比 较两组硬币重量的仪器,利用这台仪器, 可以知道两组硬币的重量是否相同。
第二步,分别找出在A和B中最重和最轻的金块。HA 与LA,HB 和LB。
第三步,通过比较HA 和HB,可以找到所有金块中最 重的;通过比较LA 和LB,可以找到所有金块中最轻的。
19.09.2020
6
复杂度
设c(n)为比较次数。假设n是2的幂。
当n= 2时,c(n) = 1; 当n>2时,c(n) = 2c(n/ 2 ) + 2。当n是2的幂
19.09.2020
3
一种方式
两两对比,找到轻者,最差比较8次 另外一种
1)将16个硬币分成A、B两半; 2)将A放仪器的一边,B放另一边,如果 A袋轻,则表明伪币在A,解子问题A即 可,否则,解子问题B。
19.09.2020
4
例2-5 金块问题
有一个老板有一袋金块。每个月将有两名雇员
会因其优异的表现分别被奖励一个金块。按规 矩,排名第一的雇员将得到袋中最重的金块, 排名第二的雇员将得到袋中最轻的金块。根据 这种方式,除非有新的金块加入袋中,否则第 一名雇员所得到的金块总是比第二名雇员所得 到的金块重。如果有新的金块周期性的加入袋 中,则每个月都必须找出最轻和最重的金块。 假设有一台比较重量的仪器,我们希望用最少 的比较次数找出最轻和最重的金块。
判断输入规模p是 否足够的小
if (|P|<=n0) Adhoc(P);
解该规模问 题的函数
divide P into smaller subinstances
P1,P2,···,Pk;
分割函数
for(i=1;i<=k;i++)
分治解决
yi=Divide-and-Conquer (Pi);
return Merge(y1,···,yk); 合并得到
相关文档
最新文档