由于已经讨论了分而治之的方法,其中包括以下步骤:
划分问题成为许多有同样的问题的情况下,较小的子问题。
征服通过递归地解决这些问题的子问题。但是,如果子问题的大小足够小,则只需以简单的方式解决子问题。
将子问题的解合并为原问题的解。
同理,减法也有效,它也包括以下步骤:
将问题实例减少或减少到相同问题的较小实例并扩展解决方案。
通过解决问题的更小的情况下征服了问题。
扩展较小实例的解以获得原始问题的解。
减少和征服技术的基本思想基于利用给定问题实例的解决方案与其较小实例的解决方案之间的关系。这种方法也称为增量或归纳方法。
“分而治之”与“减而治之”:
根据维基百科,一些作者认为只有当每个问题可能产生两个或多个子问题时才应该使用“分而治之”这个名称。已经为单子问题类提出了名称减少和征服。根据这个定义,归并排序和快速排序属于分治法(因为有2个子问题),二分搜索属于减法(因为有一个子问题)。
减少和征服的实现:
这种方法可以实现为自顶向下或自底向上。
自顶向下的方法:它总是导致问题的递归实现。
自底向上方法:通常以迭代方式实现,从解决问题的最小实例开始。
减少和征服的变化:
减法有以下三种主要变体:
- 减少一个常数
- 减少一个常数因子
- 可变大小减少
减少常数:在此变体中,实例的大小在算法的每次迭代中减少相同的常数。通常,这个常数等于 1 ,尽管偶尔会发生其他常数大小的减小。以下是示例问题:
- 插入排序
- 图搜索算法:DFS、BFS
- 拓扑排序
- 生成排列、子集的算法
减少常数因子:此技术建议在算法的每次迭代中以相同的常数因子减少问题实例。在大多数应用中,这个常数因子等于 2。减少两倍以外的因素尤其罕见。
减少常数因子算法非常有效,尤其是当因子大于 2 时,如假币问题。以下是示例问题:
- 二分查找
- 假币问题
- 俄罗斯农民乘法
Variable-Size-Decrease :在此变体中,大小减小模式从算法的一次迭代到另一次迭代而变化。
因为,在找到两个数的 gcd 的问题中,尽管第二个参数的值在右侧总是小于左侧,但它既不是常数也不是常数因子。以下是示例问题:
- 计算中位数和选择问题。
- 插值搜索
- 欧几里得算法
可能存在这样的情况,问题可以通过按常数递减和按因子递减的变化来解决,但实现可以是递归的或迭代的。迭代实现可能需要更多的编码工作,但是它们避免了伴随递归的过载。
参考 :
阿纳尼·列维京
减少与征服
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。