zoukankan      html  css  js  c++  java
  • Algorithm——何为算法?

    摘自:https://zh.wikipedia.org/wiki/算法

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

      算法中的指令描述的是一个计算,当其运行时能从一个初始状态和初始输入(可能为空)开始,经过一系列有限而清晰定义的状态最终产生输出并停止于一个终态。一个状态到另一个状态的转移不一定是确定的。随机化算法在内的一些算法,包含了一些随机输入。

      算法的核心是创建问题抽象的模型和明确求解目标,之后可以根据具体的问题选择不同的模式和方法完成算法的设计。

      简而言之,算法就是用来解决一个特定任务的一系列步骤.

      一个有效的算法包含五个重要特性:

    • 输入项(Input):必须有零个或以上的输入
    • 输出项(Output):应有一个或以上输出量,输出量是算法计算的结果。
    • 有限性(Finiteness):如果你设计的算法永无休止地尝试解决问题,那么它是无用的。
    • 明确性(Definiteness):算法的每一步都必须准确定义,在任何场景下指令都应当没有歧义。
    • 有效性(Effectiveness):又称可行性。一个算法被设计用以解决某个问题,那么它就应当能解决这个问题,并且仅仅使用纸和笔就能证明该算法是收敛的。

      还有一个要点需要知道,算法不仅仅应用在计算机科学,同时也在数学领域中使用。实际上,计算机科学中的算法是由数学模型推导而成的,

      算法在中国古代文献中称为“术”,最早出现在《周髀算经》、《九章算术》。要说到最早的算法,就要追朔到公元前300年欧几里得《几何原本》中的辗转相除法。

    算法的评定

       同一个问题有多种解法,而一个算法的质量的优劣将影响算法的速度,算法评定用于选择最优算法。一个算法的评定主要有时间复杂度空间复杂度去考虑。

    时间复杂度

      算法的时间复杂度就是指算法完成所需要消耗的时间。一般来说,计算机算法是问题规模n 的函数f(n),算法的时间复杂度也因此记做

      算法执行时间的增长率与f(n) 的增长率正相关,称作渐近时间复杂度(Asymptotic Time Complexity),简称时间复杂度。

      常见的时间复杂度有:常数阶O(1),线性阶O(n),对数阶O(logn),线性对数阶O(n logn),指数阶O(nk)……随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。

      也有一种特殊的时间复杂度,叫做非确定性多项式时间(NP),所谓的非确定性是指:用极大的数量去解决来达成多项式时间解决的问题。有一个典型的例子,就是输出n个元素的全排列,是一个NP-hard问题(有兴趣的可以查看NP(复杂度))。

    空间复杂度

      算法的空间复杂度是指算法需要消耗的内存空间。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。

    个人见解

      个人认为,算法的核心它的思想。从问题中寻找关键点,制定解决方案,最后到优化这一系列步骤中都是有选择的。大部分刚开始学算法的技术人员,似乎都觉得在实际中没有什么用处。但实际上,大部分算法之间是有关联的。

      例如堆排序与二分查找,都是由一次判断而排除了一些的不可能成立或不需要的判断。举个例子,当TestA()成立时TestB()TestC()才有可能成立,那么当TestA()不成立时,TestB()TestC()就可以跳过不判断了,这就是减少了赘余的判断了。

      所以遇见毫无思路的题目,不是把每一种算法都想一遍,看看是否适用,而是用纸把常规的解题方法写下,或者暴力的方法,寻找其中的规律,再套用算法,才是学会算法。

  • 相关阅读:
    JAVA正则表达式判断元音
    JAVA正则表达式校验qq号码
    方法
    数组
    Java基础随笔3
    LDA背景资料
    scrapy系列(四)——CrawlSpider解析
    scrapy系列(三)——基础spider源码解析
    scrapy系列(二)——startproject、genspider创建项目与模板使用
    我眼中的机器学习(四) 快速寻找最优解
  • 原文地址:https://www.cnblogs.com/Bita/p/6501454.html
Copyright © 2011-2022 走看看