基本概念
用减治法解题的过程是把原问题分解为小问题,再把小问题分解成更小的问题,直到得到解。规模为n的原问题与分解后较小规模的子问题,它们的解有以下关系:
(1)原问题的解只存在于其中一个子问题中;
(2)原问题的解和其中一个子问题的解之间存在某种对应关系。
按每次迭代中减去规模的大小把减治法分成以下3种情况:
(1)减少一个常数。在算法的每次迭代中,把原问题减少相同的常数个,这个常数一般等于1.相关的算法有插入排序、图搜索法(DFS、BFS)、拓扑排序、生成排序、生成子集等。在这些问题中,每次把问题的规模减少1.
(2)按比例减少。在算法的每次迭代中,问题的规模按常数成倍减少,减少的效率极高。在大多数应用中,此常数因子等于2。折半查找(Binary Search)是最典型的例子,在一个有序的数列中查找某个数k,可以把数列分成相同长度的两半,然后在包含k的那部分继续折半,直到最后匹配到k,总共需要 $ log_{2} n $ 次折半。hexo g
(3)每次减少的规模都不同。减少的规模在算法的每次迭代中都不同,例如查找中位数(用快速排序的思路)、插值查找、欧几里得算法等。