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