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

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

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

  2. 常见算法分类

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

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

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

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

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

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

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

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

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

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

3.常见算法之间的区别

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

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

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

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

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

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

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

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

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

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

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

4.解决问题的思路

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

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

时间: 2024-10-10 14:45:33

算法的设计基本方法的理解的相关文章

Atitit.编程语言原理---方法重载的实现与设计 调用方法的原理

Atitit.编程语言原理---方法重载的实现与设计 调用方法的原理 1. 重载包括:普通方法的重载和构造方法的重载 1 1.1. 横向重载”和“纵向重载”1 1.2. 方法签名通过  方法名称,参数数量,参数类型+返回类型 参数顺序(命名参数)来组成1 1.3. 重载(重新载选方法流程,如下图所示2 2. 重载的实现方法::argus参数 vs  默认值.可选参数法 可选参数3 2.1. __call()函数是php类的默认魔法函数 3 2.2. Java通过反射调用方法重载 执行方法4 2.

EM算法学习笔记2:深入理解

文章<EM算法学习笔记1:简介>中介绍了EM算法的主要思路和流程,我们知道EM算法通过迭代的方法,最后得到最大似然问题的一个局部最优解.本文介绍标准EM算法背后的原理. 我们有样本集X,隐变量Z,模型参数θ,注意他们3个都是向量,要求解的log似然函数是lnp(X|θ),而这个log似然函数难以求解,我们假设隐变量Z已知,发现lnp(X,Z|θ) 的最大似然容易求解. 有一天,人们发现引入任意一个关于隐变量的分布q(Z),对于这个log似然函数,存在这样一个分解: lnp(X|θ)=L(q,θ

基于mindwave脑电波进行疲劳检测算法的设计(5)

时隔两个多月了,前段时间在弄Socket,就没有弄这个了.现在好了,花了几天的时间,终于又完成了一小部分了.这一小节主要讲α,β,δ,θ等等波段之间的关系.废话不多说,直接给出这几天的成果. 上一次,我们分析了attention(专注度)和meditation(冥想度)与疲劳之间的关系.如下图 上面的曲线上一小节已经简单说明了,现在要说明的是曲线的前半部分是普通测试,后面一小段两对线有点分离的部分是模拟闭眼休息状态,全身放轻松.从图中可以看出是否精神集中从专注度和冥想度是可以简单的看出来了. 接

基于Hama平台的并行Finding a Maximal Independent Set 算法的设计与实现

作者:白松 西工大研究生.转载请注明出处:http://blog.csdn.net/xin_jmail/article/details/32101483. 本文参加了2014年CSDN博文大赛,如果您觉得此文对您有所帮助,就请为我投上您宝贵的一票,不胜感激.投票地址:http://vote.blog.csdn.net/Article/Details?articleid=32101483 . 本文目的:讲解并行Finding a Maximal Independent Set(寻找最大独立集问题)

UCenter密码算法规则和生成方法

如果想平滑的使用UCenter,那么这篇文章务必 康盛的系列产品,包括Discuz.UCHome.Supesite都集成了同一个用户系统--UCenter,用户登录的密码也保存在 UCenter中,对于其他系统集成或导出数据到UCenter系统,通常会遇到密码生成的问题,这里就讨论一下UCenter的用户密码算法规则和生成 方法. 密码通常使用MD5对用户密码HASH 后保存在数据库中的方法,如果黑客拿到了这个HASH数值,那么可以采用字典的方式暴力破解,如果这个字典数据库足够大,并且字典比较符

算法数据结构面试分享(一)- 解决算法问题的一般方法

先看一道题目: 给你一个整型数组,我想找出来最大的两个数,能帮我写一个算法吗?     拿到这个题目,大家会怎么想到用什么方法解决吗?我见过很多同学的回答是,先排序,取最大的两个数就好了.那么接下来我们的问题就变成了如何给这个整型数组排序了.我们有很多种方法,冒泡排序,快速排序等等.很有可能面试官就让你开始写具体的排序算法了.当然,有些有经验的同学可能会说了,排序我直接调用sort方法就好了哈.  其实,这两种情况都没有对错之分,只是没有敲开面试官的心扉,也没有给人眼前一亮,让自己脱颖而出. 再

以网游服务端的网络接入层设计为例,理解实时通信的技术挑战

本文参考并引用了部分腾讯游戏学院的相关技术文章内容,感谢原作者的分享. 1.前言 以现在主流的即时通讯应用形态来讲,一个完整的即时通讯IM应用其实是即时通信(英文简写:IM=Instant messaging)和实时通信(英文简写:RTC=Real-time communication)2种技术组合在一起的一整套网络通信系统.之所以以IM这个简写代称整个即时通讯软件,其实是历史原因了(因为早期的诸如ICQ这样的即时通讯工具,也就是文字聊天,并没有加入实时音视频这样的实时通信技术),对这个话题有兴

算法只是对问题求解方法的一种描述,它不依赖于任何一种语言

算法是独立存在的一种解决问题的方法和思想. 对于算法而言,实现的语言并不重要,重要的是思想. 算法可以有不同的语言描述实现版本(如C描述.C++描述.Python描述等). 算法的五大特性 输入: 算法具有0个或多个输入 输出: 算法至少有1个或多个输出 有穷性: 算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成 确定性:算法中的每一步都有确定的含义,不会出现二义性 可行性:算法的每一步都是可行的,也就是说每一步都能够执行有限的次数完成 -----------

对Vue.js $watch方法的理解

博主最近对着vue.js的官方教程在自学vue.js,博主自幼愚钝,在教程中真的是好多点都不太理解,接下来要说的这个$watch方法就是其中一个不太理解的点了.咱们先来看一下对于$watch方法在vue.js的API中是怎么解释的吧:观察 Vue 实例变化的一个表达式或计算属性函数.回调函数得到的参数为新值和旧值.表达式只接受监督的键路径.对于更复杂的表达式,用一个函数取代.官方示例: 1 // 键路径 2 vm.$watch('a.b.c', function (newVal, oldVal)