一、暴力穷举法

  穷举法简单粗暴,没有什么问题是搞不定的,只要你肯花时间。同时对于小数据量,穷举法就是最优秀的算法。

二、贪心算法

  利用局部最优解当作是问题的答案,只要找到符合条件的其中一种情况, 同时该解并不一定是全局最优解。每一步都将最好的结果保存起来,结合起来作为最终答案。

三、分治算法

  分治算法是将一个大问题,分解为若干的子问题,并且每个子问题之间没有交集,相互独立,所有子问题的答案组合起来构成大问题的解答。分支算法的实现方式采用递归实现。
  例如二分查找、快速排序和归并排序算法: https://blog.csdn.net/zhanghan950523/article/details/106088056.

  1. 二分查找:将问题逐步分为两个子问题,并且子问题将互不相关。搜索的深度为logn
  2. 快速排序:通过递归的方法,将问题分为左右两个待排序子序列,并且子序列之间无关。如图中所示:
    几种常用算法的整理和思考分析  图中的二叉树深度平均为log2n,因此递归的深度为log2n,同时每一行需要进行数组元素大小判断,如第二行分为两半,左边需要判断n/2个元素,右边也需要判断n/2个元素,同理每行加起来,都为n个元素,因此整体算法时间复杂度为nlog2n,空间复杂度为树高度。
  3. 归并排序:归并排序同理也是逐步分为两个子序列,然后merge,因此递归的方法,是分支算法的实现方式。

3.1、递归方法

  递归算法的步骤:主要分为以下四步:

  1. 确定递归函数的主要功能:函数func()的主要完成了什么内容,因为每一次递归进来,除了数据的数量级不同,其他处理的逻辑都完全相同;
  2. 首先确定递归入口的边界条件:递归函数为了避免成为死循环,需要有递归结尾,即为函数func()的边界条件,一般情况下是根据函数功能,设置边界0和1的情况返回值为多少。
  3. 根据任务要求,写好递归的推导公式:例如斐波那契,则可以得到递归的推导为f(n) = f(n-1) + f(n-2)。
  4. 将上述思路转变成代码:根据推导公式和边界条件,写出代码。
    几种常用算法的整理和思考分析
      分析图中的时间复杂度:递归的深度一共进行到了F(0)的位置,因此深度为n。同时假设每个F(n)的处理只需要O(1),每行的个数为20,21,22,…,2n(共n行),则时间复杂度为等比数列的通项公式和。a1(1-qn)/(1-q),其中q为2,可以算出,递归的时间复杂度为2n

3.2、递归特定

  递归处理需要压栈,所需的时间复杂度高,空间复杂度也高,因此可以进行优化,例如尾递归的方法。
  由于分治算法解决的问题主要是不相管的子问题,因此不会存在子问题重复计算的情况。如果分割的子问题存在重复的计算,则可以进行优化,例如可以用备忘录的方式,将已经算过的值保,这就可以引出动态规划的算法了。动态规划是为了解决分割的子问题存在重复计算的情况,将每次的计算结果保存下来。因此动态规划是分治的特例,即分治可以解决所有动态规划问题,只是时间复杂度高。

四、动态规划算法

  动态规划是分治的特例,将每次的计算结果保留下来,供后续的计算使用。具体实现是将分治算法的递归处理(高时间复杂度,高空间复杂度),改为了动态规划的递归处理(低时间复杂度,低空间复杂度只需保存状态)。带来的代价为动态规划的思路较分治而言会稍微复杂一些,即思维上的灵活,可以带来工作量的减少!!!

当最优化问题具有重复子问题和最优子结构的时候,就是动态规划出场的时候了。动态规划算法的核心就是提供了一个memory来缓存重复子问题的结果,避免了递归的过程中的大量的重复计算。动态规划算法的难点在于怎么将问题转化为能够利用动态规划算法来解决。当重复子问题的数目比较小时,动态规划的效果也会很差。如果问题存在大量的重复子问题的话,那么动态规划对于效率的提高是非常恐怖的。就像斗转星移武功,对手强它也会比较强,对手若,他也会比较弱。
具体的详细解析请参见下面的文章:
http://blog.csdn.net/changyuanchn/article/details/51420028
http://blog.csdn.net/changyuanchn/article/details/51429979

五、回溯算法

回溯算法是深度优先策略的典型应用,回溯算法就是沿着一条路向下走,如果此路不同了,则回溯到上一个
分岔路,在选一条路走,一直这样递归下去,直到遍历万所有的路径。八皇后问题是回溯算法的一个经典问题,还有一个经典的应用场景就是迷宫问题。
具体的详细解析请参见下面的文章:
http://blog.csdn.net/changyuanchn/article/details/17354461

六、分支限界算法

回溯算法是深度优先,那么分支限界法就是广度优先的一个经典的例子。回溯法一般来说是遍历整个解空间,获取问题的所有解,而分支限界法则是获取一个解(一般来说要获取最优解)。
具体的详细解析请参见下面的文章:
http://blog.csdn.net/changyuanchn/article/details/17102037

相关文章:

  • 2022-12-23
  • 2021-11-30
  • 2021-06-06
猜你喜欢
  • 2021-05-30
  • 2021-05-14
  • 2021-11-28
  • 2021-05-09
  • 2021-06-16
相关资源
相似解决方案