分治算法由两部分组成:
分:将问题分解为较小的问题,并递归解决小问题(基本情况除外)。
治:从所有子问题的解中构建原问题的解。
一般认为,在程序中至少含有两个递归的算法就是分治算法,如果只有一个递归函数(例如,快速幂等),那么通常是将原问题转化为更简单的问题来解决,例如求阶乘的递归写法:只是将n的阶乘转化成了n乘(n-1)的阶乘,并没有将原问题进行分解。
在分治算法中,子问题通常是不相交的,如果子问题相交,例如斐波那契数列的递归写法,实际上并没有将问题真正分解(因为
,
,可以看到在递归中出现了重复的计算,也就是子问题是相交的),这样就会使算法的效率变低,事实上使用递归算法的斐波那契数列求解在
的情况下效率就已经非常低了。所以在使用分治算法时,子问题之间尽量不要有交集。
分治算法一般由两个递归函数(递归的解决子问题)以及一些附加的工作(用来处理两个子问题的解并得到最终解)组成。如果处理基本情况的语句时间复杂度为,那么分治算法花费的时间就是:
由主定理可知,这个表达式的最终结果为(也就是时间复杂度)。所以在一般情况下 ,分治算法解决问题的时间复杂度就为
。
下面以两个例子来说明分治算法的思想:
最近点问题:
有一个平面点集(如下图),我们假设点集是按照横坐标排好序的(就算对点集进行排序,最坏的时间界也为
,这并不会影响分治算法的最终时间量级)。如果
,
,它们之间的欧几里得距离为
。我们需要找到一对点,它们之间的距离是所有点对距离的最小值,如果
,那么这个距离就为0.
如果点集中有N个点,那么总共就有

本文介绍分治算法,它由分和治两部分组成,子问题尽量不相交,一般时间复杂度为特定值。通过最近点问题和选择问题说明其思想,最近点问题用分治算法可优化时间复杂度,选择问题类似快排,五分化中项的中项可保证子问题规模,最终实现分治求解。
最低0.47元/天 解锁文章
248

被折叠的 条评论
为什么被折叠?



