分而治之
在计算机科学中,分治法是建基于多项分支递归的一种很重要的算法范式。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
下面将通过两个示例来理解分治法:
图解示例1
假设你是一位农场主,有一小块(1680m * 640m)土地,你要将这块地均匀地分成方块,且分出的方块要尽可能大。
显然,下面的分法都不符合要求
如何将一块地均匀地分成方块,并确保分出的方块是最大的呢?使用分治策略!分治算法是递归的。使用分治解决问题的过程包括两个步骤。
1)找出基线条件,这种条件必须尽可能简单。
2)不断将问题分解(或者说缩小规模),直到符合基线条件。
下面就来使用分治找出上述问题的解决方案:
首先,找出基线条件。最容易处理的情况时,一条边的长度是另一条边的整数倍。
如果一边长25m,另一边长50m,那么可使用的最大方块为25mX25m。换言之,可以将这块地分成两个这样的方块。
接下来需要找出递归条件,这也是分治的用武之地。根据分治的定义,每次递归调用都必须缩小问题的规模。如何缩小上述问题的规模呢?
我们首先找出这块地可容纳的最大方块。
你可以从这块地中划出两个640mX640m的方块,同时余下一小块地。然后对余下的那一小块地使用相同的算法。
最初要划分的土地尺寸为1680mX640m,而现在要划分的土地更小,为640mX400m。换言之,通过分治方法,将均匀划分1680mX640m土地的问题简化成了均匀划分640mX400m土地的问题。
下面再次使用同样的算法。对于640mX400m的土地,可从中划出的最大方块为400mX400m
这将余下一块更小的土地,其尺寸为400mX240m。
你可从这块土地中划出最大的方块,余下一块更小的土地,其尺寸为240mX160m。
接下来,从这块土地中划出最大的方块,余下一块更小的土地。
余下的这块土地满足基线条件,因为160是80的整数倍。将这块土地分成两个方块后,将不会余下任何土地!
因此,对于最初的那片土地,适用的最大方块为80mX80m。
图解示例2
给定一个数字数组[2,4,6],要求使用递归函数来将这些数字相加,并返回结果。
第一步:找出基线条件。最简单的数组是数组不包含任何元素或只包含一个元素,计算总和将非常容易。
因此这就是基线条件。
第二步:每次递归调用都必须离空数组更近一步。