博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Algorithm——何为算法?
阅读量:5327 次
发布时间:2019-06-14

本文共 1591 字,大约阅读时间需要 5 分钟。

摘自:

  在数学和计算机科学/算学之中,算法/演算法/算则法(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问题(有兴趣的可以查看)。

空间复杂度

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

个人见解

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

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

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

转载于:https://www.cnblogs.com/Bita/p/6501454.html

你可能感兴趣的文章
Linux 的 date 日期的使用
查看>>
PHP zip压缩文件及解压
查看>>
SOAP web service用AFNetWorking实现请求
查看>>
Java变量类型,实例变量 与局部变量 静态变量
查看>>
mysql操作命令梳理(4)-中文乱码问题
查看>>
Python环境搭建(安装、验证与卸载)
查看>>
一个.NET通用JSON解析/构建类的实现(c#)
查看>>
Windows Phone开发(5):室内装修 转:http://blog.csdn.net/tcjiaan/article/details/7269014
查看>>
详谈js面向对象 javascript oop,持续更新
查看>>
关于这次软件以及pda终端的培训
查看>>
jQuery上传插件Uploadify 3.2在.NET下的详细例子
查看>>
如何辨别一个程序员的水平高低?是靠发量吗?
查看>>
新手村之循环!循环!循环!
查看>>
正则表达式的用法
查看>>
线程安全问题
查看>>
SSM集成activiti6.0错误集锦(一)
查看>>
下拉刷新
查看>>
linux的子进程调用exec( )系列函数
查看>>
MSChart的研究
查看>>
C# 索引器
查看>>