当前位置:首页 > 百科 > 正文

分治算法

分治算法的基本思想是将一个良货下层内后务序新规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,深脱货补错易需深就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。

  • 中文名称 分治算法
  • 别名 分治法
  • 适用领域 计算机科学;数学
  • 应用学科 计算机;数学

来自本思想

  当我们求解某些问题时,由于这些问题要处居站太讨探喜理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往演迅往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。如果这些子问题还较大,难以解决,可以再把它们分360百科成几个更小的子问题,以此类推,直至可以直接求出解为施西止。这就是分治策略的基本思想。

二分法

  利用分治策略求解时,所需时间取决于分解后子问题的个数、子问题的规模大小等因素务言死光跳色运最,而二分法,由于其划分的简单和均匀的特点,是经常采用的一种有效的方法,例如二分法检索。

解题步骤

  分治法解题的一般步骤(如图1):

1 分治算法

  (1)分解,将要解决的问题划分成若干规模较小的同类问题;

  (2)求解,当子问题划分得足够小时,用较简单的方法解决;

  (3)合并,按原问题的要求,将子问题的解逐层合氧适并构成原问题的解。

应用实例

  下面通过实例加以限汉唱流坚双守小而周吧说明:

找出伪币

  给你一个装有16个硬币的袋子。16个硬币中有一个是伪造的,并且那个伪造的硬币比真的硬币要轻一杀威设意油毛带洲对这些。你的任务是找出这个伪造的硬币。为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同。比较硬来自币1与硬币2的重量。假如硬币1比硬币2轻,则硬币1是伪造的;假如硬药也际币2比硬币1轻,则硬币2是伪造的。这样就完成了任务。假如两硬币重量相等,则比较硬币3和硬币4。同样,假如有一个硬币轻一些,则寻找伪币的任务完成。假如两硬币重量相等,则继续比较硬币5和硬币6。按360百科照这种方式,可以最多通过8次比较来判断伪币的存在并找出这着均行供歌坏里条卷婷对一伪币。

  另外一种方法就还缩钱承下者研尼云第是利用分而治之方法。假如把16硬币的例子看成一个大的问题。第一步,把这一问题分成两乡副国县接色输个小问题。随机选择8个硬格段乱币作为第一组称为A组,剩下的8个硬币作为第二组称为B组。这样,就把16个硬币的问题分成两个8硬币的问题来解决。第二步,判断A和B组中是否有伪币。可以利用仪器来比较A组硬币和B组硬币的重量。假如两组硬币重量相等,则可以判庆转请字屋息专断伪币不存在。假如两组硬币重量不相等,则存在伪币,并且可以判断它位于较轻的那一组硬币中。最后,在第三步中,用第二步的结果绝卫得出原先16个硬币问题的答案。若仅仅判断硬币是否存在,则第三步非常简单。无论A组还是B组中有伪币,都可以推断这16个硬币中存在伪币。因此,仅仅通过一次重量的比较,就可以判断伪币是否存在。

  假设需要识别出这一伪币。把两个或三个硬币的情况作为不可再分的小问题。注意如果只有一个硬币,那么不能判断出它是否就是伪币会不国。在一个小问题中,通过将一个硬币分别与其他两个硬币比较,最多比较两次就可以找到伪币。这样,16硬币的问题就被分为两个8硬币(A组和B组)的问题。通过比较这两组硬币的重量,可以判断伪币是否存在。如果没生哪空有伪币,则算法终止。否则,继续划分这两组硬币来寻找伪币。假设B是轻的那一组,因此再把它伯区察超报座亲余分成两组,每组有4个普笔进社硬币。称其中一组为B1,另一组为B2快门造交指景。比较这两组,肯定有一组轻一些。如果B1轻,则伪币在B1中,再将B1又分成两组,每组有两个硬币,称其中一组为B1a,另一组为B1b。比较这两组,可以得到一个较轻的组。由于这个组只有两个硬币,因此不必再细分。比较组中两个硬币的重量,可以立即知道哪一个硬币轻一些。较轻的硬币就是所要找的伪币。

求最值

  在n个元素中找出最大元素和最小元素。我们可以把这n个元素放在一个数组中,用直接比较法求出。算法如下:

  上面这个算法需比较2(n-1)次。能否找到更好的算法呢?我们用分治策略来讨论。

  把n个元素分成两组:

  A1={A[1],...,A[int(n/2)]}和A2={A[INT(N/2)+1],...,A[N]}

  分别求这两组的最大值和最小值,然后分别将这两组的最大值和最小值相比较,求出全部元素的最大值和最小值。如果A1和A2中的元素多于两个,则再用上述方法各分为两个子集。直至子集中元素至多两个元素为止。

  例如有下面一组元素:-13,13,9,-5,7,23,0,15。用分治策略比较的算法如下:

棋盘覆盖

  题目:在一个(2^k)*(2^k)个方格组成的棋盘上,有一个特殊方格与其他方格不同,称为特殊方格,称这样的棋盘为一个特殊棋盘。我们要求对棋盘的其余部分用L型方块填满(注:L型方块由3个单元格组成。即祖题呢围棋中比较忌讳的愚形三角,方向随意),且任何两个L型方块不能重叠试占说弦排烧覆盖。L型方块的形态如下:

  题目的解法使用发呢准犯企企引奏夫分治法,即子问题和整体问题具有相同的形式。我们对棋盘做一个分割,我们可以看到棋盘被切成4个一样大小的子棋盘,特殊方块必定位于四个子棋盘中的一个。这样对于每个子棋盘又各有一个"特殊方块",我们对每个子棋盘继续这样分割,直到子棋盘的大小为1为止。

  用到的L型方块需要(4^k-1)/3 个,算法的时间是O(4^k),是渐进最优解法。

  本题目的C语言的完整代码如下(TC2.0下调试),运行时,先输入k的大小,(1<=k<=6),然后分别输入特殊方格所在的位置(x,y), 0<=x,y<=(2^k-1)。

应用场景

  运用分治策略解决的问题一般来说具有以下特点:

  1、原问题可以分解为多个子问题

  这些子问题与原问题相比,只是问题的规模有所降低,其结构和求解方法与原问题相同或相似。

  2、原问题在分解过程中,递归地求解子问题

  由于递归都必须有一个终止条件,因此,当分解后的子问题规模足够小时,应能够直接求解。

  3、在求解并得到各个子问题的解后

  应能够采用某种方式、方法合并或构造出原问题的解。

  不难发现,在分治策略中,由于子问题与原问题在结构和解法上的相似性,用分治方法解决的问题,大都采用了递归的形式。在各种排序方法中,如归并排序、堆排序、快速排序等,都存在有分治的思想。

展开全文阅读

上一篇
分治法

下一篇
避开采购黑洞