【20171020】常用经典算法介绍

来源:互联网 发布:mysql索引失效 in or 编辑:程序博客网 时间:2024/04/27 13:40

一、迭代法

常用来求方程或者方程组近似根的一种常用算法设计方法。

具体求根的时候有两种可能的情况:
a.方程无解,那么迭代就会无限循环;
b.方程有解,但是迭代公式选择不当,或者迭代的初始近似根选择不合理,也会导致迭代的失败。

二、穷举法

对可能的解按照某种顺序逐一检验。

三、递推法

利用问题本身所具有的一种递推关系求问题解的一种方法。
例如,要求问题规模为N的解,已知N = 1时候的解,而且也有明显的递推关系,那么就可以层层递推。

四、递归法

递归就是由求规模由N的的解开始,N—>(N - 1)—>…—>2—>1,而且已知N = 1时的解,然后再递推回来,1—>2—>…—>(N - 1)—>N;

满足递归的算法往往有一个特征,每次往前递归都是用相同的方法,而且结束条件就是递归的终点,然后再回溯到N。之前有总结递归,这里就不多说。典型的有斐波那契数列。

五、回溯法

回溯法也称为试探法,该方法将问题的候选解按照某种顺序进行逐一检验,当发现候选解不可能是解的时候就回溯检验下一个候选解。当当前候选解除了不满足问题规模要求外,满足其他所有要求,那就扩大当前候选解的规模,这个过程称为向前试探。

典型问题有n皇后问题、全排列(之前有写在java每日一练里)。

六、贪心算法

贪心法不追求最优解,只希望得到较为满意的方法。贪心法省去了为找到最优解而穷尽所有可能所耗费的大量时间,他常常以当前情况为基础作为最优选择,不考虑整体情况,所以贪心法不需要回溯。

典型的问题有装箱问题、马踏棋盘问题。

七、分治法

基本思想是把大问题分成多个小问题,再由小问题的解方便构造出大问题的解。昨天归纳的归并排序就是用的这个思想。

典型用法有:汉诺塔问题、比赛安排。

八、动态规划法

基本思想是:将大问题分解成子问题,然后从这些子问题的解得到原问题的解。和分治算法不同的是,动态规划法分解得到的子问题往往不是独立的。

步骤:
1.找出最优解的性质,并刻画其结构特征;
2.递归地定义最优解的值;
3.自顶向上的方式计算最优值;
4.根据计算最优值时得到的信息,构造一个最优解。

适合解决的问题:
1.最优子结构。当子问题也有最优解的时候,就存在着最优子结构。
2.重叠子问题。对每个子问题都只计算一次,把解存放在一个需要时就可以查看的表中,而每次查表的时间为常数。

原创粉丝点击