《数据结构算法与应用-C++语言描述(十四)》青少年经典文学读本.pdfVIP

  • 3
  • 0
  • 约6.45万字
  • 约 34页
  • 2017-12-29 发布于浙江
  • 举报

《数据结构算法与应用-C++语言描述(十四)》青少年经典文学读本.pdf

下载 下载 第1 4章 分而治之算法 君主和殖民者们所成功运用的分而治之策略也可以运用到高效率的计算机算法的设计过程 中。本章将首先介绍怎样在算法设计领域应用这一古老的策略,然后将利用这一策略解决如下 问题:最小最大问题、矩阵乘法、残缺棋盘、排序、选择和一个计算几何问题——找出二维空 间中距离最近的两个点。 本章给出了用来分析分而治之算法复杂性的数学方法,并通过推导最小最大问题和排序问 题的复杂性下限来证明分而治之算法对于求解这两种问题是最优的(因为算法的复杂性与下限 一致)。 14.1 算法思想 分而治之方法与软件设计的模块化方法非常相似。为了解决一个大的问题,可以: 1) 把它 分成两个或多个更小的问题; 2) 分别解决每个小问题; 3) 把各小问题的解答组合起来,即可 得到原问题的解答。小问题通常与原问题相似,可以递归地使用分而治之策略来解决。 例14-1 [找出伪币] 给你一个装有 1 6个硬币的袋子。 1 6个硬币中有一个是伪造的,并且那个伪 造的硬币比真的硬币要轻一些。你的任务是找出这个伪造的硬币。为了帮助你完成这一任务, 将提供一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否 相同。 比较硬币1与硬币2 的重量。假如硬币 1比硬币2轻,则硬币 1是伪造的;假如硬币 2 比硬币1 轻,则硬币2 是伪造的。这样就完成了任务。假如两硬币重量相等,则比较硬币 3和硬币4 。同 样,假如有一个硬币轻一些,则寻找伪币的任务完成。假如两硬币重量相等,则继续比较硬币 5和硬币6 。按照这种方式,可以最多通过8次比较来判断伪币的存在并找出这一伪币。 另外一种方法就是利用分而治之方法。假如把 1 6硬币的例子看成一个大的问题。第一步, 把这一问题分成两个小问题。随机选择 8个硬币作为第一组称为A 组,剩下的8个硬币作为第二 组称为B 组。这样,就把 1 6个硬币的问题分成两个 8硬币的问题来解决。第二步,判断 A 和B 组 中是否有伪币。可以利用仪器来比较 A 组硬币和B 组硬币的重量。假如两组硬币重量相等,则 可以判断伪币不存在。假如两组硬币重量不相等,则存在伪币,并且可以判断它位于较轻的那 一组硬币中。最后,在第三步中,用第二步的结果得出原先 1 6个硬币问题的答案。若仅仅判断 硬币是否存在,则第三步非常简单。无论 A 组还是B 组中有伪币,都可以推断这 1 6个硬币中存 在伪币。因此,仅仅通过一次重量的比较,就可以判断伪币是否存在。 现在假设需要识别出这一伪币。把两个或三个硬币的情况作为不可再分的小问题。注意如 果只有一个硬币,那么不能判断出它是否就是伪币。在一个小问题中,通过将一个硬币分别与 其他两个硬币比较,最多比较两次就可以找到伪币。 这样, 1 6硬币的问题就被分为两个 8硬币(A 组和B 组)的问题。通过比较这两组硬币的重 量,可以判断伪币是否存在。如果没有伪币,则算法终止。否则,继续划分这两组硬币来寻找 伪币。假设B 是轻的那一组,因此再把它分成两组,每组有 4个硬币。称其中一组为 B 1,另一 组为B2 。比较这两组,肯定有一组轻一些。如果 B 1轻,则伪币在B 1中,再将B 1又分成两组, 第 1 4章 分而治之算法 4 3 5 下载 每组有两个硬币,称其中一组为 B 1a ,另一组为B 1b 。比较这两组,可以得到一个较轻的组。 由于这个组只有两个硬币,因此不必再细分。比较组中两个硬币的重量,可以立即知道哪一个 硬币轻一些。较轻的硬币就是所要找的伪币。 例14-2 [金块问题] 有一个老板有一袋金块。每个月将有两名雇员会因其优异的表现分别被奖 励一个金块。按规矩,排名第一的雇员将得到袋中最重的金块,排名第二的雇员将得到袋中最 轻的金块。根据这种方式,除非有新的金块加入袋中,否则第一名雇员所得到的金块总是比第 二名雇员所得到的金块重。如果有新的金块周期性的加入袋中,则每个月都必须找出最轻和最 重的金块。假设有一台比较重量的仪器,我们希望用最少的比较次数找出最轻和最重的金块。 假设袋中有n 个金块。可以用函数M a x (程序1 - 3 1)通过n-1次比较找到最重的金块 。找 到

文档评论(0)

1亿VIP精品文档

相关文档