算法分治策略
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
问题的分解
问题S
问题S1
问题S2
……
问题Si
S1的解
S2的解
子问题求 解
……
Si的解
子集解的合并
问S的题解S
……
问题Sn
……
Sn的解
分治策略的解题思路
if 问题不可分then begin 直接求解; 返回问题的解;
end else begin
对原问题进行分治; 递归对每一个分治的部分求解 归并整个问题,得出全问题的解; end;
2 分治法的适用条件
分治法所能解决的问题一般具有以下几个特征:
该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题,即该
问题具有最优子结构性质 利用该问题分解出的子问题的解可以合并为该问题的
解; 该问题所分解出的各个子问题是相互独立的,即子问
题之间不包含公共的子问题。
二分搜索技术
给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素
中找出一特定元素x。
据此容易设计出二分搜索算法: public static int binarySearch(int [] a, int x, int n)
{ቤተ መጻሕፍቲ ባይዱ
算法复杂度分析: 每执行一次算法的 while循环, 待搜索
// 在 a[0] <= a[1] <= ... <= a[n-1] 中搜索 x // 找到x返回其在数组中的位置,否则返回-1 int left = 0; int right = n - 1;
while (left <= right) {
数组的大小减少一半。 因此,在最坏情况下, while循环被执行了
int middle = (left + right)/2; if (x == a[middle]) return middle; if (x > a[middle]) left = middle + 1; else right = middle - 1;
O(log2n) 次。循环体 内运算需要O(1) 时间,
因此整个算法在最坏
} return -1; // 未找到x }
情况下的计算时间复 杂性为O(log2n) 。
二分搜索技术
❖ 算法复杂度分析: ❖ 二分搜索算法在最坏情况下的计算时间复杂性
为O(log2n) 。
复杂度分析
T (n)
T
O(1) (n / 2)
b
n 1 n 1
T(n)= O(log2n)
❖ 人们从大量实践中发现,在用分治法设计算法时, 最好使子问题的规模大致相同。即将一个问题分 成大小相等的k个子问题的处理方法是行之有效的。 这种使子问题规模大致相等的做法是出自一种平 衡(balancing)子问题的思想,它几乎总是比子问 题规模不等的做法要好。
这条特征涉及到分治法的效率,如果各子问题是不 能独这因否立条为利的特问用,征题分则是的治分应计法治用算完法分复全要治杂取做法性决许的一于多前般问不提是题必,随是要它着否的也问具工是题有作大规这,多模条重数的特复问增征地题加, 如解可而果公以增具共满加备的足,了子的因前问,此两题此大条,特部特此征分征时反问,虽映题而然了满不也递足具可归这备用思个第分想特三治的征条法应。特,用征但,一则般 可用以动考态虑规贪划心较算好法。或动态规划。
方法2:每一枚硬币只进行了一次比较 方法3:将硬币分为两组后一次比较可以将
硬币的范围缩小到了原来的一半,这样充分 地利用了只有1枚伪币的基本性质。
一、分治策略的基本思想
1 基本思想 对于一个规模为n的问题,若该问题可以容易地解决(比如说
规模n较小),则直接解决,否则将其分解为k个规模较小的子问 题,这些子问题互相独立且与原问题形式相同,递归地解这些子 问题, 然后将各子问题的解合并,得到原问题的解。这种算法 设计策略叫做分治法(divide and conquer)。
方法1
任意取1枚硬币,与其他硬币进行比较,若发现 轻者,这那枚为伪币。最多可能有15次比较。
方法2
将硬币分为8组,每组2个,每组比较一次,若发 现轻的,则为伪币。最多可能有8次比较。
方法3
分析
上述三种方法,分别需要比较15次,8次,4次, 那么形成比较次数差异的根本原因在哪里?
方法1:每枚硬币都至少进行了一次比较,而 有一枚硬币进行了15次比较
二分搜索技术
给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素 中找出一特定元素x。 分析:✓ 该问题的规模缩小到一定的程度就可以容易地解决;
✓ 该问题可以分解为若干个规模较小的相同问题; ✓ 分解出的子问题的解可以合并为原问题的解; ✓ 分解出的各个子问题是相互独立的。 分分析析::比如较果xn和=1a即的只中有间一元个素元a[m素i,d],则若只x要=a比[m较id这],个则元x素在和L中x 的就位可置以就确是定mx是id;否如在果表x中<a。[m因id此],这由个于问a题是满递足增分排治序法的的,第因一 分此个析假适:如用很x条在显件a然中此的问话题,分x必解然出排的在子a问[m题id相]的互前独面立,,所即以在我a们[i]的只前 面要或在后a[m面i查d]的找前x是面独查立找的x即子可问;题如,果因x此>a满[i]足,分同治理法我的们第只四要个在适 用a[m条i件d]的。后面查找x即可。无论是在前面还是后面查找x,其 方法都和在a中查找x一样,只不过是查找的规模缩小了。 这就说明了此问题满足分治法的第二个和第三个适用条件。
分治法在每一层递归上由三个步骤组成: (1) 划分(divide):将原问题分解为若干规模较小、 相互独 立、 与原问题形式相同的子问题。 (2) 解决(conquer): 若子问题规模较小,则直接求解;否 则递归求解各子问题。 (3) 合并(combine): 将各子问题的解合并为原问题的解。
分治思想
第三章 分治算法
一、 分治算法基本思想 二、 典型实例 三、 分治算法的分析技术 四、 难解问题
问题:找出伪币
给你一个装有1 6枚硬币的袋子。1 6枚硬币中有 一个是伪造的,并且那个伪造的硬币比真的硬币 要轻一些。你的任务是找出这枚伪造的硬币。
为了帮助你完成这一任务,将提供一台可用来比 较两组硬币重量的仪器,比如天平。利用这台仪 器,可以知道两组硬币的重量是否相同。