由于已经讨论了分而治之的方法,包括以下步骤:
划分问题成为许多有同样的问题的情况下,较小的子问题。
征服通过递归地解决这些问题的子问题。但是,如果子问题的大小足够小,则只需直接解决子问题即可。
将子问题的解决方案合并到原始问题的解决方案中。
同样,减少和征服方法的工作原理也包括以下步骤:
将问题实例减少或减少为相同问题的较小实例,并扩展解决方案。
通过解决问题的更小的情况下征服了问题。
扩展小实例的解以获得原始问题的解。
减少征服技术的基本思想是基于对问题给定实例的解决方案与问题较小实例的解决方案之间的关系。这种方法也称为增量或归纳方法。
“分而治之”与“分而治之”:
根据Wikipedia,一些作者认为,仅当每个问题都可能产生两个或多个子问题时才应使用“分而治之”这个名称。已经为单子问题类建议使用名称减少和征服。根据此定义,“合并排序”和“快速排序”归类为“分而治之”(因为有两个子问题),“二进制搜索”归类为“归一化”(因为有一个子问题)。
减少和征服的实现:
这种方法可以实现为自上而下或自下而上。
自上而下的方法:它总是导致问题的递归实施。
自下而上的方法:通常以迭代的方式实现,从解决问题的最小实例开始。
减少和征服的变化:
减少征服有三个主要变体:
- 减少一个常数
- 减少一个常数
- 可变尺寸减小
减少常数:在此变体中,实例的大小在算法的每次迭代中减少相同的常数。通常,此常数等于1,尽管偶尔也会发生其他常数尺寸减小的情况。以下是示例问题:
- 插入排序
- 图形搜索算法:DFS,BFS
- 拓扑排序
- 生成排列,子集的算法
减少常数因子:此技术建议在算法的每次迭代中以相同的常数因子减少问题实例。在大多数应用中,此常数因子等于2。减少两倍以外的其他因素尤为罕见。
恒定因子算法的减少非常有效,尤其是当该因子大于2时,如在伪硬币问题中那样。以下是示例问题:
- 二进制搜索
- 假币问题
- 俄罗斯农民繁衍
可变大小减小:在这种变化中,减小大小的模式从算法的一次迭代到另一次迭代而变化。
因为,尽管第二个自变量的值总是在右侧小于在左侧,但是找到两个数的gcd的问题,它既不减小也不减小常数。以下是示例问题:
- 计算中位数和选择问题。
- 插值搜索
- 欧几里得算法
可能存在这样一种情况,即可以通过逐常数减少以及逐因子减少来解决问题,但是实现可以是递归的也可以是迭代的。迭代实现可能需要更多的编码工作,但是它们避免了递归带来的重载。
参考 :
安妮·莱维汀(Anany Levitin)
减少并征服