20世纪十大算法

合集下载

20世纪十大算法(英文版)

20世纪十大算法(英文版)

1from SIAM News , V olume 33, Number 4By Barry A. CipraAlgos is the Greek word for pain. Algor is Latin, to be cold. Neither is the root for algorithm , which stems instead from al-Khwarizmi, the name of the ninth-century Arab scholar whose book al-jabr wa’l muqabalah devolved into today’s high school algebra textbooks. Al-Khwarizmi stressed the importance of methodical procedures for solving problems. Were he around today,he’d 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 & Engineering , a joint publication of the American Institute of Physics and the IEEE Computer Society. Guest editors Jack Don-garra of the University of Tennessee and Oak Ridge National Laboratory and Fran-cis Sullivan of the Center for Comput-ing Sciences at the Institute for Defense Analyses put togeth-er a list they call the “Top Ten Algorithms of the Century.”“We tried to assemble the 10 al-gorithms with the greatest influence on the development and practice of science and engineering in the 20th century,” Dongarra and Sullivan write. As with any top-10 list, their selections—and non-selections—are bound to be controversial, they acknowledge. When it comes to picking the algorithmic best, there seems to be no best algorithm.Without further ado, here’s the CiSE top-10 list, in chronological order. (Dates and names associated with the algorithms should be read as first-order approximations. Most algorithms take shape over time, with many contributors.)1946: John von Neumann, Stan Ulam, and Nick Metropolis, all at the Los Alamos Scientific Laboratory, cook up the Metropolis algorithm, also known as the Monte Carlo method .The Metropolis algorithm aims to obtain approximate solutions to numerical problems with unmanageably many degrees of freedom and to combinatorial problems of factorial size, by mimicking a random process. Given the digital computer’s reputation fordeterministic calculation, it’s fitting that one of its earliest applications was the generation of random numbers.1947: George Dantzig, at the RAND Corporation, creates the simplex method for linear programming .In terms of widespread application, Dantzig’s algorithm is one of the most successful of all time: Linearprogramming dominates the world of industry, where economic survival depends on the ability to optimizewithin budgetary and other constraints. (Of course, the “real” problems of industry are often nonlinear; the useof linear programming is sometimes dictated by the computational budget.) The simplex method is an elegantway of arriving at optimal answers. Although theoretically susceptible to exponential delays, the algorithmin practice is highly efficient—which in itself says something interesting about the nature of computation.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 equations of the form Ax =b . The catch,of course, is that A is a huge n ´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 methods—such as solving equations ofthe form Kx i +1=Kx i +b –Ax i with a simpler matrix K that’s ideally “close” to A —lead to the study of Krylov subspaces. Named for the Russian mathematician Nikolai Krylov, Krylov subspaces are spanned by powers of a matrix applied to an initial “remainder” vector r 0=b –Ax 0. Lanczos found a nifty way to generate an orthogonal basis for such 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 includes techniques for non-symmetric systems, with acronyms like GMRES and Bi-CGSTAB. (GMRES and Bi-CGSTAB premiered in SIAM Journal on Scientific and Statistical Computing , in 1986 and 1992,respectively.)1951: Alston Householder of Oak Ridge National Laboratory formalizes the decompositional approachto 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 analysis of 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 matrix as a product of lower and uppertriangular factors.)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 The Best of the 20th Century: Editors Name T op 10 Algorithms In terms of w ide-spread use, George Dantzig’s simplexmethod is among the most successful al-gorithms of all time.Alston Householder2(and others) could tell the computer what they wanted it to do, without having to descend into the netherworld of machine code.Although modest by modern compiler standards—Fortran I consisted of a mere 23,500 assembly-language instructions—the early compiler was nonetheless capable of surprisingly sophisticated computations. As Backus himself recalls in a recent history of Fortran 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.”1959–61: J.G.F. Francis of Ferranti Ltd., London, finds a stable method for computing eigenvalues, known as the QR algorithm .Eigenvalues are arguably the most important numbers associated with matrices—and they can be the trickiest to compute. It’s relatively easy to transform a square matrix into a matrix that’s “almost” upper triangular, meaning one with a single 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 triangular matrix R , this approach iteratively changes A i =QR into A i +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.1962: Tony Hoare of Elliott Brothers, 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. Hoare’s algorithm uses the age-old recursive strategy of divide and conquer to solve the problem: Pick one element 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 it’s possible to get stuck doing all N (N –1)/2 comparisons (especially if you use as your pivot the first item on a list that’s already sorted!), Quicksort runs on average with O (N log N ) efficiency. Its elegant simplicity has made Quicksort the pos-terchild of computational complexity.1965: James Cooley of the IBM T.J. Watson Research Center and John Tukey of PrincetonUniversity and AT&T Bell Laboratories unveil the fast Fourier transform .Easily the most far-reaching algo-rithm in applied mathematics, the FFT revolutionizedsignal processing. The underlying idea goes back to Gauss (who needed to calculate orbitsof asteroids), but it was the Cooley–Tukey paper that made it clear how easily Fouriertransforms can be computed. Like Quicksort, the FFT relies on a divide-and-conquerstrategy to reduce an ostensibly O (N 2) chore to an O (N log N ) frolic. But unlike Quick- sort,the implementation is (at first sight) nonintuitive and less than straightforward. This in itselfgave computer science an impetus to investigate the inherent complexity of computationalproblems and algorithms.1977: Helaman Ferguson and Rodney Forcade of Brigham Young University advance an integer relation detection algorithm .The problem is an old one: Given a bunch of real numbers, say x 1, x 2, ... , x n , are there integers a 1, a 2, ... , a n (not all 0) for which a 1x 1 + a 2x 2 + ... + a n x n = 0? For n = 2, the venerable Euclidean algorithm does the job, computing terms in the continued-fraction expansion of x 1/x 2. If x 1/x 2 is rational, the expansion terminates and, with proper unraveling, gives the “smallest” integers a 1 and a 2.If the Euclidean algorithm doesn’t terminate—or if you simply get tired of computing it—then the unraveling procedure at least provides lower bounds on the size of the smallest integer relation. Ferguson and Forcade’s generalization, although much more difficult to implement (and to understand), is also more powerful. Their detection algorithm, for example, has been used to find the precise coefficients of the polynomials satisfied by the third and fourth bifurcation points, B 3 = 3.544090 and B 4 = 3.564407,of the logistic map. (The latter polynomial is of degree 120; its largest coefficient is 25730.) It has also proved useful in simplifying calculations with Feynman diagrams in quantum field theory.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 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 (N 2) computations—one for each pair of particles. The fast multipole algorithm gets by with O (N ) computations. It does so by using multipole expansions (net charge or mass, dipole moment, quadrupole, and so forth) to approximate the effects of a distant group of particles on a 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 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 won’t be known for another hundred 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!”Barry A. Cipra is a mathematician and writer based in Northfield, Minnesota.James CooleyJohn Tukey。

[已整理]20世纪科学界十大算法

[已整理]20世纪科学界十大算法

1962 快速排序算法
不少读者恐怕和我一样,看到“快速排序算法”(Quick Sort)这个条目时,心里的感觉是——“这可总算找到组织了”。相比于其他一些对程序员而言高深莫测的数学物理公式,快速排序算法真是我们朝夕相处的好伙伴——老板让你写个排序算法,如果你写出来的不是快速排序,你都不好意思跟同事打招呼。其实根本不用自己动手实现, 不论是ANSI C,C++ STL,还是Java SDK,天下几乎所有的SDK里都能找到它的某种实现版本。
话说回来,当年这帮开发Fortran的家伙真是天才——只用23500行汇编指令就完成了一个Fortran编译器,而且其效率之高令人叹为观止:当年在IBM 主持这一项目的负责人JohnBackus在数十年后,回首这段往事的时候也感慨,说它生成代码的效率“出乎了所有开发者的想象”。看来作为程序员,自己写的程序跑起来“出乎自己的想象”,有时候还真不一定是件坏事!
快速排序的平均时间复杂度仅仅为O(Nlog(N)),相比于普通选择排序和冒泡排序等而言,实在是历史性的创举。
1965 快速傅立叶变换
如果要评选对我们的日常生活影响最大的算法,快速傅立叶变换算法应该是当仁不让的总冠军——每天当拿起话筒,打开手机,听mp3,看DVD,用DC拍照 ——毫不夸张的说,哪里有数字信号处理,哪里就有快速傅立叶变换。快速傅立叶算法是离散傅立叶算法(这可是数字信号处理的基石)的一种快速算法,它有 IBM 华生研究院的James Cooley和普林斯顿大学的John Tukey共同提出,其时间复杂度仅为O(Nlog(N));比时间效率更为重要的是,快速傅立叶算法非常容易用硬件实现,因此它在电子技术领域得到极其广泛的应用。
1946 蒙特卡洛方法
在广场上画一个边长一米的正方形,在正方形内部随意用粉笔画一个不规则的形状,呃,能帮我算算这个不规则图形的面积么?蒙特卡洛(Monte Carlo)方法便是解决这个问题的巧妙方法:随机向该正方形内扔N(N 是一个很大的自然数)个黄豆,随后数数有多少个黄豆在这个不规则几何形状内部,比如说有M个:那么,这个奇怪形状的面积便近似于M/N,N越大,算出来的值便越精确。别小看这个数黄豆的笨办法,大到国家的民意测验,小到中子的移动轨迹,从金融市场的风险分析,到军事演习的沙盘推演,蒙特卡洛方法无处不在背后发挥着它的神奇威力。

十大数学算法

十大数学算法

十大数学算法数学算法是应用数学的重要组成部分,它们是解决数学问题的有效工具。

在计算机科学中,数学算法被广泛应用于图像处理、数据分析、机器学习等领域。

下面将介绍十大经典数学算法,它们涵盖了数值计算、图论、概率统计等多个数学领域的核心算法。

一、牛顿法牛顿法是一种用于求解方程的迭代数值方法。

它通过不断逼近函数的根,实现方程的求解。

牛顿法的核心思想是利用函数的局部线性近似来逼近根的位置,通过迭代求解函数的根。

牛顿法在优化问题中有广泛应用,如求解最优化问题和非线性方程组。

二、高斯消元法高斯消元法是一种用于求解线性方程组的经典方法。

通过不断进行行变换,将线性方程组转化为上三角矩阵,进而直接求解出线性方程组的解。

高斯消元法在线性代数和计算机图形学中有广泛的应用。

三、快速傅里叶变换快速傅里叶变换(FFT)是一种高效的离散傅里叶变换计算方法。

它通过分治法将离散傅里叶变换的计算复杂度降低到O(n log n)的时间复杂度。

FFT在信号处理、图像处理等领域有广泛应用。

四、Prim算法Prim算法是一种用于求解最小生成树的贪心算法。

通过不断选取与当前最小生成树连接的最小权重边,逐步构建最小生成树。

Prim算法在图论和网络优化中有重要应用。

五、Dijkstra算法Dijkstra算法是一种用于求解单源最短路径问题的贪心算法。

通过使用优先队列来存储节点,不断选择当前最短路径长度的节点,逐步求解最短路径。

Dijkstra算法在路由器和网络优化中有广泛应用。

六、最小二乘法最小二乘法是一种用于求解参数估计问题的优化方法。

通过最小化观测值与估计值之间的差异平方和,得到参数的最优估计。

最小二乘法在回归分析和数据拟合中广泛应用。

七、蒙特卡洛方法蒙特卡洛方法是一种通过随机抽样和统计模拟,来解决复杂问题的数值方法。

它通过随机抽样来估计问题的概率或者数值解,适用于各种复杂的概率和统计计算问题。

八、梯度下降法梯度下降法是一种常用的优化算法,主要用于求解无约束最优化问题。

统治世界十大数学算法列表

统治世界十大数学算法列表

统治世界⼗⼤数学算法列表软件正在统治世界,⽽软件的核⼼是算法;互联⽹即将统治世界,其管理、使⽤的核⼼也是算法;算法统治着软件和互联⽹,所以说“算法统治世界”这句话应是有⼀定道理的,⽽所有算法的底层是数学原理。

什么是算法?直⽩地说,算法就是任何明确定义的计算过程,它接收⼀些值或集合作为输⼊,并产⽣⼀些值或集合作为输出。

这样,算法就是将输⼊转换为输出的⼀系列计算过程。

简⽽⾔之,我们可以说算法就是⽤来解决⼀个特定任务的⼀系列步骤(是的,不⽌计算机在使⽤算法,⼈类也同样如此)。

⽬前,⼀个有效的算法应该含有三个重要特性:它必须是有限的:如果你设计的算法永⽆休⽌地尝试解决问题,那么它是⽆⽤的。

1. 它必须是有限的它必须具备明确定义的指令:算法的每⼀步都必须准确定义,在任何场景下指令都应当没有2. 它必须具备明确定义的指令歧义。

它必须是有效的:⼀个算法被设计⽤以解决某个问题,那么它就应当能解决这个问题,并且3. 它必须是有效的仅仅使⽤纸和笔就能证明该算法是收敛的。

还有⼀个要点需要指出,算法不仅仅在计算机科学中使⽤,同时也存在于数学领域中。

事实上,⾸个被记载的数学算法要追溯到公元前1600年,古巴⽐伦⼈开发了已知最早的算法,⽤作因式分解和计算平⽅根。

这⾥,我们回答了前⾯所提到的那篇⽂章中的第⼀个问题,它认为算法是计算机范畴的实体,但如果你知晓算法这个词的真正内涵的话,真正统治世界的⼗⼤算法也能在数学书籍中找到(加法、减法、乘积等等)。

不过在这篇⽂章中,让我们将算法的定义限定在计算机算法上,所以剩下的问题是:哪⼗个算法统治了世界?在此我整理了⼀个⼩型列表,排名不分先后。

1.归并排序,快速排序和堆排序哪个排序算法最好?这取决于你的需求,这也是为什么我要将这三个使⽤频率较⾼的排序算法置于⼀处的原因。

可能你⽐较偏爱其中⼀个,但它们都是同等重要的。

归并排序算法是⽬前为⽌我们拥有的最重要的算法之⼀。

它是⼀种基于⽐较的排序算法,使⽤分治法解决那些原本复杂度为O(N^2)的问题。

关于世纪的算法

关于世纪的算法

千纪、世纪、年代问题一历史学是一门以时、空为维度的科学。

谈及任何历史事件、事物、人物等等,都要界定它的时间段落和空间范围。

历史的空间范围这里不去说它。

历史的时间段落则以年为本位度量单位。

年也是社会生活的元单位。

时间是运动的速度,空间是运动的范围。

年便是地球环绕太阳一周的时间。

比年小的时间单位有季、月、旬、周、日、时、分等。

地球斜着身子沿椭圆轨道绕太阳运转带来了季节的变化。

月最初是月亮环绕地球一周的时间,圆缺盈虚一次的周期。

公历的月由此发展而来,但已有所不同。

日是地球自转一周的时间。

周又称星期,最初与月相变化有关,恰为月亮圆缺一次1//4。

以上的年、季、月、周、日都以天体运动为基准。

旬、时分、秒的发明是为了精细地划分时间段落和工作生活方便。

时、分秒按照24进位和60进位嵌入日内,分秒不差。

周与年、月之间则不求除尽,让它周而复始。

如一年有52周多。

这方面的匹配协调问题已解决得比较圆满。

在史学界和社会生活方面,比年更大的度量单位有年代、世纪、千纪、万年等,其中前三者比较常用。

但在它们与年的匹配协调中,问题尚未完全解决。

其原因在于它们并不是以天体运动或别的什么运动为基准,而是人为规定,约定俗成。

于是可以这样约定,也可以那样俗成。

解决这些问题需要全社会的参予和认同。

二现在通用的公历纪年已有一千几百年的历史。

4世纪的希腊人、基督教史家攸西比乌斯(Eusebius,260-340)采用了统一的综合编年法。

6世纪的西班牙神学家伊西多尔(Isidore,560-636)在攸氏的基础上提出了基督纪年法,即现行的公历,它的起点是公元1年(A、D、I)。

这个纪年及其起点也是主观规定,习惯成自然的,并没以运动或自然界的某一重大事件为基准。

8世纪时英国教会史家比德(Bede,673-735)首先按公元纪年推算公元前的年数,依次定为公元前1年,公元前2年(……Ⅲ、Ⅱ、ⅠB、C)等等。

比德的推算没有在公元前后之间定出一个公元零的[当时欧洲通用的罗马数字无零(0)的形式],为后来的分歧和争议埋下了病根。

算法新闻发展历程

算法新闻发展历程

算法新闻发展历程算法是计算机科学的核心概念之一,它指的是用于解决问题的一系列明确定义的步骤。

随着科技的不断进步,算法的发展也取得了巨大的突破和进展。

下面将简要介绍算法发展的历程。

1. 基础算法研究(20世纪初至20世纪50年代)在20世纪初期至20世纪50年代期间,人们开始对基础算法进行深入研究。

这一时期,一些经典的算法被提出,如欧几里得算法用于计算最大公约数、Dijkstra算法用于计算图中最短路径等。

2. 搜索算法的发展(20世纪60年代至20世纪70年代)在20世纪60年代至20世纪70年代期间,研究者们开始着重研究搜索算法。

这一时期,出现了很多重要的搜索算法,如深度优先搜索、广度优先搜索和A*算法等。

3. 动态规划与贪心算法的兴起(20世纪80年代至20世纪90年代)20世纪80年代至20世纪90年代,动态规划和贪心算法成为研究的热点。

动态规划算法通过将问题分解成一个个子问题来解决复杂问题,而贪心算法则采用每一步的局部最优解来达到全局最优解的目标。

4. 启发式算法的兴起(21世纪)进入21世纪,启发式算法开始受到更多关注。

启发式算法是一种通过启发式规则来优化求解问题的算法。

著名的启发式算法包括遗传算法、模拟退火算法和蚁群算法等,它们在解决复杂问题上具有较好的性能。

5. 机器学习算法的崛起(近年来)近年来,机器学习算法引起了广泛的关注和研究。

机器学习算法通过训练模型来识别模式和做出预测,具有强大的数据分析和决策能力。

深度学习作为机器学习的一个分支,通过构建多层神经网络来实现更加复杂的模式识别和学习能力。

总的来说,算法的发展经历了基础算法研究、搜索算法发展、动态规划与贪心算法的兴起、启发式算法的兴起以及近年来机器学习算法的崛起等阶段。

这些阶段的发展都对计算机科学和人工智能领域做出了重要的贡献。

20世纪最伟大的十大算法

20世纪最伟大的十大算法

二、1947 单纯形法
❖[1947: George Dantzig, at the RAND Corporation, creates the simplex method for linear programming.]
❖1947年,兰德公司的,Grorge Dantzig, 发明了单纯形方法。 单纯形法,此后成为了线性规划学科的重 要基石。
❖ 1950年:美国国家标准局数值分析研究所的,马 格努斯Hestenes,爱德华施蒂费尔和科尼利厄斯 的Lanczos,发明了Krylov子空间迭代法。
❖Krylov子空间迭代法是用来求解形如Ax=b 的方程, A是一个n*n 的矩阵,当n充分大时,直接计算变得 非常困难,而Krylov方法则巧妙地将其变为 Kxi+1=Kxi+b-Axi的迭代形式来求解。
❖线性规划作为运筹学(operation research) 的一部分,成为管理科学领域的一种重要 工具。
❖ 而Dantzig提出的单纯形法便是求解类似线 性规划问题的一个极其有效的方法。
三、1950 Krylov子空间迭代法
❖[1950: Magnus Hestenes, Eduard Stiefel, and Cornelius Lanczos, all from the Institute for Numerical Analysis at the National Bureau of Standards, initiate the development of Krylov subspace iteration methods.]
❖ 所谓线性规划,简单的说,就是给例如a1*x1+b1*x2+c1*x3>0),求一个给定的目 标函数的极值。

世界十大经典算法

世界十大经典算法

世界十大经典算法世界十大经典算法算法是计算机科学中非常重要的概念,它是一种解决问题的方法和步骤的描述。

以下是世界上广泛应用且被业界认可的十大经典算法: 1. 二分查找算法(Binary Search Algorithm):在有序数组中查找目标元素的算法。

通过将目标元素与数组中间元素进行比较,可以将搜索范围缩小一半,从而提高搜索效率。

2. 快速排序算法(Quick Sort Algorithm):一种基于分治法的排序算法。

它通过选择一个基准元素,将数组分为两个子数组,其中一个子数组的元素都小于等于基准元素,另一个子数组的元素都大于等于基准元素,然后递归地对子数组进行排序。

3. 归并排序算法(Merge Sort Algorithm):一种基于分治法的排序算法。

它将数组分成两个子数组,然后递归地对子数组进行排序,并将排序好的子数组合并成一个有序的数组。

4. 广度优先搜索算法(Breadth-First Search Algorithm):用于图遍历的一种算法。

它从图的某个顶点开始,逐层遍历其邻接顶点,直到遍历完所有顶点。

广度优先搜索常用于寻找最短路径或解决迷宫等问题。

5. 深度优先搜索算法(Depth-First Search Algorithm):用于图遍历的一种算法。

它从图的某个顶点开始,沿着一条路径一直向下遍历,直到无法继续为止,然后回溯到上一个没有遍历完的邻接顶点,继续遍历其他路径。

深度优先搜索常用于生成迷宫、图的连通性问题等。

6. Dijkstra算法(Dijkstra's Algorithm):用于求解单源最短路径问题的一种算法。

它根据权重赋值给每条边,计算出从源节点到其他节点的最短路径。

7. 动态规划算法(Dynamic Programming Algorithm):一种基于分治法的优化算法。

动态规划在问题可分解为重叠子问题时,通过保存子问题的解,避免重复计算,从而提高算法效率。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

20世纪十大算法本世纪初,美国物理学会(American Institute of Physics)和IEEE计算机社团(IEEE Computer Society)的一本联合刊物《科学与工程中的计算》发表了由田纳西大学的Jack Dongarra和橡树岭国家实验室的Francis Sullivan联名撰写的“世纪十大算法”一文,该文“试图整理出在20世纪对科学和工程领域的发展产生最大影响力的十大算法”。

作者苦于“任何选择都将是充满争议的,因为实在是没有最好的算法”,他们只好用编年顺序依次列出了这十项算法领域人类智慧的巅峰之作——给出了一份没有排名的算法排行榜。

有趣的是,该期杂志还专门邀请了这些算法相关领域的“大拿”为这十大算法撰写十篇综述文章,实在是蔚为壮观。

本文的目的,便是要带领读者走马观花,一同回顾当年这一算法界的盛举。

1946蒙特卡洛方法在广场上画一个边长一米的正方形,在正方形内部随意用粉笔画一个不规则的形状,呃,能帮我算算这个不规则图形的面积么?蒙特卡洛(Monte Carlo)方法便是解决这个问题的巧妙方法:随机向该正方形内扔N(N是一个很大的自然数)个黄豆,随后数数有多少个黄豆在这个不规则几何形状内部,比如说有M个:那么,这个奇怪形状的面积便近似于M/N,N越大,算出来的值便越精确。

别小看这个数黄豆的笨办法,大到国家的民意测验,小到中子的移动轨迹,从金融市场的风险分析,到军事演习的沙盘推演,蒙特卡洛方法无处不在背后发挥着它的神奇威力。

蒙特卡洛方法由美国拉斯阿莫斯国家实验室的三位科学家John von Neumann(看清楚了,这位可是冯诺伊曼同志!),Stan Ulam和Nick Metropolis共同发明。

就其本质而言,蒙特卡洛方法是用类似于物理实验的近似方法求解问题,它的魔力在于,对于那些规模极大的问题,求解难度随着问题的维数(自变量个数)的增加呈指数级别增长,出现所谓的“维数的灾难”(Course of Dimensionality)。

对此,传统方法无能为力,而蒙特卡洛方法却可以独辟蹊径,基于随机仿真的过程给出近似的结果。

最后八卦一下,Monte Carlo这个名字是怎么来的?它是摩纳哥的一座以博彩业闻名的城市,赌博其实是门概率的高深学问,不是么?1947单纯形法单纯形法是由大名鼎鼎的“预测未来”的兰德公司的Grorge Dantzig发明的,它成为线性规划学科的重要基石。

所谓线性规划,简单的说,就是给定一组线性(所有变量都是一次幂)约束条件(例如a1*x1+b1*x2+c1*x3>0),求一个给定的目标函数的极值。

这么说似乎也太太太抽象了,但在现实中能派上用场的例子可不罕见——比如对于一个公司而言,其能够投入生产的人力物力有限(“线性约束条件”),而公司的目标是利润最大化(“目标函数取最大值”),看,线性规划并不抽象吧!线性规划作为运筹学(operation research)的一部分,成为管理科学领域的一种重要工具。

而Dantzig提出的单纯形法便是求解类似线性规划问题的一个极其有效的方法,说来惭愧,本科二年级的时候笔者也学过一学期的运筹学,现在脑子里能想起的居然只剩下单纯形法了——不过这不也正说明了该方法的简单和直观么?顺便说句题外话,写过《万历十五年》的黄仁宇曾说中国的传统是“不能从数目字上管理”,我们习惯于“拍脑袋”,而不是基于严格的数据做决定,也许改变这一传统的方法之一就是全民动员学习线性规划喔。

1950Krylov子空间迭代法1951矩阵计算的分解方法50年代初的这两个算法都是关于线性代数中的矩阵计算的,看到数学就头大的读者恐怕看到算法的名字已经开始皱眉毛了。

Krylov子空间叠代法是用来求解形如Ax=b的方程,A是一个n*n的矩阵,当n充分大时,直接计算变得非常困难,而Krylov方法则巧妙地将其变为Kxi+1=Kxi+b-Axi的迭代形式来求解。

这里的K(来源于作者俄国人Nikolai Krylov姓氏的首字母)是一个构造出来的接近于A的矩阵,而迭代形式的算法的妙处在于,它将复杂问题化简为阶段性的易于计算的子步骤。

1951年由橡树岭国家实验室的AlstonHouseholder提出的矩阵计算的分解方法,则证明了任何矩阵都可以分解为三角、对角、正交和其他特殊形式的矩阵,该算法的意义使得开发灵活的矩阵计算软件包成为可能。

1957优化的Fortran编译器说实话,在这份学术气息无比浓郁的榜单里突然冒出一个编译器(Compiler)如此工程化的东东实在让人有“关公战秦琼”的感觉。

不过换个角度想想,Fortran这一门几乎为科学计算度身定制的编程语言对于科学家(尤其是数学家,物理学家)们实在是太重要了,简直是他们形影不离的一把瑞士军刀,这也难怪他们纷纷抢着要把票投给了它。

要知道,Fortran是第一种能将数学公式转化为计算机程序的高级语言,它的诞生使得科学家们真正开始利用计算机作为计算工具为他们的研究服务,这是计算机应用技术的一个里程碑级别的贡献。

话说回来,当年这帮开发Fortran的家伙真是天才——只用23500行汇编指令就完成了一个Fortran编译器,而且其效率之高令人叹为观止:当年在IBM主持这一项目的负责人JohnBackus在数十年后,回首这段往事的时候也感慨,说它生成代码的效率“出乎了所有开发者的想象”。

看来作为程序员,自己写的程序跑起来“出乎自己的想象”,有时候还真不一定是件坏事!1959-61计算矩阵特征值的QR算法呼,又是一个和线性代数有关的算法,学过线性代数的应该还记得“矩阵的特征值”吧?计算特征值是矩阵计算的最核心内容之一,传统的求解方案涉及到高次方程求根,当问题规模大的时候十分困难。

QR算法把矩阵分解成一个正交矩阵(什么是正交矩阵?!还是赶紧去翻书吧!)与一个上三角矩阵的积,和前面提到的Krylov方法类似,这又是一个迭代算法,它把复杂的高次方程求根问题化简为阶段性的易于计算的子步骤,使得用计算机求解大规模矩阵特征值成为可能。

这个算法的作者是来自英国伦敦的J.G.F.Francis。

1962快速排序算法不少读者恐怕和我一样,看到“快速排序算法”(Quick Sort)这个条目时,心里的感觉是——“这可总算找到组织了”。

相比于其他一些对程序员而言高深莫测的数学物理公式,快速排序算法真是我们朝夕相处的好伙伴——老板让你写个排序算法,如果你写出来的不是快速排序,你都不好意思跟同事打招呼。

其实根本不用自己动手实现,不论是ANSI C,C++STL,还是Java SDK,天下几乎所有的SDK里都能找到它的某种实现版本。

快速排序算法最早由Tony Hoare爵士设计,它的基本思想是将待排序列分为两半,左边的一半总是“小的”,右边的一半总是“大的”,这一过程不断递归持续下去,直到整个序列有序。

说起这位Tony Hoare爵士,快速排序算法其实只是他不经意间的小小发现而已,他对于计算机贡献主要包括形式化方法理论,以及ALGOL60编程语言的发明等,他也因这些成就获得1980年图灵奖。

快速排序的平均时间复杂度仅仅为O(Nlog(N)),相比于普通选择排序和冒泡排序等而言,实在是历史性的创举。

1965快速傅立叶变换如果要评选对我们的日常生活影响最大的算法,快速傅立叶变换算法应该是当仁不让的总冠军——每天当拿起话筒,打开手机,听mp3,看DVD,用DC拍照——毫不夸张的说,哪里有数字信号处理,哪里就有快速傅立叶变换。

快速傅立叶算法是离散傅立叶算法(这可是数字信号处理的基石)的一种快速算法,它有IBM华生研究院的James Cooley和普林斯顿大学的John Tukey共同提出,其时间复杂度仅为O(Nlog(N));比时间效率更为重要的是,快速傅立叶算法非常容易用硬件实现,因此它在电子技术领域得到极其广泛的应用。

1977整数关系探测算法整数关系探测是个古老的问题,其历史甚至可以追溯到欧几里德的时代。

具体的说:给定—组实数X1,X2,...,Xn,是否存在不全为零的整数a1,a2,...an,使得:a1x1+a2x 2+...+a n x n=0这一年BrighamYoung大学的Helaman Ferguson和Rodney Forcade解决了这一问题。

至于这个算法的意义嘛,呃,该算法应用于“简化量子场论中的Feynman图的计算”——太深奥的学问拉!1987快速多极算法日历翻到了1987年,这一年的算法似乎更加玄奥了,耶鲁大学的Leslie Greengard和Vladimir Rokhlin提出的快速多极算法用来计算“经由引力或静电力相互作用的N个粒子运动的精确计算——例如银河系中的星体,或者蛋白质中的原子间的相互作用”,天哪,不是我不明白,这世界真是变得快!所谓浪花淘尽英雄,这些算法的发明者许多已经驾鹤西去。

二十一世纪的头五年也已经在不知不觉中从我们指尖滑过,不知下一次十大算法评选的盛事何时再有,也许我们那时已经垂垂老去,也许我们早已不在人世,只是心中唯一的希望——里面该有个中国人的名字吧!--如欲平治天下,当今之世,舍我其谁!!![转帖]二十世纪十大算法2008-10-1211:03二十世纪七大算法:1946年蒙特卡洛方法;1951年矩阵计算的分解方法;1959~1961年计算矩阵特征值的QR算法;1962年快速排序算法;1965年快速傅利叶变换算法;1977年整数关系探测算法;1987年快速多极算法。

下面是二十世纪最好的十大算法:20世纪最好的算法,计算机时代的挑选标准是对科学和工程的研究和实践影响最大。

下面就是按年代次序排列的20世纪最好的10个算法。

1.Monte Carlo方法1946年,在洛斯阿拉莫斯科学实验室工作的John von Neumann,Stan Ulam和Nick Metropolis编制了Metropolis算法,也称为Monte Carlo方法。

Metropolis算法旨在通过模仿随机过程,来得到具有难以控制的大量的自由度的数值问题和具有阶乘规模的组合问题的近似解法。

数字计算机是确定性问题的计算的强有力工具,但是对于随机性(不确定性)问题如何当时并不知晓,Metropolis算法可以说是最早的用来生成随机数,解决不确定性问题的算法之一。

2.线性规划的单纯形方法1947年,兰德公司的Grorge Dantzig创造了线性规划的单纯形方法。

就其广泛的应用而言,Dantzig算法一直是最成功的算法之一。

线性规划对于那些要想在经济上站住脚,同时又有赖于是否具有在预算和其他约束条件下达到最优化的能力的工业界,有着决定性的影响(当然,工业中的“实际”问题往往是非线性的;使用线性规划有时候是由于估计的预算,从而简化了模型而促成的)。

相关文档
最新文档