zoukankan      html  css  js  c++  java
  • 算法

    很多人听到算法会感觉它很深奥,好像很厉害的样子,现在重新来认识算法,在正式认识算法之前开始感性认识算法,首先来看这些网站

    这类网站把它统称为搜索引擎,今天上网输入关键词点搜索,这时搜索引擎就会搜索任何返回一个页面,这个页面上排列各种各样和关键词相关的链接,这种根据关键词返回一组搜索结果的其实就是搜索算法。

    比如我们登陆QQ时,肯定要输入QQ密码,如果密码在网上直接传输的话就非常危险,这是需要对密码加密再进行传输,这时用的就是加密算法。

     再比如现在的数码相机,包括手机,在拍照时有了人脸识别功能,也就是说在拍照时有人脸的地方就会自动出现一个方框,这个其实也是一种算法,可以叫它人脸识别算法。

     

     虽然要使用算法就要写程序,但是算法和程序之间并不是划等号的,算法好比一个菜谱,而程序就好比做好的菜。

     了解了算法不等于程序之后,我们把算法写成程序,它和普通程序也是有区别的。接下来看算法区别于普通程序的5大特征。

     1、无论是什么算法,都要有一个输出结果

     2、通常来说一个算法的输入不同,它的输出也会不同;对于发杂的算法,提供的信息越详细越准确那么输出的结果就越接近想要的。

     还有一种比较极端的情况,有的算法不需要输入,比喻计算圆周率。

    3、有穷性

     4、这个算法是可以运行的,可以写成程序的,运行后产生结果的

     5、确定性,算法并不是指某一种计算机语言具体的代码,而是一种描述,像菜谱一样的,它是一系列的执行步骤,看了这种算法的执行步骤你可以根据你想要的语言来写成你这个语言的代码,所以这就要求算法的每一步都是确定的不能有歧义的。只有这样才能让不同语言的程序员对同一个算法有相同的理解,这就是确定性。一般标准来说为了实现这种确定性, 往往会使用程序流程图或伪代码这样些工具来写算法,以保证每个步骤都是确定的。

    同样一个问题,不同人编写出来的算法也是有好坏之分的。有的算法效率比较高有的算法效率比较低,为了科学的比较算法效率高低引入了算法复杂度,算法复杂度分为时间复杂度和空间复杂度两个方面。

     

     虽然是时间复杂度,并不要真的测量一个算法执行要多少时间。举个例子,比喻一个算法执行花了2秒时间,那么这个两秒是在世界上最快的计算机上执行花了两秒还是在一台老古董计算机上执行花了2秒呢?显然硬件对于算法的执行影响也是非常大的,再加上所谓的摩尔定律(硬件每18个月效率就翻一番),这样绝对时间就更不可靠了。所以在算法复杂度里面用,算法执行了多少次基本语句的次数来作为它的衡量标准。

    这样拿到一个算法后就不需要去执行它,只要看看它的原理,看看它的代码就知道时间复杂度是多少了。事实上在真实环境中,绝大多数的算法都是有输入的。比喻排序算法,排一百个数字所要的时间肯定要比排一万个数字所要的时间要小。所以说算法复杂度时都会把问题规模带着说,比喻一个问题规模为n的话,它执行了2n+5次基本语句,对于这样把它算法复杂度记为O(n),也就是说算法复杂度没有那么精确,只需要记最大的数量级就可以了。不同数量级画成曲线后它的增长是不一样的,所以只看最高的数量级就可以判断哪个增长快哪个增长慢了。

     

    现在我们把常见算法复杂度按照由小到大,也就是从快到慢排列。最小是1也就是常数,不管你的问题规模有多大它的执行时间都是一样的;接下来再大一点是n对数,这里面把底数写为2也可以是其它数都表示对数这个数量级;接下来是n表示的是线性复杂度;接下来是对数*n;接下来是平方,这里平方指泛指立方4次方都表示同一数量级;下面2^n,这里的2也是泛指;接下来是阶乘。

     有了时间复杂度,空间复杂度就好理解了。既然时间复杂度指算法执行过程中的时间开销,空间复杂度就指算法执行过程中的空间开销。

     

     在实际设计算法时,时间复杂度和空间复杂度往往是可以相互转化的,很多时候要把时间复杂度提升到极限都要牺牲空间复杂度,用空间换取时间。举个例子,比喻想在电脑里面找一个文件,有时会发现找了十几分钟都找不到文件,但是在搜索引擎里面输入一个关键词,它是瞬间的不到0.1秒就给一个结果,为什么这么快呢?实际上是搜索引擎缓存的效应,它事先把你要搜索的结果,那些网页全部都缓存到自己的服务器当中,当你去搜索时它直接去缓存里面调出你想要的的结果。

    所以你下次用搜索引擎搜索什么东西时,那零点几秒的时间是一个想农场一样的服务器集群换来的,所以它的空间复杂度非常高,算法复杂度非常低。这只是我们说设计算法的一种策略,并不是说牺牲了空间就一定能换出时间,具体问题具体分析。

  • 相关阅读:
    windows下 php-cgi.exe 0xc000007b 错误 阿星小栈
    call to undefined function openssl cipher iv length() 报错 PHP7开启OpenSSL扩展失败 阿星小栈
    PHP json_encode返回的json前端获取时出现unicode转码和反斜杠导致无法解析的解决办法
    Warring:POST Content-Length of 625523488 bytes exceeds the limit of 8388608 bytes in Unknown on line 0 阿星小栈
    PHP数组分割成新数组 阿星小栈
    Laravel ajax请求419错误及解决办法(CSRF验证) 阿星小栈
    MySQL said: Authentication plugin 'caching_sha2_password' cannot be loaded... 阿星小栈
    Laravel框架发送邮件 阿星小栈
    PHP 导出Excel三种方式 阿星小栈
    mysql命令 出现ERROR 1054 (42S22): Unknown column 'password' in 'field list'
  • 原文地址:https://www.cnblogs.com/djlindex/p/12120467.html
Copyright © 2011-2022 走看看