1、20世纪十大算法本世纪初,美国物理学会(American Institute of Physics)和IEEE计算机社团 (IEEEComputer Society)的一本联合刊物科学与工程中的计算发表了由田纳西大学的JackDongarra和橡树岭国家实验室的Francis Sullivan 联名撰写的“世纪十大算法” 一文,该文“试图整理出在20世纪对科学和工程领域的发展产生最大影响力的十大算法” 。作者苦于“任何选择都将是充满争议的,因为实在是没有最好的算法”,他们只好用编年顺序依次列出了这十项算法领域人类智慧的巅峰之作给出了一份没有排名的算法排行榜。有趣的是,该期杂志还专门邀请了这些算
2、法相关领域的“大拿”为这十大算法撰写十篇综述文章,实在是蔚为壮观。本文的目的,便是要带领读者走马观花,一同回顾当年这一算法界的盛举。 1946 蒙特卡洛方法在广场上画一个边长一米的正方形,在正方形内部随意用粉笔画一个不规则的形状,呃,能帮我算算这个不规则图形的面积么?蒙特卡洛(Monte Carlo)方法便是解决这个问题的巧妙方法:随机向该正方形内扔N(N 是一个很大的自然数)个黄豆,随后数数有多少个黄豆在这个不规则几何形状内部,比如说有M个:那么,这个奇怪形状的面积便近似于M/N,N越大,算出来的值便越精确。别小看这个数黄豆的笨办法,大到国家的民意测验,小到中子的移动轨迹,从金融市场的风险分
3、析,到军事演习的沙盘推演,蒙特卡洛方法无处不在背后发挥着它的神奇威力。蒙特卡洛方法由美国拉斯阿莫斯国家实验室的三位科学家John von Neumann(看清楚了,这位可是冯诺伊曼同志!),Stan Ulam 和 Nick Metropolis共同发明。就其本质而言,蒙特卡洛方法是用类似于物理实验的近似方法求解问题,它的魔力在于,对于那些规模极大的问题,求解难度随着问题的维数(自变量个数)的增加呈指数级别增长,出现所谓的“维数的灾难”(Course of Dimensionality)。对此,传统方法无能为力,而蒙特卡洛方法却可以独辟蹊径,基于随机仿真的过程给出近似的结果。最后八卦一下,Mon
4、te Carlo这个名字是怎么来的?它是摩纳哥的一座以博彩业闻名的城市,赌博其实是门概率的高深学问,不是么?1947 单纯形法单纯形法是由大名鼎鼎的“预测未来”的兰德公司的Grorge Dantzig发明的,它成为线性规划学科的重要基石。所谓线性规划,简单的说,就是给定一组线性(所有变量都是一次幂)约束条件(例如a1*x1+ b1*x2+c1*x30),求一个给定的目标函数的极值。这么说似乎也太太太抽象了,但在现实中能派上用场的例子可不罕见比如对于一个公司而言,其能够投入生产的人力物力有限(“线性约束条件”),而公司的目标是利润最大化(“目标函数取最大值”),看,线性规划并不抽象吧!线性规划作
5、为运筹学(operation research)的一部分,成为管理科学领域的一种重要工具。而Dantzig提出的单纯形法便是求解类似线性规划问题的一个极其有效的方法,说来惭愧,本科二年级的时候笔者也学过一学期的运筹学,现在脑子里能想起的居然只剩下单纯形法了不过这不也正说明了该方法的简单和直观么?顺便说句题外话,写过万历十五年的黄仁宇曾说中国的传统是“不能从数目字上管理”,我们习惯于“拍脑袋” ,而不是基于严格的数据做决定,也许改变这一传统的方法之一就是全民动员学习线性规划喔。1950 Krylov子空间迭代法1951 矩阵计算的分解方法50年代初的这两个算法都是关于线性代数中的矩阵计算的,看到
6、数学就头大的读者恐怕看到算法的名字已经开始皱眉毛了。Krylov子空间叠代法是用来求解形如Ax=b 的方程,A是一个n*n 的矩阵,当n充分大时,直接计算变得非常困难,而Krylov方法则巧妙地将其变为Kxi+1=Kxi+b-Axi的迭代形式来求解。这里的K(来源于作者俄国人Nikolai Krylov姓氏的首字母)是一个构造出来的接近于A的矩阵,而迭代形式的算法的妙处在于,它将复杂问题化简为阶段性的易于计算的子步骤。1951年由橡树岭国家实验室的AlstonHouseholder提出的矩阵计算的分解方法,则证明了任何矩阵都可以分解为三角、对角、正交和其他特殊形式的矩阵,该算法的意义使得开发灵
7、活的矩阵计算软件包成为可能。1957 优化的Fortran编译器说实话,在这份学术气息无比浓郁的榜单里突然冒出一个编译器(Compiler)如此工程化的东东实在让人有“关公战秦琼” 的感觉。不过换个角度想想,Fortran这一门几乎为科学计算度身定制的编程语言对于科学家(尤其是数学家,物理学家)们实在是太重要了,简直是他们形影不离的一把瑞士军刀,这也难怪他们纷纷抢着要把票投给了它。要知道,Fortran是第一种能将数学公式转化为计算机程序的高级语言,它的诞生使得科学家们真正开始利用计算机作为计算工具为他们的研究服务,这是计算机应用技术的一个里程碑级别的贡献。话说回来,当年这帮开发Fortran
8、的家伙真是天才只用23500行汇编指令就完成了一个Fortran编译器,而且其效率之高令人叹为观止:当年在IBM 主持这一项目的负责人JohnBackus在数十年后,回首这段往事的时候也感慨,说它生成代码的效率“出乎了所有开发者的想象”。看来作为程序员,自己写的程序跑起来“出乎自己的想象”,有时候还真不一定是件坏事!1959-61 计算矩阵特征值的QR算法呼,又是一个和线性代数有关的算法,学过线性代数的应该还记得“矩阵的特征值” 吧?计算特征值是矩阵计算的最核心内容之一,传统的求解方案涉及到高次方程求根,当问题规模大的时候十分困难。QR算法把矩阵分解成一个正交矩阵(什么是正交矩阵?!还是赶紧去
9、翻书吧!)与一个上三角矩阵的积,和前面提到的 Krylov 方法类似,这又是一个迭代算法,它把复杂的高次方程求根问题化简为阶段性的易于计算的子步骤,使得用计算机求解大规模矩阵特征值成为可能。这个算法的作者是来自英国伦敦的J.G.F. Francis。1962 快速排序算法不少读者恐怕和我一样,看到“快速排序算法”(Quick Sort)这个条目时,心里的感觉是“这可总算找到组织了” 。相比于其他一些对程序员而言高深莫测的数学物理公式,快速排序算法真是我们朝夕相处的好伙伴老板让你写个排序算法,如果你写出来的不是快速排序,你都不好意思跟同事打招呼。其实根本不用自己动手实现, 不论是ANSI C,C
10、+ STL,还是Java SDK,天下几乎所有的SDK里都能找到它的某种实现版本。快速排序算法最早由Tony Hoare爵士设计,它的基本思想是将待排序列分为两半,左边的一半总是“小的”,右边的一半总是“ 大的”,这一过程不断递归持续下去,直到整个序列有序。说起这位Tony Hoare爵士,快速排序算法其实只是他不经意间的小小发现而已,他对于计算机贡献主要包括形式化方法理论,以及ALGOL60 编程语言的发明等,他也因这些成就获得1980 年图灵奖。快速排序的平均时间复杂度仅仅为O(Nlog(N),相比于普通选择排序和冒泡排序等而言,实在是历史性的创举。1965 快速傅立叶变换如果要评选对我们
11、的日常生活影响最大的算法,快速傅立叶变换算法应该是当仁不让的总冠军每天当拿起话筒,打开手机,听mp3,看DVD,用DC拍照 毫不夸张的说,哪里有数字信号处理,哪里就有快速傅立叶变换。快速傅立叶算法是离散傅立叶算法(这可是数字信号处理的基石)的一种快速算法,它有 IBM 华生研究院的James Cooley和普林斯顿大学的John Tukey共同提出,其时间复杂度仅为O(Nlog(N);比时间效率更为重要的是,快速傅立叶算法非常容易用硬件实现,因此它在电子技术领域得到极其广泛的应用。1977 整数关系探测算法整数关系探测是个古老的问题,其历史甚至可以追溯到欧几里德的时代。具体的说:给定组实数X1
12、,X2,.,Xn,是否存在不全为零的整数a1,a2,.an,使得:a 1 x 1 +a 2 x2 + . . . + a n x n 0 这一年BrighamYoung大学的Helaman Ferguson 和RodneyForcade解决了这一问题。至于这个算法的意义嘛,呃,该算法应用于“简化量子场论中的Feynman图的计算”太深奥的学问拉!1987 快速多极算法日历翻到了1987 年,这一年的算法似乎更加玄奥了,耶鲁大学的Leslie Greengard和Vladimir Rokhlin提出的快速多极算法用来计算“经由引力或静电力相互作用的N 个粒子运动的精确计算例如银河系中的星体,或者
13、蛋白质中的原子间的相互作用”,天哪,不是我不明白,这世界真是变得快!所谓浪花淘尽英雄,这些算法的发明者许多已经驾鹤西去。二十一世纪的头五年也已经在不知不觉中从我们指尖滑过,不知下一次十大算法评选的盛事何时再有,也许我们那时已经垂垂老去,也许我们早已不在人世,只是心中唯一的希望里面该有个中国人的名字吧!-如欲平治天下,当今之世,舍我其谁!转帖 二十世纪十大算法2008-10-12 11:03二十世纪七大算法:1946年 蒙特卡洛方法;1951年 矩阵计算的分解方法;19591961年 计算矩阵特征值的 QR算法;1962年 快速排序算法;1965年 快速傅利叶变换算法;1977年 整数关系探测算
14、法;1987年 快速多极算法。下面是二十世纪最好的十大算法:20世纪最好的算法,计算机时代的挑选标准是对科学和工程的研究和实践影响最大。下面就是按年代次序排列的 20世纪最好的 10个算法。1. Monte Carlo方法1946年,在洛斯阿拉莫斯科学实验室工作的 John von Neumann,Stan Ulam 和Nick Metropolis编制了 Metropolis算法,也称为 Monte Carlo方法。Metropolis算法旨在通过模仿随机过程,来得到具有难以控制的大量的自由度的数值问题和具有阶乘规模的组合问题的近似解法。数字计算机是确定性问题的计算的强有力工具,但是对于随机
15、性(不确定性)问题如何当时并不知晓,Metropolis 算法可以说是最早的用来生成随机数,解决不确定性问题的算法之一。2. 线性规划的单纯形方法1947年,兰德公司的 Grorge Dantzig创造了线性规划的单纯形方法。就其广泛的应用而言,Dantzig 算法一直是最成功的算法之一。线性规划对于那些要想在经济上站住脚,同时又有赖于是否具有在预算和其他约束条件下达到最优化的能力的工业界,有着决定性的影响(当然,工业中的“实际”问题往往是非线性的;使用线性规划有时候是由于估计的预算,从而简化了模型而促成的)。单纯形法是一种能达到最优解的精细的方法。尽管理论上讲其效果是指数衰减的,但在实践中该
16、算法是高度有效的它本身说明了有关计算的本质的一些有趣的事情。3. Krylov子空间叠代法1950年,来自美国国家标准局的数值分析研究所的 Magnus Hestenes, Eduard Stiefel和 Cornelius Lanczos开创了 Krylov子空间叠代法的研制。这些算法处理看似简单的求解形为 Ax=b的方程的问题。当然隐藏的困难在于 A是一个巨型的 n*n 矩阵,致使代数解 x=b/A是不容易计算的(确实,矩阵的“相除”不是一个实际上有用的概念)。叠代法诸如求解形为 Kx(k+1)=Kx(k)+b-Ax(k)的方程,其中 K 是一个理想地“接近”A 的较为简单的矩阵导致了 K
17、rylov子空间的研究。以俄罗斯数学家 Nikolai Krylov命名的 Krylov子空间由作用在初始“余量”向量 r(0)=b-Ax(0)上的矩阵幂张成的。当 A 是对称矩阵时,Lanczos 找到了一种生成这种子空间的正交基的极好的方法。对于对称正定的方程组,Hestenes 和 Stiefel提出了称为共轭梯度法的甚至更妙的方法。过去的 50年中,许多研究人员改进并扩展了这些算法。当前的一套方法包括非对称方程组的求解技巧,像字首缩拼词为GMRES和 Bi-CGSTAB那样的算法。(GMRES 和 Bi-CGSTAB分别首次出现于 1986和1992 SIAM journal on S
18、cientific and Statistical computing(美国工业与应用数学学会的科学和统计计算杂志)。4. 矩阵计算的分解方法1951年,橡树岭国家实验室的 A1ston Householder系统阐述了矩阵计算的分解方法。研究证明能把矩阵因子分解为三角、对角、正交和其他特殊形式的矩阵是极其有用的。这种分解方法使软件研究人员能生产出灵活有效的矩阵软件包。这也促进了数值线性代数中反复出现的大问题之一的舍入误差分析问题。 (1961 年伦敦国家物理实验室的 James Wilkinson基于把矩阵分解为下和上三角矩阵因子的积的 LU分解,在美国计算机协会(ACM)的杂志上发表了一篇
19、题为“矩阵逆的直接方法的误差分析”的重要文章。)5. Fortran最优编译程序1957年,John Backus 在 IBM领导一个小组研制 Fortran最优编译程序。Fortran的创造可能是计算机编程历史上独一无二的最重要的事件:科学家(和其他人)终于可以无需依靠像地狱那样可怕的机器代码,就可告诉计算机他们想要做什么。虽然现代编译程序的标准并不过分Fortran I 只包含 23,500 条汇编语言指令早期的编译程序仍然能完成令人吃惊的复杂计算。就像 Backus本人在 1998年在IEEE annals of the History of computing 发表的有关 Fortra
20、n I,II, III 的近代历史的文章中回忆道:编译程序“所产生的如此有效的代码,使得其输出令研究它的编程人员都感到吓了一跳。”6. 矩阵本征值计算的 QR算法195961年,伦敦 Ferranti Ltd.的 J.G. F. Francis找到了一种称为 QR算法的计算本征值的稳定的方法。本征值大概是和矩阵相连在起的最重要的数了,而且计算它们可能是最需要技巧的。把个方阵变换为一个“几乎是”上三角的矩阵意即在紧挨着矩阵主对角线下面的一斜列上可能有非零元素是相对容易的,但要想不产生大量的误差就把这些非零元素消去,就不是平凡的事了。QR 算法正好是能达到这一目的的方法,基于 QR 分解, A 可
21、以写成正交矩阵 Q 和一个三角矩阵 R 的乘积,这种方法叠代地把 A=Q(k)R(k) 变成 A(k+1)=Q(k)R(k) 就加速收敛到上三角矩阵而言多少有点不能指望。20 世纪 60年代中期 QR 算法把一度难以对付的本征值问题变成了例行程序的计算。7. 快速分类法1962:伦敦 Elliott Brothers, Ltd.的 Tony Hoare提出了快速(按大小)分类法.把 n个事物按数或字母的次序排列起来,在心智上是不会有什么触动的单调平凡的事。智力的挑战在于发明一种快速完成排序的方法。Hoare 的算法利用了古老的分割开和控制的递归策略来解决问题:挑一个元素作为“主元”、把其余的元
22、素分成“大的”和“小的”两堆(当和主元比较时)、再在每一堆中重复这一过程。尽管可能要做受到严厉责备的做完全部 N(N-1)/2 次的比较(特别是,如果你把主元作为早已按大小分类好的表列的第一个元素的话!),快速分类法运行的平均次数具有O(Nlog(N) 的有效性,其优美的简洁性使之成为计算复杂性的著名的例子。8. 快速 Fourier变换1965年,IBM 的 T. J. Watson研究中心的 James Cooley以及普林斯顿大学和ATT 贝尔实验室的 John Tukey向公众透露了快速 Fourier变换(方法)(FFT)。应用数学中意义最深远的算法,无疑是使信号处理实现突破性进展的
23、 FFT。其基本思想要追溯到 Gauss(他需要计算小行星的轨道),但是 CooleyTukey的论文弄清楚了 Fourier变换计算起来有多容易。就像快速分类法一样,FFT 有赖于用分割开和控制的策略,把表面上令人讨厌的 O(N*N) 降到令人满意的 O(Nlog(N) 。但是不像快速分类法,其执行(初一看)是非直观的而且不那么直接。其本身就给计算机科学一种推动力去研究计算问题和算法的固有复杂性。9. 整数关系侦查算法1977年,BrighamYoung 大学的 Helaman Ferguson 和 Rodney Forcade提出了整数关系侦查算法。这是一个古老的问题:给定组实数,例如说
24、x(1),x(2),x(n) ,是否存在整数 a(1),a(2),a(n) (不全为零),使得a(1)x(1)+a(2)x(2)+a(n)x(n)=0对于 n=2 ,历史悠久的欧几里得算法能做这项工作、计算 x(1)/x(2) 的连分数展开中的各项。如果 x(1)/x(2) 是有理数,展开会终止,在适当展开后就给出了“最小的”整数 a(1)和 a(2) 。欧几里得算法不终止或者如果你只是简单地由于厌倦计算那么展开的过程至少提供了最小整数关系的大小的下界。Ferguson 和Forcade的推广更有威力,尽管这种推广更难于执行(和理解)。例如,他们的侦查算法被用来求得逻辑斯谛(logistic)
25、映射的第三和第四个分歧点,b(3)=3.544090 和 b(4)=3.564407 所满足的多项式的精确系数。(后者是 120 阶的多项式;它的最大的系数是 25730 。)已证明该算法在简化量子场论中的 Feynman图的计算中是有用的。10. 快速多极算法1987年,耶鲁大学的 Leslie Greengard 和 Vladimir Rokhlin发明了快速多极算法。该算法克服了 N体模拟中最令人头疼的困难之一:经由引力或静电力相互作用的 N个粒子运动的精确计算(想象一下银河系中的星体,或者蛋白质中的原于)看来需要 O(N*N) 的计算量比较每一对质点需要一次计算。该算法利用多极展开(净
26、电荷或质量、偶极矩、四矩,等等)来近似遥远的一组质点对当地一组质点的影响。空间的层次分解用来确定当距离增大时,比以往任何时候都更大的质点组。快速多极算法的一个明显优点是具有严格的误差估计,这是许多算法所缺少的性质。三、结束语2l世纪将会带来什么样的新的洞察和算法?对于又一个一百年完整的回答显然是不知道的。然而,有一点似乎是肯定的。正如 20世纪能够产生最好的 l0个算法一样,新世纪对我们来说既不会是很宁静的,也不会是弱智的。By Barry A. CipraAlgos is the Greek word for pain. Algor is Latin, to be cold. Neither
27、 isthe root for algorithm, which stems instead from al-Khwarizmi, the name of the ninth-century Arab scholar whose book al-jabrwal muqabalah devolved into todays high schoolalgebra textbooks. Al-Khwarizmi stressed the importance of methodical procedures for solving problems. Were he around today,hed
28、 no doubt be impressed by the advances in his eponymous approach.Some of the very best algorithms of the computer age are highlighted in the January/February 2000 issue of Computing in Science the useof linear programming is sometimes dictated by the computational budget.) The simplex method is an e
29、legantway of arriving at optimal answers. Although theoretically susceptible to exponential delays, the algorithmin practice is highly efficientwhich in itself says something interesting about the nature of computation.In terms of widespread use, George Dantzigs simplex method is among the most succ
30、essful algorithms of all time.3.1950: Magnus Hestenes, Eduard Stiefel, and Cornelius Lanczos, all from the Institute for Numerical Analysisat the National Bureau of Standards, initiate the development of Krylov subspace iteration methods.These algorithms address the seemingly simple task of solving
31、equations of the form Ax = b. The catch,of course, is that A is a huge n x n matrix, so that the algebraic answer x = b/A is not so easy to compute.(Indeed, matrix “division” is not a particularly useful concept.) Iterative methodssuch as solving equations ofthe form Kxi + 1 = Kxi + b Axi with a sim
32、pler matrix K thats ideally “close” to Alead to the study of Krylov subspaces. Named forthe Russian mathematician Nikolai Krylov, Krylov subspaces are spanned by powers of a matrix applied to an initial“remainder” vector r0 = b Ax0. Lanczos found a nifty way to generate an orthogonal basis for such
33、a subspace when the matrix is symmetric. Hestenes and Stiefel proposed an even niftier method, known as the conjugate gradient method, for systems that are both symmetric and positive definite. Over the last 50 years, numerous researchers have improved and extended these algorithms.The current suite
34、 includes techniques for non-symmetric systems, with acronyms like GMRES and Bi-CGSTAB. (GMRES andBi-CGSTAB premiered in SIAM Journal on Scientific and Statistical Computing, in 1986 and 1992,respectively.)4.1951: Alston Householder of Oak Ridge National Laboratory formalizes thedecompositional appr
35、oachto matrix computations.The ability to factor matrices into triangular, diagonal, orthogonal, and other special forms has turnedout to be extremely useful. The decompositional approach has enabled software developers to produceflexible and efficient matrix packages. It also facilitates the analys
36、isof rounding errors, one of the bigbugbears of numerical linear algebra. (In 1961, James Wilkinson of the National Physical Laboratory inLondon published a seminal paper in the Journal of the ACM, titled “Error Analysis of Direct Methodsof Matrix Inversion,” based on the LU decomposition of a matri
37、x as a product of lower and uppertriangular factors.)5.1957: John Backus leads a team at IBM in developing the Fortran optimizing compiler.The creation of Fortran may rank as the single most important event in the history of computer programming: Finally, scientists (and others) could tell the compu
38、ter what they wanted it to do, without having to descend into the netherworld of machine code.Although modest by modern compiler standardsFortran I consisted of a mere 23,500 assembly-language instructionsthe earlycompiler was nonetheless capable of surprisingly sophisticated computations. As Backus
39、 himself recalls in a recent history ofFortran I, II, and III, published in 1998 in the IEEE Annals of the History of Computing, the compiler “produced code of such efficiency that its output would startle the programmers who studied it.”6.195961: J.G.F. Francis of Ferranti Ltd., London, finds a sta
40、ble methodfor computing eigenvalues, known as the QR algorithm.Eigenvalues are arguably the most important numbers associated with matricesand they can be the trickiest to compute. Itsrelatively easy to transform a square matrix into a matrix thats “almost” upper triangular, meaning one with a singl
41、e extra set of nonzero entries just below the main diagonal. But chipping away those final nonzeros, without launching an avalanche of error, is nontrivial.The QR algorithm is just the ticket. Based on the QR decomposition, which writes A as the product of an orthogonal matrix Q and an upper triangu
42、lar matrix R, this approach iteratively changes Ai = QR into Ai +1 = RQ, with a few bells and whistles for accelerating convergence to upper triangular form. By the mid-1960s, the QR algorithm had turned once-formidable eigenvalue problems into routine calculations.7.1962: Tony Hoare of Elliott Brot
43、hers, Ltd., London, presents Quicksort.Putting N things in numerical or alphabetical order is mind-numbingly mundane. The intellectual challenge lies in devising ways of doing so quickly. Hoares algorithm uses the age-old recursive strategy of divide and conquer to solve the problem: Pick one elemen
44、t as a “pivot,” separate the rest into piles of “big” and “small” elements (as compared with the pivot), and then repeat this procedure on each pile. Although its possible to get stuck doing all N(N 1)/2 comparisons (especially if you use as your pivot the first item on a list thats already sorted!)
45、, Quicksort runs on average with O(N log N) efficiency.Its elegant simplicity has made Quicksort the pos-terchild of computational complexity.8.1965: James Cooley of the IBM T.J. Watson Research Center and John Tukeyof Princeton University and AT its largest coefficient is 25730.) It has also proved
46、 useful in simplifying calculations with Feynman diagrams in quantum field theory.10.1987: Leslie Greengard and Vladimir Rokhlin of Yale University invent the fast multipole algorithm.This algorithm overcomes one of the biggest headaches of N-body simulations: the fact that accurate calculations of
47、the motions of N particles interacting via gravitational or electrostatic forces (think stars in a galaxy, or atoms in a protein) would seem to require O(N2) computationsone for each pair of particles. The fast multipole algorithm gets by with O(N) computations. It does so by using multipole expansi
48、ons (net charge or mass, dipole moment, quadrupole, andso forth) to approximate the effects of a distant group of particles ona local group. A hierarchical decomposition of space is used to define ever-larger groups as distances increase.One of the distinct advantages of the fast multipole algorithm
49、 is that it comes equipped with rigorous error estimates, a feature that many methods lack.What new insights and algorithms will the 21st century bring? The complete answer obviously wont be known for anotherhundred years. One thing seems certain, however. As Sullivan writes in the introduction to the top-10 list, “The new century is not going to be very restful for us, but it is not going to be dull either!”