分治法
分治法(Divide and Conquer)
分治策略是将原问题分解为k个子问题,并对k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止。
将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。
分治法的适用条件有以下四点:
-
该问题的规模缩小到一定的程度就可以容易地解决。
-
该问题可以分解为若干个规模较小的相同问题,即该问题具有子结构性质。
-
利用该问题分解出的子问题的解可以合并为该问题的解。
-
该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题(如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然也可用分治法,但一般用动态规划较好)。
人们在大量实践中发现,在用分治法设计算法时,最好使子问题的规模大致相同。即将一个问题分成大小相等的k个子问题的处理方法是行之有效的。这种使子问题规模大致相等的做法是出自一种平衡子问题的思想,它几乎总是比子问题规模不等的做法要好。
知识测验
二分搜索
一个装有16个硬币的袋子,16个硬币中有一个是伪造的,并且那个伪造的硬币比真的硬币要轻一些,要求找出这个伪造的硬币。只提供一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同,以及哪一组更轻。
算法思想是将16个硬币等分成A、B两份,将A放仪器的一边,B放另一边,如果A袋轻,则表明伪币在A,解子问题A即可,否则解子问题B。
二分搜索每执行一次循环,待搜索数组的大小减少一半,在最坏情况下,循环被执行了次,循环体内运算需要时间。因此,整个算法在最坏情况下的计算时间复杂性为。
天平找伪币:每次保留一半
解锁完整互动实验、进阶解析与精选参考答案。
知识测验
知识测验
32枚硬币的查找轨迹
32枚硬币按1至32编号,恰有一枚较轻的伪币。为了核对过程,假设伪币为22号。每次把当前候选按编号等分,用天平称重,保留较轻的一组。
- 在纸上写出每轮的A组、B组、称重结果和保留候选。
- 写出总称重次数,并说明它与候选数量的关系。