算法是什么,即是按照一定的步骤,一步步去解决某个问题,解决问题的方法步骤就称为算法,例如数学中我们学过的做一个运算,解一个方程,等等,都需要有一个清晰的思路,一步步地去完成。可以说算法就在身边。
算法和计算机有什么关系,计算机它是机器,没有人类的大脑可以思考,但是它怎么完成我们交给他的人物的呢,就是通过算法(当然是人为预先设计好的),计算机解决任何问题都要依赖于算法,没有算法也就没有计算机。
为了计算机能更好更有效率的运行,算法就必须足够好,既要正确易理解,又要可靠效率。下面来研究经常用到的算法设计。
分治,分而治之。将一个难以直接解决的大问题,划分成一些规模较小的子问题,以便各个击破,分而治之。
需要注意子问题的两个规则:
1、平衡子问题:就是是各个子问题的规模大致相同
2、独立子问题:各子问题之间相互独立,如果不独立,还需要分解子问题。
例图:
如何分解大问题,计算子问题的解呢?
例:
当n>1时,想求得T(n),必须知道T(n-1),以此类推,所以要想求得T(n)就必须将T(n)分解,从最小的子问题开始计算,最终求得T(n),这个过程就是一个递归。
递归技术在在算法设计中经常使用。递归详解
其实分治法就是一个把大的难得问题,分解成小的子问题,解决了小问题,大问题也就不是问题。这就像任务分解一样。
动态规划法和分治法类似,它也是将大问题分解成子问题求解,不同的是,如果分解的子问题有很多是相同的,采用分治法相同的子问题会求解多次,是不是很影响效率;动态规划法呢,它会保存已解决的子问题的答案,再有相同的子问题直接用保存的答案就行了,节省了很多计算时间。
例图:
相同子问题怎么产生的?
例:
解:我们先求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,需求解决的问题就是在不超过总容量的情况下使总价值最大。
具体算法暂时不求了,这里只讲算法的基本思想。
算法终究是要解决实际问题的,所以通过结合实际问题更能理解每个算法,算法的基础和重点在其思想,当然具体的实现更让人头疼,尤其是数学公式以及代码实现让人晕圈。后面两个算法马上回来。
五大算法基本思想—分治,动态规划,贪心,回溯,分支界限,布布扣,bubuko.com
原文地址:http://blog.csdn.net/akkzhjj/article/details/25337655