算法

一,概述

算法(Algorithm)是指完成一个任务所需要的具体步骤和方法。也就是说给定初始状态或输入数据,经过计算机程序的有限次运算,能够得出所要求或期望的终止状态或输出数据。

算法常常含有重复的步骤和一些比较或逻辑判断。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。

二,算法的历史

“算法”的中文名称出自周髀算经;而英文名称 Algorithm 来自于在数学上提出了算法的9世纪波斯数学家比阿勒·霍瓦里松的名字al-Khwarizmi。原为”algorism”,意思是阿拉伯数字的运算法则,在18世纪演变为”algorithm”。

第一次编写算法是世界上第一位程序员Ada Byron于1842年为巴贝奇分析机编写求解伯努利方程的程序。20世纪的英国数学家图灵提出图灵机抽象模型,解决了算法定义的难题。

三,算法的特征

1, 输入:一个算法必须有零个或多个输入量。

2, 输出:一个算法应有一个或多个输出量,输出量是算法计算的结果。

3, 确定性:算法的描述必须无歧义,以保证算法的执行结果是确定的。

4, 有穷性:算法必须在有限步骤内实现。注:此处“有限”不同于数学概念的“有限”,天文数字般的有限对于实际问题并无意义。

5, 有效性:又称可行性。能够实现,算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现。

四,算法的复杂度

1,算法的时间复杂度:算法的时间复杂度是指算法需要消耗的时间资源。

一般来说,计算机算法是问题规模n 的函数f(n),算法的时间复杂度也因此记做:T(n)=O(f(n))

因此,问题的规模n 越大,算法执行的时间的增长率与f(n) 的增长率正相关,称作渐进时间复杂度(Asymptotic Time Complexity)。

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

3, 非确定性多项式时间(NP):

五,算法的分类

* 基本算法

枚举 搜索

* 深度优先搜索 广度优先搜索

* 启发式搜索 遗传算法

数据结构的算法

数论与代数算法

计算几何的算法

凸包算法 * 图论的算法 哈夫曼编码

树的遍历 最短路径算法

最小生成树算法 最小树形图

网络流算法 匹配算法

动态规划

* 其它

数值分析 加密算法

排序算法 检索算法

随机化算法 关于并行算法,请参阅并行计算一文。

六,算法设计和分析的基本方法

分治法

动态规划

贪心法(亦作饕餮法

七,算法的实现

算法不单单可以用计算机程序来实现,也可以在人工神经网络电路或者机械设备上实现。

例子一:这是算法的一个简单的例子。

我们有一串随机数列。我们的目的是找到这个数列中最大的数。如果将数列中的每一个数字看成是一颗豆子的大小,可以将下面的算法形象地称为“捡豆子”:

# 首先将第一颗豆子放入口袋中。

# 从第二颗豆子开始检查,直到最后一颗豆子。如果正在检查的豆子比口袋中的还大,则将它捡起放入口袋中,同时丢掉原先口袋中的豆子。

# 最后口袋中的豆子就是所有的豆子中最大的一颗。

下面是一个形式算法,用近似于编程语言伪代码表示

给定:一个数列“list",以及数列的长度"length(list)" largest = list[1] for counter = 2 to length(list): if list[counter] > largest: largest = list[counter] print largest

符号说明:

*<i>=</i> 用于表示赋值。即:右边的值被赋予给左边的变量。

*<i>List[counter]</i>用于表示数列中的第<i>counter</i>项。例如:如果<i>counter</i>的值是5,那幺<i>List[counter]</i>表示数列中的第5项。

*<i>⇐</i> 用于表示“小于或等于”。

例子二

求两个自然数的最大公约数

设两个变量 M 和 N

#如果 M < N,则交换 M 和 N

#M 被 N 除,得到余数 R

#判断 R=0,正确则 N 即为“最大公约数”,否则下一步

#将 N 赋值给 M,将 R 赋值给 N,重做第一步。

用“BASIC 代码”表示--

If M < N Then Swap M,N Do While R <> 0 R = M Mod N M = N N = R Loop Print N

形式化算法

算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务,如计算职工的薪水或打印学生的成绩单。

一般地,当算法在处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址供以后再调用。

参见

性能优化的方法和技巧:算法|

假如P=NP,世界将会怎样?|

密码算法语言Cryptol公开发布

量子线性方程算法:Aram Harrow和同事刚刚在预印本网站发表了一篇论文:解决线性方程系统的量子算法PDF)。以下引用格致的介绍:我们现有的量子算法,比如Shor算法,Grover算法大都只能对经典算法作出多项式性的改进,新算法把最好的经典算法效率作出了指数性的提高,把求解稀疏矩阵方程的复杂度由O(n)降低到log(n)。更加重要的是,这是第一个解决了科学和工程中最常见的问题的量子算法。像Shor算法那样破解密码毕竟用途有限。在实际的工程和科研中,我们遇到最多的问题就是解线性方程组,且我们遇到的大部分线性方程组都是稀疏的,维度也非常高。新量子算法将能非常迅速的解决常见的线性方程组。唯一的问题是我们需要一台真正的量子计算机,MTI斯坦福马里兰,现在瞧你们的了。 20世纪十大算法