基本算法2

来源:互联网 发布:jsp和php的区别 编辑:程序博客网 时间:2024/05/21 23:30

    算法的种类很多,解决同一个问题的算法可能有很多种,算法的好坏决定着解决问题的难易程度。一个算法的优劣可以用空间复杂度时间复杂度来衡量。

1.模拟算法:或者谈不上是算法,就是按照题意照着写程序,比如消消乐(http://gzu.acmclub.com/index.php?app=problem_title&id=838&problem_id=26927)还有追牛(http://gzu.acmclub.com/index.php?app=problem_title&id=838&problem_id=27000)等,消消乐只要按照步骤先消去再合并,追牛就让人和牛按照题目描述那样先向北走,转弯,判断是否相遇等。

2.简单搜索:简单枚举,把所有可能情况列举一遍,并判断是不是最后答案。不知道一个数组中的最大值是多少?那就把数组中的数都和第一个数比较一次。补栅栏(http://gzu.acmclub.com/index.php?app=problem_title&id=838&problem_id=26839)和局部最大值(http://gzu.acmclub.com/index.php?app=problem_title&id=838&problem_id=26965)都是简单搜索,把所有数都列举一遍,判断是不是最终答案。

3.深度优先搜索(dfs):深度优先搜索也是搜索算法的一种,也是把所有可能答案都列举一遍,和简单搜索不一样,深度优先搜索算法适用于一类有分支的问题,比如走台阶(http://gzu.acmclub.com/index.php?app=problem_title&id=838&problem_id=26878)问题中,如果想知道走法有哪些,那就要列举所有的走法了,先走一步?或者先走两步?这样的搜索就有了一个分支,深度优先搜索是在搜索树的每一层始终先只扩展一个子节点,不断地向纵深前进直到不能再前进(到达叶子节点或受到深度限制)时,才从当前节点返回到上一级节点,沿另一方向又继续前进(回溯)。这种方法的搜索树是从树根开始一枝一枝逐渐形成的。一般用递归来实现。但是它的效率比较低,在数据规模变大时,这种算法就显得力不从心了。

4.递推算法:求走台阶的走法,如果用搜索算法找出每一种走法,然后把所有走法相加得到总的走法数,这样做很显然效率极低(算法比较:http://gzu.acmclub.com/index.php?app=problem_status&id=838&problem_id=26878)。递推算法的一般做法是先找到一个递推公式,根据递推公式找到一定的规律,最重要的一步是回归,回归可以避免用到递归,大大节约时间和空间,提升算法效率,经典举例:过河卒(http://gzu.acmclub.com/index.php?app=problem_title&id=838&problem_id=26995),根据题意很容易就可以找到递归公式F[m][n]=F[m-1][n]+F[m][n-1];如果直接用这个递归公式算,那就超时了,因此要回归,从F[1][1]到F[1][2]和F[2][1]的走法是1,这样一步一步的推下去,很快就可以找到F[m][n]的走法数了。

5.辗转相除法:求最小公约数和最大公倍数的常用方法。

if(a<b){t=a;a=b;b=t;}while(b!=0){t=a%b;a=b;b=t;}
最大公倍数为a*b/最大公约数

0 0
原创粉丝点击