五大算法基本思想—分治,动态规划,贪心,回溯,分支界限

一、算法理解

  算法是什么,即是按照一定的步骤,一步步去解决某个问题,解决问题的方法步骤就称为算法,例如数学中我们学过的做一个运算,解一个方程,等等,都需要有一个清晰的思路,一步步地去完成。可以说算法就在身边。

  算法和计算机有什么关系,计算机它是机器,没有人类的大脑可以思考,但是它怎么完成我们交给他的人物的呢,就是通过算法(当然是人为预先设计好的),计算机解决任何问题都要依赖于算法,没有算法也就没有计算机。

  为了计算机能更好更有效率的运行,算法就必须足够好,既要正确易理解,又要可靠效率。下面来研究经常用到的算法设计。


二、算法基本思想


1、分治法

    分治,分而治之。将一个难以直接解决的大问题,划分成一些规模较小的子问题,以便各个击破,分而治之。

需要注意子问题的两个规则:

1、平衡子问题:就是是各个子问题的规模大致相同

2、独立子问题:各子问题之间相互独立,如果不独立,还需要分解子问题。

例图:


如何分解大问题,计算子问题的解呢?

例:


n>1时,想求得T(n),必须知道T(n-1),以此类推,所以要想求得T(n)就必须将T(n)分解,从最小的子问题开始计算,最终求得T(n),这个过程就是一个递归。

递归技术在在算法设计中经常使用。递归详解


其实分治法就是一个把大的难得问题,分解成小的子问题,解决了小问题,大问题也就不是问题。这就像任务分解一样。


2、动态规划法


    动态规划法和分治法类似,它也是将大问题分解成子问题求解,不同的是,如果分解的子问题有很多是相同的,采用分治法相同的子问题会求解多次,是不是很影响效率;动态规划法呢,它会保存已解决的子问题的答案,再有相同的子问题直接用保存的答案就行了,节省了很多计算时间。

例图:


相同子问题怎么产生的?

例:


解:我们先求F(5)的解,如下,以二叉树的结构表示

    通过二叉树,我们注意到,F(n)是通过计算它的两个重叠子问题 F(n-1)和F(n-2)的形式来表达的,所以,可以设计一张表填入n+1个F(n)的值。通过下面的表会发现:后一个数等于前面两个数的和。(这就是著名的斐波那契数)


所以,使用动态规划法的情况,对于一个问题具有的性质可以总结为:最优子结构,重叠子问题

 

最优性问题

动态规划法通常用于求解最优性问题,这类问题中,可能会有许多可行解,我们希望找出最优的那个。动态规划法就能找出其中的最优解(最优解可能不止一个)。如下图:

从A到C,经过I和II,肯定是AC的最优解。

例:

0-1背包问题

  有5个物品,其重量分别是X{2, 2, 6, 5, 4},价值分别为W{6, 3, 5, 4, 6},背包的容量为10。求选择装入的物品,使装入的物品总价值最大?

  根据问题要求,有一个约束条件是总容量必须<=10,需求解决的问题就是在不超过总容量的情况下使总价值最大。

  具体算法暂时不求了,这里只讲算法的基本思想。


三、分治和动态规划小结

  算法终究是要解决实际问题的,所以通过结合实际问题更能理解每个算法,算法的基础和重点在其思想,当然具体的实现更让人头疼,尤其是数学公式以及代码实现让人晕圈。后面两个算法马上回来。


  • 52
    点赞
  • 285
    收藏
    觉得还不错? 一键收藏
  • 28
    评论
分治法是一种采用递归分解的处理方,将一个规模较大的问题分解成若干规模较小的子问题,再求解子问题,最后合并子问题的解得到原问题的解,其核心思想是将一个大问题分解为几个小问题,再将小问题的解合并为大问题的解。优势是可以大大减少计算量,适用于复杂问题,时间复杂度一般是O(nlog n),空间复杂度一般是O(log n)。应用场合有求解最大子数组、快速排序、归并排序等。贪心法是每一步都采取在当前状态下最好或最优(即最有利)的选择,使最终结果达到最优解的一种算法。它的优势是求解速度快,时间复杂度和空间复杂度都较低,适用于局部最优解,但不能求解全局最优解,常用的应用场合有求解最短路径、求解最小生成树、旅行商问题等。动态规划是一种求解最优解的算法,它的思想是将一个复杂的问题分解成若干个子问题,再从子问题出发求解原问题,并保存子问题的最优解,从而求得原问题的最优解。优势是可以求解全局最优解,时间复杂度和空间复杂度都较低,常用的应用场合有求解最长公共子序列、最优二叉搜索树、背包问题等。回溯法是一种暴力搜索的技术,它搜索空间的所有情况,并从中找出答案,优势是可以求解全局最优解,但时间复杂度较高,常用的应用场合有求解八皇后问题、求解全排列等。分支定界是一种混合算法,它将搜索空间分解成若干子空间,再从子空间中搜索解,优势是可以求解全局最优解,时间复杂度相对较低,常用的应用场合有求解旅行商问题,求解最大团问题等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值