递归与分治策略
2017-01-02 15:37
183 查看
一.分治法和递归的关系
分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
直接或间接地调用自身的算法称为递归算法。用函数自身给出定义的函数称为递归函数。
由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。
二.分治法的使用条件
(1)n该问题的规模缩小到一定的程度就可以容易地解决;
(2)n该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质
(3)n利用该问题分解出的子问题的解可以合并为该问题的解;
(4)该问题所分解出的各个子问题是相互独立的,这条特征是应用分治法的前提,它也是大多数问题可以满足的,此特征反映了递归思想的应用.
能否利用分治法完全取决于问题是否具有这条特征,如果具备了前两条特征,而不具备第三条特征,则可以考虑贪心算法或动态规划。
快速排序:在快速排序中,记录的比较和交换是从两端向中间进行的,关键字较大的记录一次就能交换到后面单
元,关键字较小的记录一次就能交换到前面单元,记录每次移动的距离较大,因而总的比较和移动次数较少。
template<class Type>
void QuickSort(Type a[], int p, int r)
{
if (p<r) {
int q=Partition(a,p,r);
QuickSort (a,p,q-1); //对左半段排序
QuickSort(a,q+1,r); //对右半段排序
}
}
分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
直接或间接地调用自身的算法称为递归算法。用函数自身给出定义的函数称为递归函数。
由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。
二.分治法的使用条件
(1)n该问题的规模缩小到一定的程度就可以容易地解决;
(2)n该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质
(3)n利用该问题分解出的子问题的解可以合并为该问题的解;
(4)该问题所分解出的各个子问题是相互独立的,这条特征是应用分治法的前提,它也是大多数问题可以满足的,此特征反映了递归思想的应用.
能否利用分治法完全取决于问题是否具有这条特征,如果具备了前两条特征,而不具备第三条特征,则可以考虑贪心算法或动态规划。
快速排序:在快速排序中,记录的比较和交换是从两端向中间进行的,关键字较大的记录一次就能交换到后面单
元,关键字较小的记录一次就能交换到前面单元,记录每次移动的距离较大,因而总的比较和移动次数较少。
template<class Type>
void QuickSort(Type a[], int p, int r)
{
if (p<r) {
int q=Partition(a,p,r);
QuickSort (a,p,q-1); //对左半段排序
QuickSort(a,q+1,r); //对右半段排序
}
}
相关文章推荐
- 算法源码之递归与分治策略(1)
- 递归与分治策略
- 第二章 递归与分治策略(排列的字典序问题)
- 递归与分治策略
- 递归和分治策略之二分搜索法
- 算法知识点整理——第2章 递归与分治策略
- 计算机算法设计与分析——递归与分治策略(二)
- 第二章 递归与分治策略
- 递归与分治策略-----合并排序
- 算法学习(一):递归与分治策略(1)
- 递归与分治策略
- 算法--递归与分治策略
- 递归和分治策略的算法总结
- 算法设计与分析笔记之(2):递归与分治策略
- 递归与分治策略
- 分治策略、动态规划、贪婪选择以及递归之间的关系与区别(-)
- 递归与分治策略
- Java语言描述:递归与分治策略之合并排序与快速排序
- 递归与分治策略
- 第二章 递归与分治策略