美文网首页
算法(1)-算法入门,穷举和递归

算法(1)-算法入门,穷举和递归

作者: tianyl | 来源:发表于2019-03-03 20:22 被阅读0次

概括

对任何编程人员来说,一个永远绕不开的话题就是算法了,虽然有很多人表示,我不是算法工程师,不需要了解这东西。的确,很多时候我们的确用不到太多高深的算法,不过对于很多常用的算法,也许在我们不经意间,就使用到了,只是我们还没注意到而已,所以今天就简单的聊一聊我们程序的算法中,最常用的几种算法中的两种,穷举和递归

算法的定义

在维基百科中,对算法的定义是:在数学(算学)和计算机科学之中,为任何良定义的具体计算步骤的一个序列,常用于计算、数据处理和自动推理。精确而言,算法是一个表示为有限长列表的有效方法。算法应包含清晰定义的指令用于计算函数

算法的特性

如果说某某算法,那么它一定具备几个特性或者标准

  1. 输入:一个算法必须有零个或以上输入量。
  2. 输出:一个算法应有一个或以上输出量,输出量是算法计算的结果。
  3. 明确性:算法的描述必须无歧义,以保证算法的实际执行结果是精确地匹配要求或期望,通常要求实际运行结果是确定的。
  4. 有限性:依据图灵的定义,一个算法是能够被任何图灵完全系统模拟的一串运算,而图灵机只有有限个状态、有限个输入符号和有限个转移函数(指令)。而一些定义更规定算法必须在有限个步骤内完成任务。
  5. 有效性:又称可行性。能够实现,算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现。

时间复杂度和空间复杂度

上述描述了算法的标准,不过,我们日常中对算法的要求可不仅如此,我们经常说的时间复杂度和空间复杂度,就是我们对一个算法的常用标准了,对于这两个概念我们也很好理解,一个是算法所需要的时间,一个是算法所需要的空间

对于一个功能,如果一个算法耗时是10毫秒,一个是100毫秒,我们可能会因为觉得10毫秒和100毫秒对于我们来说都是很短的时间,所以差别不大,但是当计算机在某一时间连续运行这个算法几十甚至上百次,那么我们就能明显的感觉出这两个算法的优劣了

关于时间复杂度和空间复杂度,我们常用一个函数O(n)表示,n代表运行这个算法的次数

穷举和递归

说了算法的一些基础知识,接下来聊聊日常生活中常见的两个算法(当然,这里只说思想,不写代码)

穷举法

穷举法也叫蛮力法,相信很多人也用过这种算法,哪怕是不懂算法的人,也在某些功能中写过这种算法。

穷举法简单的描述,就是在一个可能是问题解的集合内,拿这个集合所有的元素,一个个去尝试,直到获得问题的解或者遍历完这个集合即可

这种算法常用的一个领域就是破解密码方面了,对于一个我们未知的密码,最简单的破译方式就是穷举法,比如对于一个三位数的数字密码,只需要尝试999次就可以破译出来,当然,如果位数太大,或者字母符号的组合太大,那么破译所需要的次数就大大加大了,这时就需要看我们计算机的计算速度了,如果计算机的速度够快(比如国家使用的超级计算机),那么也能够在短时间内破译一个密码

递归法

说完了穷举,再说说递归,简单来说程序调用自身的方法就称为递归,这个算法也是一个非常常见的算法。

例如遍历文件夹,我们需要不断的获取文件夹中子文件夹的信息,然后对于这一个个子文件夹,我们又需要做同样的操作,这样就可以写一个不断调用自身的函数,这种方式就是递归。当然,对于递归,我们需要注意的是,因为这个算法会不断的调用自己,所以如果一个函数调用的次数太多,那么就很容易出现内存溢出,所以在我们使用这个算法时,需要判断大致的调用次数,以避免出现异常。

尾递归

刚才说了递归容易出现内存异常,那么有没有什么好的方式可以避免呢,答案是有的,这种方式叫做尾递归,如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。很多编程语言,对于尾递归这种方式是有做优化的,这种叫做尾递归优化,这样就避免了递归出现的内存溢出,当然并不是所有的编程语言有做这项优化,所有当我们使用递归的时候,需要事先了解我们使用的编程语言是否有尾递归优化

相关文章

网友评论

      本文标题:算法(1)-算法入门,穷举和递归

      本文链接:https://www.haomeiwen.com/subject/ihbmuqtx.html