算法思想
递归
递归并不是简单的自己调用自己,也不是简单的交互调用。递归在于把问题分解成规模更小、具有与原来问题相同解法的问题,如二分查找以及求集合的子集问题。这些都是不断的把问题规模变小,新问题与原问题有着相同的解法。但是并不是所有所有可以分解的子问题都能使用递归来求解。一般来说使用递归求解问题需要满足以下的条件:
原文链接:https://blog.csdn.net/yuanmxiang/article/details/52868999
分治法
一个求解规模是O(n)以上的问题,如果问题规模越小,则其执行时间越短。分治法的基本思想和递归一样,将一个问题拆分为若干个求解方式相同的子问题,子问题相互独立而且性质和原问题相同。通过递归将问题拆分为易求的子问题,然后再合并为原问题的解。他是自顶向下的,而递归是自底向上的。
动态规划
通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。
原文:https://www.cnblogs.com/wlw-x/p/12591363.html
贪心算法
贪心算法是一种启发性算法,也就是并非在所有情况下都适用。贪心算法在每个局部阶段都做出当前局部状态的最优解。并且期望每次的局部最优解能够得出一个全局最优解
贪心和动态规划的区别:在dp中,每一步所作出的选择往往依赖相关子问题的解。因而在解出相关子问题之后,才能做出选择。但是贪心算法只需要在当前状态下做出最优选择即可,也就是局部最优解。
回溯法
回溯法具有通用解题法的美称。他在问题的解空间中,按深度搜索策略,从根节点出发搜索解空间树。用它可以系统搜索一个问题的所有解或者任一解。回溯法的基本做法是深度优先搜索,是一种组织得井井有条的、能避免不必要重复搜索的穷举式搜索算法。当我们遇到某一类问题时,它的问题可以分解,但是又不能得出明确的动态规划或是递归解法,此时可以考虑用回溯法解决此类问题。
出处:https://www.cnblogs.com/cy0628/p/13974725.html
分支限界法
类似于回溯法,也是在问题的解空间上搜索问题解的算法。但是分支限界法求解目标和回溯法不一样,回溯法是找出解空间内满足约束条件的所有节,但是分支限界法是找出满足约束条件的一个解,或者是找到满足约束条件的解中极大或者极小解。因此分支限界法使用的是广度优先搜索。
堆排序
1、将带排序的序列构造成一个大顶堆,根据大顶堆的性质,当前堆的根节点(堆顶)就是序列中最大的元素;2、将堆顶元素和最后一个元素交换,然后将剩下的节点重新构造成一个大顶堆;3、重复步骤2,如此反复,从第一次构建大顶堆开始,每一次构建,我们都能获得一个序列的最大值,然后把它放到大顶堆的尾部。最后,就得到一个有序的序列了。
原文链接:https://blog.csdn.net/qq_28063811/article/details/93034625/
基本特征
分治和递归
- 问题规模缩小到一定程度就易于解决。比如解决需要花费O(n2)的问题。
- 问题可以被划分为若干个规模较小的性质相同的子问题
- 各个子问题相互独立
- 子问题可以合并出原来的解
动态规划
- 最优子结构:指的是问题的最优解包含了子问题的最优解。利用最优子结构,可以自底向上地用递归逐步求出子问题的最优解,从而得到整个问题的最优解。
- 重叠子问题:各个子问题之间并非相互独立的,而是有重叠的。而且每次产生的子问题也不总是新问题,而是已经运算过的重复问题。因此,动态规划将每个子问题的结果保存在一张表格中,使得每个子问题只需要运算一次。
- 无后效性:即子问题的解一旦确定,就不再改变,不受在这之后、包含它的更大的问题的求解决策影响。
贪心算法
- 贪心选择性质:指所求的问题可以通过一系列的局部最优解来达到。
- 最优子结构:指的是问题的最优解包含了子问题的最优解
基本步骤
回溯法
- 针对所给定问题,定义问题的解空间;
- 确定易于搜索的解空间结构;
- 以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。