首页 > 代码库 > 五大算法基本思想—分治,动态规划,贪心,回溯,分支界限

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

一、算法理解

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

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

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


二、算法基本思想


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,需求解决的问题就是在不超过总容量的情况下使总价值最大。

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


三、分治和动态规划小结

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