分治的基本思想
分治(Divide and Conquer)
- 分而治之,是处理复杂问题的一个最基本、也最常用的策略之一
基本思想
规模为N的原始问题 ==> 若干规模较小的同类子问题 ==> 若干规模更小的同类子问题 ==> 直接求解规模更小的子问题 ==> 将各个子问题的解合并为原问题的解
分治的实例———找假币
12个一模一样的硬币,已知==只有一枚是假币==,并且假币和真币的重量不一样(假设假币比真币轻),问如何用一个天平把假币从这12枚硬币中找出来,只能称3次
- 最简单的办法: 直接求解的找假币问题: 2枚称1次
- 稍复杂的:3枚,需要称几次?
- 分治法 + 排除法
- 12枚分成两等份,每份6枚;
- 假币那端的6枚再次分为两等分,每份3枚;
- 有假币的那一端的3枚硬币中任意取出2个去称重。
- 分治法
- 把12枚硬币分成3等份,每份4枚;
- 在有假币的那一端的4枚硬币中,任取两枚到天平两端去称重;
- 若假币在余下的那两枚中,则把这两枚硬币放到天平两端去称重。
典型分治的方法
- 最常用的是二分法
- 每次将原问题分解为两个子问题
- 一分为二的哲学思想的应用
- 许多经典的算法,并归排序、拆半查找、二分法就方程的根等
- 合并是算法的关键
- 无统一的模式
- 每次将原问题分解为两个子问题
分治的实例
- 归并排序
- 将相邻的两个有序数列合并成一个新的有序数列:总是取两个剩余序列中排在前面的最小数放到合并后的序列中,
分治方法给我们的哲学思考——换一个角度,一分为二地观察和思考问题,
- 化繁为简
- 化难为易
- 化大为小
- 化未知为已知