浅谈分治算法
本篇随笔讲解信息学奥林匹克竞赛中的分治算法。分治算法更多的是一种思想,不仅是一种算法本身,以后的很多高级算法和数据结构(比如分块),都是分治思想的一种应用。好好体会分治思想,对算法竞赛的思维开发非常有帮助。
分治的概念
分治:字面上的意思就是“分而治之”,简单来说,就是把一个难搞的大问题拆分成很多相对来讲容易搞的小问题,然后把小问题的答案合并起来,导出大问题的答案。是为分治。
分治的适用范围
1、首先,大问题拆成小问题一定要变得更容易解决,否则的话,大问题被拆分之后变得更难了或者并没有什么变化,还拆它干什么。
2、拆成的问题一定是相同种类的,可以进行类比解决。即递归思想。要不然你还想把每个小问题单设计一个算法?
3、分解之后的问题统计出的答案要对大问题的答案有所贡献。意思是说,解决小问题之后要可以合并。
4、小问题之间要相互独立。
分治的步骤
我们可以用树形结构来类比分治算法的实现过程。
假设要求解的大问题是这棵树的根节点。那么整棵树就是分治的过程,叶子节点就是我们要解决的最好的问题。
刚才已经说过,分治的定义更多的偏向于一种思想。下面用一个例子来让大家深入地体会分治思想。
- 全排列问题
没错,这是一道搜索题。
但是里面的确体现了分治思想(滑稽肯定)
大问题是求出所有的排列方式。
拆分成小问题就是以1开头、以2开头......以n开头。
然后继续拆分,第二位是1,是2,是3......
知道分到只有一个数字的时候,不再分解。
这其实也可以类比成一棵树。每一层表示每一位可能摆放的数字。这既是做这道题的深搜“搜索树”的类比方法。也是这道题的分治思想的类比方法。
代码就不贴了。