引入
五大常用算法指的是:
- 分治算法
- 动态规划算法
- 贪心算法
- 回溯法
- 分支限界法
算法刷题过程中,经常看到利用这几种算法进行解题,在此列举各算法的基本思想。
1. 分治算法
分治算法是把一个复杂的问题分成两个或更多的相同或相似的子问题,
再把子问题用同样的方式继续划分,直到划分的子问题可以简单求解。
最后把子问题的解合并即可得到原问题的解。
这和递归的概念很吻合,所以分治算法常以递归的方式实现。
常见的有快速排序,归并排序。
2. 动态规划算法
动态规划算法是把一个问题,拆成一个个子问题,直到子问题可以直接解决。
(常常是通过得到一个递推的函数关系式来拆分子问题)
然后把子问题答案保存,以减少重复计算。
最后根据子问题答案反推(自底向上推),得出原问题解的一种方法。
常见的有斐波那契数列,青蛙跳台阶。
3. 贪心算法
贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择。
每做一次贪心选择,就将所求问题简化为一个规模更小的子问题,实现局部最优解。
把每一步的局部最优解进行合成,得到原问题的一个解。
贪心是一种只考虑眼前情况的策略,不能保证最后得到的是最优解,所以使用要注意是否适用。
常见的有购物找零钱
4. 回溯法
回溯法是一种选优搜索法,又称为试探法。该方法可以找到所有满足条件的解。
首先按选优条件向前搜索,尝试能否达到目标。
当探索到某一步时,发现原先选择不是最优或达不到目标,就退回一步重新选择。
这种走不通就退回换条路再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
回溯法常常以深度优先(DFS)方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。
有点穷举的意思,穷举也可以看做一种试探,但回溯法是一种更聪明的穷举。
常见的有八皇后问题,分割回文串
5. 分支限界法
所谓分支就是采用广度优先(BFS)方式依次搜索当前结点的所有分支,也就是所有相邻的结点。
抛弃不满足条件的结点,其余节点加入活结点表。
然后从表中选择一个结点(有策略的选择)作为下一个结点,
继续搜索直至到找到所需的解或活结点表为空时为止。
分支限界法的求解目标则是尽快找出满足条件的一个解,或是在满足条件的解中找出最优解。
常见的有01背包问题,旅行商问题