算法
算法是指完成一个任务准确而完整的描述。也就是说给定初始状态或输入数据,经过计算机程序的有限次运算,能够得出所要求或期望的终止状态或输出数据。 算法常常含有重复的步骤和一些比较或逻辑判断。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。 “算法”的中文名称出自 周髀算经;而英文名称 Algorithm 来自于9世纪波斯数学家比阿勒·霍瓦里松的名字al-Khwarizmi,因为比阿勒·霍瓦里松在数学上提出了算法这个概念。“算法”原为"algorism",意思是阿拉伯数字的运算法则,在18世纪演变为"algorithm"。欧几里得算法被人们认为是史上第一个算法。 第一次编写程序是Ada Byron于1842年为巴贝奇分析机编写求解解伯努利方程的程序,因此Ada Byron被大多数人认为是世界上第一位程序员。因为查尔斯·巴贝奇(Charles Babbage)未能完成他的巴贝奇分析机,这个算法未能在巴贝奇分析机上执行。 因为"well-defined procedure"缺少数学上精确的定义,19世纪和20世纪早期的数学家、逻辑学家在定义算法上出现了困难。20世纪的英国数学家图灵提出了著名的 图灵论题,并提出一种假想的计算机的抽象模型,这个模型被称为图灵机。图灵机的出现解决了算法定义的难题,图灵的思想对算法的发展起到了重要的作用。 输入:一个算法必须有零个或多个输入量。 输出:一个算法应有一个或多个输出量,输出量是算法计算的结果。 确定性:算法的描述必须无歧义,以保证算法的执行结果是确定的。 有穷性:算法必须在有限步骤内实现。注:此处“有限”不同于数学概念的“有限”,天文数字般的有限对于实际问题并无意义。 有效性:又称可行性。能够实现,算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现。 算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务,如计算职工的薪水或打印学生的成绩单。 一般地,当算法在处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址供以后再调用。 算法的时间复杂度 算法的时间复杂度是指算法需要消耗的时间资源。一般来说,计算机算法是问题规模n 的函数f(n),算法的时间复杂度也因此记做 因此,问题的规模n 越大,算法执行的时间的增长率与f(n) 的增长率正相关,称作渐进时间复杂度(Asymptotic Time Complexity)。 算法的空间复杂度 算法的空间复杂度是指算法需要消耗的空间资源。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。 非确定性多项式时间(NP) 算法的实现 算法不单单可以用计算机程序来实现,也可以在人工神经网络、电路或者机械设备上实现。 例子一 这是算法的一个简单的例子。 我们有一串随机数列。我们的目的是找到这个数列中最大的数。如果将数列中的每一个数字看成是一颗豆子的大小,可以将下面的算法形象地称为“捡豆子”: 首先将第一颗豆子放入口袋中。 从第二颗豆子开始检查,直到最后一颗豆子。如果正在检查的豆子比口袋中的还大,则将它捡起放入口袋中,同时丢掉原先口袋中的豆子。 最后口袋中的豆子就是所有的豆子中最大的一颗。 下面是一个形式算法,用近似于编程语言的伪代码表示 给定:一个数列“list",以及数列的长度"length(list)" largest = list[1] for counter = 2 to length(list): if list[counter] > largest: largest = list[counter] print largest 符号说明: = 用于表示赋值。即:右边的值被赋予给左边的变量。 List[counter]用于表示数列中的第counter项。例如:如果counter的值是5,那么List[counter]表示数列中的第5项。 <= 用于表示“小于或等于”。 例子二 求两个自然数的最大公约数 设两个变量 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成立(或称为真)时执行A,否则执行B,不可能两者同时执行,但A或B两个框中可以有一个是空的,即不执行任何操作. 循环结构:在一些算法中,经常会出现从某处开始,按照一定条件,反复执行某一处理步骤的情况,这就是循环结构,反复执行的处理步骤为循环体,它可以细分为两类:直到型循环结构、当型循环结构. 算法的分类 基本算法 枚举 搜索 深度优先搜索 广度优先搜索 启发式搜索 遗传算法 数据结构的算法 数论与代数算法 计算几何的算法 凸包算法 图论的算法 哈夫曼编码 树的遍历 最短路径算法 最小生成树算法 最小树形图 网络流算法 匹配算法 动态规划 其他 数值分析 加密算法 排序算法 检索算法 随机化算法 关于并行算法,请参阅并行计算一文。 [编辑] 参见 计算机科学课程列表 算法 Algorithm 算法是在有限步骤内求解某一问题所使用的一组定义明确的规则。通俗点说,就是计算机解题的过程。在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法。前者是推理实现的算法,后者是操作实现的算法。 一个算法应该具有以下五个重要的特征: 1、有穷性: 一个算法必须保证执行有限步之后结束; 2、确切性: 算法的每一步骤必须有确切的定义; 3、输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定除了初始条件; 4、输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的; 5、可行性: 算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。 算法的设计要求 1)正确性(Correctness) 有4个层次: A.程序不含语法错误; B.程序对几组输入数据能够得出满足规格要求的结果; C.程序对精心选择的、典型的、苛刻的、带有刁难性的几组输入数据能够得出满足规格要求的结果; D.程序对一切合法的输入数据都能产生满足规格要求的结果。 2)可读性(Readability) 算法的第一目的是为了阅读和交流; 可读性有助于对算法的理解; 可读性有助于对算法的调试和修改。 3)高效率与低存储量 处理速度快;存储容量小 时间和空间是矛盾的、实际问题的求解往往是求得时间和空间的统一、折中。 算法的描述 算法的描述方式(常用的) 算法描述 自然语言 流程图 特定的表示算法的图形符号 伪语言 包括程序设计语言的三大基本结构及自然语言的一种语言 类语言 类似高级语言的语言,例如,类PASCAL、类C语言。 算法的评价 算法评价的标准:时间复杂度和空间复杂度。 1)时间复杂度 指在计算机上运行该算法所花费的时间。用“O(数量级)”来表示,称为“阶”。 常见的时间复杂度有: O(1)常数阶;O(logn)对数阶;O(n)线性阶;O(n^2)平方阶 2)空间复杂度 指算法在计算机上运行所占用的存储空间。度量同时间复杂度。 时间复杂度举例 (a) X:=X+1 ; O(1) (b) FOR I:=1 TO n DO X:= X+1; O(n) (c) FOR I:= 1 TO n DO FOR J:= 1 TO n DO X:= X+1; O(n^2) “算法”一词最早来自公元 9世纪 波斯数学家比阿勒·霍瓦里松的一本影响深远的著作《代数对话录》。20世纪的 英国 数学家 图灵 提出了著名的图灵论点,并抽象出了一台机器,这台机器被我们称之为 图灵机 。图灵的思想对算法的发展起到了重要的作用。 算法是 计算机 处理信息的本质,因为 计算机程序 本质上是一个算法,告诉计算机确切的步骤来执行一个指定的任务,如计算职工的薪水或打印学生的成绩单。 一般地,当算法在处理信息时,数据会从输入设备读取,写入输出设备,可能保存起来以供以后使用。 这是算法的一个简单的例子。 我们有一串随机数列。我们的目的是找到这个数列中最大的数。如果将数列中的每一个数字看成是一颗豆子的大小 可以将下面的算法形象地称为“捡豆子”: 首先将第一颗豆子(数列中的第一个数字)放入口袋中。 从第二颗豆子开始检查,直到最后一颗豆子。如果正在检查的豆子比口袋中的还大,则将它捡起放入口袋中,同时丢掉原先的豆子。 最后口袋中的豆子就是所有的豆子中最大的一颗。 下面是一个形式算法,用近似于 编程语言 的 伪代码 表示 给定:一个数列“list",以及数列的长度"length(list)" largest = list[1] for counter = 2 to length(list): if list[counter] > largest: largest = list[counter] print largest 符号说明: = 用于表示赋值。即:右边的值被赋予给左边的变量。 List[counter] 用于表示数列中的第 counter 项。例如:如果 counter 的值是5,那么 List[counter] 表示数列中的第5项。 <= 用于表示“小于或等于”。 算法的分类 (一)基本算法 : 1.枚举 2.搜索: 深度优先搜索 广度优先搜索 启发式搜索 遗传算法 (二)数据结构的算法 (三)数论与代数算法 (四)计算几何的算法:求凸包 (五)图论 算法: 1.哈夫曼编码 2.树的遍历 3.最短路径 算法 4.最小生成树 算法 5.最小树形图 6.网络流 算法 7.匹配算法 (六)动态规划 (七)其他: 1.数值分析 2.加密算法 3.排序 算法 4.检索算法 5.随机化算法 |