第5章_减治法(完)汇总
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
舍弃15之后元素,{11,13,15}
舍弃10之前元素, {10,15,20}
{11,13,15}
{10,15,20}
舍弃13之前元素,{13,15} 舍弃15之后元素,{10,15}
{13,15} 舍弃13之后元素,{13}
{10,15} 舍弃10之前元素,{15}
{13}
{15}
第5章 减治法
2020/10/2
清华大学出版社
5.1 减治法的设计思想
算法设计与分析
1. 循环直到序列A和序列B均只有一个元素 1.1 a = 序列A的中位数; 1.2 b = 序列B的中位数; 1.3 比较a和b,执行下面三种情况之一: 1.3.1 若a=b,则返回a,算法结束; 1.3.2 若a<b,则在序列A中舍弃a之前的元素, 在序列B中舍弃b之后的元素,转步骤1; 1.3.3 若a>b,则在序列A中舍弃a之后的元素, 在序列B中舍弃b之前的元素,转步骤1;
2. 序列A和序列B均只有一个元素,返回较小者;
Page 10
第5章 减治法
2020/10/2
清华大学出版社
算法设计与分析
int SearchMid(int A[ ], int B[ ], int n)
{
int s1 = 0, e1 = n - 1, s2 = 0, e2 = n-1;
//初始化两个序列的上下界
清华大学出版社
算法设计与分析
第5章 减治法
清华大学出版社
第5章 减治法
5.1 减治法的设计思想 5.2 查找问题中的减治法 5.3 排序问题中的减治法 5.4 组合问题中的减治法
算法设计与分析
Page 2
第5章 减治法
2020/10/2
清华大学出版社
5.1 减治法的设计思想
算法设计与分析
规模为n的原问题的解与较小规模(通常是n/2) 的子问题的解之间具有关系: (1)原问题的解只存在于其中一个较小规模的子问 题中; (2)原问题的解与其中一个较小规模的解之间存在 某种对应关系。
由于原问题的解与较小规模的子问题的解之间 存在这种关系,所以,只需求解其中一个较小规模 的子问题就可以得到原问题的解。
Page 3
第5章 减治法
2020/10/2
清华大学出版社
5.1 减治法的设计思想
算法设计与分析
原问题 的规模是n
子问题 的规模是n/2
Page 4
子问题的解 原问题的解
第5章 减治法
Page 5
第5章 减治法
O (nlog2n)
2020/10/2
清华大学出版社
5.1 减治法的设计思想
算法设计与分析
减治法只对一个子问题求解,并且不需要进行 解的合并。应用减治法(例如减半法)得到的算法 通常具有如下递推式:
0
n 1
T (n) T (n / 2) 1 n 1
所以,通常来说,应用减治法处理问题的效率 是很高的,一般是O(log2n)数量级。
if (A[mid1] < B[mid2])
//第②种情况
{
if ((s1 + e1) % 2 == 0)
s1 = mid1;
else
s1 = mid1 + 1;
e2 = mid2;
}
清华大学出版社 else {
if ((s2 + e2) % 2 == 0) s2 = mid2;
else s2 = mid2 + 1;
对比分治法:
T
(n)
g(n) 2T (n / 2)
f
(n)
n足够小
Page 6
第5章 减治法
2020/10/2
清华大学出版社
5.1 减治法的设计思想
算法设计与分析
一个简单的例子—两个序列的中位数
问题描述:一个长度为n(n≥1)的升序序列S,处在 第n/2个位置的数称为序列S的中位数 。两个序列的中
2020/10/2
清华大学出版社
5.1 减治法的设计思想
算法设计与分析
例:计算an的值,应用减治技术得到如下计算方法:
a
an
(an 2 )2
(a( n-1) 2 )2 a
n 1 n 1且是偶数 n 1且是奇数
O (log2n)
应用分治法得到an的计算方法是:
an
a
n
a 2 an
2
n 1 n 1
位数是他们所有元素的升序序列的中位数。现有两个 等长升序序列A和B,试设计一个在时间和空间两方面 都尽可能高效的算法,找出两个序列的中位数。
A={11, 13, 15, 17, 19}, B={2, 4, 10, 15, 20},则中位数为13
Page 7
第5章 减治法
2020/10/2
清华大学出版社
e1 = mid1;
} } if (A[s1] < B[s2]) return A[s1]; else return B[s2]; }
Page 8
第5章 减治法
2020/10/2
清华大学出版社
5.1 减治法的设计思想
算法设计与分析
对于两个给定的序列A={11, 13, 15, 17, 19}, B={2, 4, 10, 15, 20},求序列A和B的中位数的过程。
步骤
操作说明
序列A
序列B
1 初始序列 2 分别求中位数
3 15>10,结果在[10, 15]之间
5.1 减治法的设计思想
算法设计与分析
想法:分别求出两个序列的中位数,记为a和b;比较a 和b,有下列三种情况: ① a = b:则a即为两个序列的中位数; ② a < b:则中位数只能出现在a和b之间,在序列A中 舍弃a之前的元素得到序列A1,在序列B中舍弃b之后的 元素得到序列B1; ③ a > b:则中位数只能出现在b和a之间,在序列A中舍 弃a之后的元素得到序列A1,在序列B中舍弃b之前的元 素得到序列B1; 在A1和B1中分别求出中位数,重复上述过程,直到两 个序列中只有一个元素,则较小者即为所求。
int mid1, mid2;
while (s1 < e1 && s2 < e2)
//循环直到区间只有一个元素
{
mid1= (s1 + e1)/2;
//序列A的中位数的下标
wenku.baidu.com
mid2 = (s2 + e2)/2;
//序列B的中位数的下标
if (A[mid1] == B[mid2]) return A[mid1]; //第①种情况
4 分别求中位数 5 13<15,结果在[11, 15]之间 6 分别求中位数 7 10<13,结果在[10, 13]之间 8 长度为1,较小者为所求
Page 9
{11, 13, 15, 17, 19}
{2, 4, 10, 15, 20}
{11, 13, 15, 17, 19}
{2, 4, 10, 15, 20}