浅谈分治算法

浅谈分治算法

本篇随笔讲解信息学奥林匹克竞赛中的分治算法。分治算法更多的是一种思想,不仅是一种算法本身,以后的很多高级算法和数据结构(比如分块),都是分治思想的一种应用。好好体会分治思想,对算法竞赛的思维开发非常有帮助。


分治的概念

分治:字面上的意思就是“分而治之”,简单来说,就是把一个难搞的大问题拆分成很多相对来讲容易搞的小问题,然后把小问题的答案合并起来,导出大问题的答案。是为分治。


分治的适用范围

1、首先,大问题拆成小问题一定要变得更容易解决,否则的话,大问题被拆分之后变得更难了或者并没有什么变化,还拆它干什么。

2、拆成的问题一定是相同种类的,可以进行类比解决。即递归思想。要不然你还想把每个小问题单设计一个算法?

3、分解之后的问题统计出的答案要对大问题的答案有所贡献。意思是说,解决小问题之后要可以合并。

4、小问题之间要相互独立。


分治的步骤

我们可以用树形结构来类比分治算法的实现过程。

假设要求解的大问题是这棵树的根节点。那么整棵树就是分治的过程,叶子节点就是我们要解决的最好的问题。

刚才已经说过,分治的定义更多的偏向于一种思想。下面用一个例子来让大家深入地体会分治思想。

  • 全排列问题

没错,这是一道搜索题。

但是里面的确体现了分治思想(滑稽肯定)

大问题是求出所有的排列方式。

拆分成小问题就是以1开头、以2开头......以n开头。

然后继续拆分,第二位是1,是2,是3......

知道分到只有一个数字的时候,不再分解。

这其实也可以类比成一棵树。每一层表示每一位可能摆放的数字。这既是做这道题的深搜“搜索树”的类比方法。也是这道题的分治思想的类比方法。

代码就不贴了。

posted @ 2019-09-25 18:49  Seaway-Fu  阅读(364)  评论(0编辑  收藏  举报