分治
分治
基本介绍
分治法,即“分而治之”,对于一个难以解决的大问题,将其分解成 \(k\) 个相同或相似的规模更小的子问题,一直分解直到问题足够小,极容易求解为止。
解题步骤
分治法建模的大概流程可以分为三步:
- 分解:将大问题分解成多个更小的独立且相同或相似子问题,直到子问题容易容易求解
- 解决:递归解决子问题
- 合并:将子问题的解一层一层合并,直到最终合并成原问题的解
题目特征
一般能用分治法求解的题目有以下特征:
- 最优子结构:该问题可分解为若干个规模较小的子问题,并且子问题规模缩小到一定程度就能够容易解决,同时子问题的解能够合并为该问题的解
- 平衡子问题:子问题规模大致相同,能将原问题划分为 \(k\) 个大小差不多相等的子问题。一般子问题规模相等的处理效率,相较规模不等的处理效率更高。
- 独立子问题:子问题之间相互独立,子问题之间不包含公共的子问题。这是区别于 dp 的根本特征。在 dp 中,子问题之间是相互联系的。
时间效率
分治法解决大规模的问题时,会将问题分为k个子问题分别求解。一般 \(k=2\),即分成两个规模相同的子问题求解。
对于分治,不仅能使问题更容易理解,常常也能大大优化时间复杂度。一般体现就是把时间复杂度为 \(O(n)\) 的某个操作优化为 \(O(\log n)\)。
这是根据分治的局部优化,有利于全局的特点,将解决一个子问题的影响力扩大到了全局,最终优化时间复杂度。
应用
分治法应用广泛,二分、归并排序、快速排序等算法都是基于分治衍生的。从数学、搜索,到数据结构、动态规划无不看出分治思想在其中神奇的作用。
update
2023.5.26大体构架完成
2023.7.17完善部分格式问题,删除部分无意义内容。
参考资料:oiwiki、算法竞赛(罗勇军、郭卫斌著)