- 8
- 0
- 约2.69万字
- 约 17页
- 2017-08-15 发布于上海
- 举报
第三章分治算法
1
第三章 分 治 算 法
§1. 算法基本思想
考虑下面折半搜索算法
程序 3-1-1 折半搜索
templateclass T
int BinarySearch(T a[], const T x, int n)
{// 在 数 组 a[0:n-1] 中 搜 索 x , 数 组 中 的 元 素 满 足 a[0]=a[1]
//= ···=a[n-1]。如果找到 x,则返回所在位置(数组元素的下标),
//否则返回 –1
int left=0; int right=n-1;
while (left=right){
int middle=(left+right)/2;
if(x a[middle]) return middle;
if(xa[middle]) left=middle+1;
else right=middle – 1;
}
return –1; //未找到 x
}
while 的每次循环 (最后一次除外)都将以减半的比例缩小搜索范围,所以,
该循环在最坏的情况下需要执行Θ(log n) 次。由于每次循环需耗时Θ(1) ,因此在
最坏情况下,总的时间复杂性为Θ(log n) 。
折半搜索算法贯彻一个思想,即分治法。当人们要解决一个输入规模,比
如 n,很大的问题时,往往会想到将该问题分解。比如将这n 个输入分成 k 个不
同的子集。如果能得到 k 个不同的可独立求解的子问题,而且在求出这些子问题
的解之后,还可以找到适当的方法把它们的解合并成整个问题的解,那么复杂的
难以解决的问题就可以得到解决。这种将整个问题分解成若干个小问题来处理的
方法称为分治法。一般来说,被分解出来的子问题应与原问题具有相同的类型,
这样便于采用递归算法。如果得到的子问题相对来说还较大,则再用分治法,直
到产生出不用再分解就可求解的子问题为止。人们考虑和使用较多的是 k=2 的情
形,即将整个问题二分。以下用A[1:n]来表示 n 个输入,用 DiCo(p,q)表示处理
输入为 A[p:q]情况的问题。
2
分治法控制流程
DiCo (p,q)
global n,A[1:n]; integer m,p,q; // 1≤p≤q≤n
if Small(p,q) then return Sol(p,q);
else m=Divide(p,q); // p≤mq
return Combine(DiCo(p,m),DiCo(m+1,q));
end if
end DiCo
这里,Small(p,q)是一个布尔值函数,用以判断输入规模为 q-p+1 的问题
是否小到无需进一步细分即可容易求解。若是,则调用能直接计算此规模下子问
题解的函数 Sol(p,q). 而 Divide(p,q)是分割函数,决定分割点,Combine(x,y)
是解的合成函数。如果假定所分成的两个问题的输入规模大致相等,则 DiCo 总
的计算时间可用下面的递归关系来估计:
( ) n ( )
g n 当输入规模 比较小时,直接求解运算Sol n 的用时
⎧
( )
T n ⎨ (3.1.1)
2 ( / 2) ( ) ( )
⎩ T n +f n f n 是Combine用时
例 3.1.1 求 n 元数组中的最大和最小元素
最容易想到的
您可能关注的文档
最近下载
- 2025年上海科学技术职业学院单招笔试职业能力测验试题库含答案解析.docx VIP
- 计数型MSA分析表(大样法).xlsx VIP
- 2026年春季人教版小学数学三年级下册教学计划(含进度表).docx VIP
- 2025年二级造价工程师《交通运输工程》试题及答案.docx VIP
- 教师口语教程第二章教学口语训练课件.pptx VIP
- 2025年人教版高中思想政治选择性必修2教材探究与分享参考答案.doc VIP
- PLC应用技术(西门子S7-1200)全套PPT课件.pptx
- 2025北京西城北师大实验中学七下数学期中试卷含答案.pdf VIP
- DB36_T 1085-2025 电动自行车停放充电场所消防安全规范.pdf VIP
- 提高自粘性地下室外墙防水卷材施工质量QC成果.docx VIP
原创力文档

文档评论(0)