递归
1. 定义:一个函数在结束之前,直接或间接调用自身称为递归。
2. 思想:将一个不好解决的大问题转化为若干小问题,再把这些小问题进一步分解为更小的小问题,直至每个小问题可以直接解决为止。
3. 要素
(1)递归体:使问题向边界条件转化的过程;
(2)边界条件:程序终止的条件,也称为递归出口。
4. 优缺点
优点:程序结构简单,易证明其正确性。
缺点:难以理解,执行中占内存空间较多,运行效率低。
5.本质:递归程序在执行中需借助栈来实现(递归程序的入口语句和出口语句一般用条件判断语句来实现)。
分治
1. 基本思想:将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。找出各部分的解,然后把各部分的解组合成整个问题的解。
2. 归并排序是典型的基于分治策略的算法,它的主要思想就是将待排序的序列拆分为若干子序列,然后将子序列进行排序,然后将排好序的子序列合并。
贪心
1.两个性质:
(1)贪心选择性质
贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。
贪心算法仅在当前状态下作出最好选择(所作的贪心选择可以依赖于以往所作过的选择,但决不依赖于子问题的解), 然后再去解作出这个选择后产生的相应的子问题。
(2)最优子结构性质
当问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。 2.存在问题: (1)不能保证求出最优解,因此不能用来求最大或最小解问题; (2)只能求满足某些约束条件的可行解的范围。
动态规划
1. 动机:消除递归过程中产生的大量重叠子问题
2. 多阶段策略问题利用递归的思想, 把规模为n的问题转化为规模为n-1的问题, 直到转化为可以直接求解的原子问题. 一般情况下, 这样的递归方法的时间复杂度是指数级别的, 但是如果所有不同的子问题的数目是多项式级别的, 那么只需要多项式时间就可以解决这个问题, 这就是动态规划的本质.
3. 算法四个步骤:(1)描述最优解结构(2)状态转移方程(3)bottom-up求解(4)构造最优解(最优分割,最优路径)
在动态规划算法中,每步所作的选择往往依赖于相关子问题的解。因而只有在解出相关子问题后,才能作出选择。
贪心和动态规划的比较:
不同点:(1)动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行;
(2)动态规划能求出问题的最优解,贪心不能保证求出问题的最优解
相同点:动态规划算法或贪心算法都要求问题具有最优子结构性质。