首页 > 代码库 > 算法的设计基本方法的理解

算法的设计基本方法的理解

  1. 算法设计基本方法有什么好处?

    了解常见的算法设计方法以及它们之间的区别,有利于构建算法思维的广度,有充分的理论知识。当然,如果算法思维的深度再好的话,将来你见识的算法越多,天下之间所有的算法,都会融入到你的理论和实践当中。

  2. 常见算法分类

    穷举法(暴力法,蛮力法)它的基本思想是分别列出所有各种可能解,测试其是否满足条件,若是则输出。

    回溯法:有通用的解题法之称,是一种将问题的所有解组织的仅仅有条,能避免不必要的穷举搜索,采用的思维是,深度遍历,中间再加两个约束条件和限界函数,不行就回溯,转其他结点,继续深度优先。

    递推法:分为两种,一种是顺推,另外一种是逆推,都是根据已知条件,推导出未知条件。

    迭代法辗转法):是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法,即一次性解决问题。迭代法又分为精确迭代和近似迭代。“二分法”和“牛顿迭代法”属于近似迭代法。迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。迭代法常常用于求方程或方程组近似根,在设计迭代式时,要特别注意收敛问题,对于非收敛的式子不能用作迭代式。

        递归法:是指在定义自身的同时又出现了对自身的调用,在一个函数内直接调用自己,则称为直递归函数,如果函数经过一系列调用的语句,通过其他函数间接调用自己,则其称为间接递归。不断的通过将一个大问题,转化为一个规模小的问题,将规模小的问题,在转换成更规模小的问题,递归有时候可以理解成嵌套中的嵌套。小问题,解决好了,向上返回结果,通常在递归的时候,有递归和非递归说法,非递归需要借助栈。递归法是很多其他高级算法的基础。

        分治法就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

        贪婪法:总是做出在当前看来最好的选择,也就是说,贪心算法并不从整体最优考虑,它所做的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的,虽然贪心算法不能对所有问题得到整体最优解,但对许多问题能产生整体最优解。

        动态规划法:动态规划法与分治法和回溯法都有某些类似,也是基于问题的划分解决(多步决策,递增生成子解)的。但是在递增生成子解的过程中,力图朝最优方向进行,而且也不回溯。因此动态规划法效率更高,且常用来求最优解,而不像回溯法那样可直接求全解。

只从过程来看,可以简单地把动态规划法看做是回溯法去掉了回溯(这个可以容易理解)或者严格迭代分治法。这个怎么理解,也就是说,把一个问题的解决分成多个步骤(分治法),每个步骤都是在前面的步骤基础上,得到一个新的子解,字解随着步骤的进行,进而逐步扩大,最后一步得到完整的解。

       模拟法:通常都是利用随机函数来模拟自然界中发生的不可预测的情况。Java中random,c中srand

3.常见算法之间的区别

    1)分治法和动态规划算法的区别

    动态规划算法在遇到重叠子问题显示出了相当大的优势,如果这个问题没有重叠子问题,可以考虑分治法,如果有重叠子问题,动态规划算法效率更高。

   2)贪心发和动态规划法的区别

     个人感觉贪心发是动态规划算法的一个特例,都具有最优子结构特征。

   3)回溯法和穷举法的区别

      都是生成解空间,回溯法一般主要用来解决三类问题(子集问题,排列问题,组合问题)回溯法,多了约束条件和限界条件,因此避免了无谓的搜索。

  4)回溯法和递归法的区别?

 

  5)动态规划和贪心算法以及回溯法的区别

,这些方法所要解决的问题,一般都是决策问题。而贪心法一般是来求解最优问题的,而且他们其实都是在对问题的状态空间树进行搜索,在这个状态空间树中搜索最佳的路径以便求出最优策略。而贪心法是从上到下只进行深度搜索的,也就是说它是一口气走到黑的,一口气吃成胖子的,它的代价取决于子问题的数目,也就是树的高度,每次在当前问题的状态上作出的选择都是1,也就是说,它其实是不进行广度搜索的,这也造成了它的一个缺点:它得出的解不一定是最优解,很有可能是近似最优解。

动态规划法在最优子结构的前提下,从状态空间树的叶子节点开始向上进行搜索,并且在每一步都根据叶子节点的当前问题的状况作出选择,从而作出最优决策,所以她的代价就是子问题的个数和可选择的数目,所以它求出的解一定是最优解。

相比回溯法它它去掉了回溯的过程,因而效率较高。

4.解决问题的思路

 1.如果这个问题不好求得,就将其转换成另外一个问题,比如数学当中的往往求最优化问题,将其转化为对偶问题,计算机中,交通灯问题,将其转换成图的找色问题。最短路径问题,转换成借电脑问题;你要班级中借5台电脑,你肯定将你关系好的人,排个序,然后从最好的人去接,第二步就是将你第二关系好的人,和让你第一关系好多人帮你借电脑,第三就是让你第三关系好的人和你第二关系好的人和他关系好的人以及他的第二关系好的人去向他第一个关系好的人借电脑。

2.如果这个问题可以容易解,那就可以使用很多种方法去解。

本文出自 “简答生活” 博客,谢绝转载!

算法的设计基本方法的理解