zoukankan      html  css  js  c++  java
  • [转]细数二十世纪最伟大的十大算法

    http://blog.csdn.net/v_JULY_v/archive/2011/01/10/6127953.aspx

    细数二十世纪最伟大的十大算法

     

    译者:July   二零一一年一月十日

    ------------------------------------

    参考论文:
    The Best of the 20th Century: Editors Name Top 10 Algorithms。
    By Barry A. Cipra。

    博主说明:
    1、此20世纪的十大算法,除了快速排序算法,或者快速傅立叶变换, 其它算法只要稍作了解即可。
    2、此文非最新文章,只是本人对算法比较感兴趣,所以也做翻译,学习研究下。
    3、本人喜好研究算法,写了一系 列经典算法研究的文章。详情,参考本文文末链接。

    ===============================

     

        发明十大算法的其中几位算法大师


    一、1946 蒙特卡洛方法
    [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.]

    1946年,美国拉斯阿莫斯国家实验室的三位科学家John von Neumann,Stan Ulam 和 Nick Metropolis
    共同发明,被称为蒙特卡洛方法。

    它的具体定义是:
    在广场上画一个边长一米的正方形,在正方形内部随意用粉笔画一 个不规则的形状,
    现在要计算这个不规则图形的面积,怎么计算列?
    蒙特卡洛(Monte Carlo)方法告诉我们,均匀的向该正方形内撒N(N 是一个很大的自然数)个黄豆,
    随后数数有多少个黄豆在这个不规则几何形状内部,比如说有 M个,
    那么,这个奇怪形状的面积便近似于M/N,N越大,算出来的值便越精确。
    在这里我们要假定豆子都在一个平面上,相互之间没有重叠。

    蒙特卡洛方法可用于近似计算圆周率:让计算机每次随机生成两个0到1之间的数,看这两个 实数是否在单位

    圆内。生成一系列随机点,统计单位圆内的点数与总点数,(圆面积和正方形面积之比为 PI:1,PI为圆周率

    ),
    当随机点取得越多(但即使取10的9次方个随机点时,其结果也仅在前4位与 圆周率吻合)时,
    其结果越接近于圆周率。


    二、1947 单纯形法
    [1947: George Dantzig, at the RAND Corporation, creates the simplex method for linear programming.]

    1947年,兰德公司的,Grorge Dantzig,发明了单纯形方法。
    单 纯形法,此后成为了线性规划学科的重要基石。
    所谓线性规划,简单的说,就是给定一组线性(所有变量都是一次幂)约束条件
    (例如 a1*x1+b1*x2+c1*x3>0),求一个给定的目标函数的极值。

    这么说似乎也太太太抽象了,但在现实中能派上用场的例子可不罕见——比如对于一个公司而 言,其能够投

    入生产的人力物力有限(“线性约束条件”),而公司的目标是利润最大化(“目标函数取最 大值”),看

    ,线性规划并不抽象吧!

    线性规划作为运筹学(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.]

    1950年:美国国家标准局数值分析研究所的,马格努斯Hestenes,爱德华施蒂费 尔和
    科尼利厄斯的Lanczos,发明了Krylov子空间迭代法。

    Krylov子空间迭代法是用来求解形如Ax=b 的方程,A是一个n*n 的矩阵,当n充分大时,直接计算变得非常

    困难,而Krylov方法则巧妙地将其变为Kxi+1=Kxi+b-Axi的迭代形式来 求解。
    这里的K(来源于作者俄国人Nikolai Krylov姓氏的首字母)是一个构造出来的接近于A的矩阵,
    而迭代形式的算法的妙处 在于,它将复杂问题化简为阶段性的易于计算的子步骤。


    四、1951 矩阵计算的分解方法
    [1951: Alston Householder of Oak Ridge National Laboratory formalizes the decompositional approach to matrix computations.]

    1951年,阿尔斯通橡树岭国家实验室的Alston Householder提出,矩阵计算的分解方法。

    这个算法证明了任何矩阵都可以分解为三角、对角、正交和其他特殊形式的矩阵,
    该 算法的意义使得开发灵活的矩阵计算软件包成为可能。


    五、1957 优化的Fortran编译器
    [1957: John Backus leads a team at IBM in developing the Fortran optimizing compiler.]

    1957年:约翰巴库斯领导开发的IBM的团队,创造了Fortran优化编译器。

    Fortran,亦译为福传,是由Formula Translation两个字所组合而成,意思是“公式翻译”。
    它是世界上第一个被正式采用并流传至今的高级编程语言。
    这个语言现在,已 经发展到了,Fortran 2008,并为人们所熟知。


    六、1959-61 计算矩阵特征值的QR算法
    [1959–61: J.G.F. Francis of Ferranti Ltd, London, finds a stable method for computing

    eigenvalues, known as the QR algorithm.]

    1959-61:伦敦费伦蒂有限公司的J.G.F. Francis,找到了一种稳定的特征值的计算方法,
    这就是著名的QR算法。

    这也是一个和线性代数有关的算法,学过线性代数的应该记得“矩阵的特征值”,计算特征值 是矩阵计算的

    最核心内容之一,传统的求解方案涉及到高次方程求根,当问题规模大的时候十分困难。

    QR算法把矩阵分解成一个正交矩阵(希望读此文的你,知道什么是正交矩阵。:D。)与一 个上三角矩阵的积,

    和前面提到的Krylov 方法类似,这又是一个迭代算法,它把复杂的高次方程求根问题化简为阶段性的易于

    计算的子步骤,使得用计算机求解大规模矩阵特征值成为可能。
    这个算法的作者是来 自英国伦敦的J.G.F. Francis。


    七、1962 快速排序算法
    [1962: Tony Hoare of Elliott Brothers, Ltd., London, presents Quicksort.]
    1962年:伦敦的,托尼埃利奥特兄弟有限公司,霍尔提 出了快速排序。

    哈哈,恭喜你,终于看到了可能是你第一个比较熟悉的算法~。
    快速排序算法作为排 序算法中的经典算法,它被应用的影子随处可见。

    快速排序算法最早由Tony Hoare爵士设计,它的基本思想是将待排序列分为两半,
    左 边的一半总是“小的”,右边的一半总是“大的”,这一过程不断递归持续下去,直到整个序列有序。
    说起这位Tony Hoare爵士,快速排序算法其实只是他不经意间的小小发现而已,他对于计算机贡献主要包括

    形式化方法理论,以及ALGOL60 编程语言的发明等,他也因这些成就获得1980 年图灵奖。

    ========

    关于快速排序算法的具体认识与应用,可参考我写的一篇文章,
    精通八大排序算法系列、一、快速排序算法

    http://blog.csdn.net/v_JULY_v/archive/2011/01/04/6116297.aspx

    ------------------------------------------------------------

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


    八、1965 快速傅立叶变换
    [1965: James Cooley of the IBM T.J. Watson Research Center and John Tukey of Princeton
    University and AT&T Bell Laboratories unveil the fast Fourier transform
    .]

    1965年:IBM 华生研究院的James Cooley,和普林斯顿大学的John Tukey,
    AT&T贝尔实验室共同推出了快速傅立叶变换。

    快速傅立叶算法是离散傅立叶算法(这可是数字信号处理的基石)的一种快速算法,其时间复 杂度仅为O

    (Nlog(N));比时间效率更为重要的是,快速傅立叶算法非常容易用硬件实现,因此 它在电子技术领域得到

    极其广泛的应用。

    日后,我会在我的经典算法研究系列,着重阐述此算 法。


    九、1977 整数关系探测算法
    [1977: Helaman Ferguson and Rodney Forcade of Brigham Young University advance an integer

    relation detection algorithm.]
    1977年:Helaman Ferguson和 伯明翰大学的Rodney Forcade,提出了Forcade检测算法的整数关系。

    整数关系探测是个古老的问题,其历史甚至可以追溯到欧几里德的时代。具体的说:
    给 定—组实数X1,X2,...,Xn,是否存在不全为零的整数a1,a2,...an,使得:a1 x 1 +a2 x2 + . . . + an x

    n =0?
    这一年BrighamYoung大学的Helaman Ferguson 和Rodney Forcade解决了这一问题。
    该算法应用于“简化量子场论中的Feynman图的计算”。ok,它并不要你 懂,了解即可。:D。


    十、1987 快速多极算法
    [1987: Leslie Greengard and Vladimir Rokhlin of Yale University invent the fast multipole

    algorithm.]

    1987年:莱斯利的Greengard,和耶鲁大学的Rokhlin发明了快速多极算 法。

    此快速多极算法用来计算“经由引力或静电力相互作用的N 个粒子运动的精确计算
    —— 例如银河系中的星体,或者蛋白质中的原子间的相互作用”。ok,了解即可。
    完。
    有任何意见和问题,欢迎评论。

    --------------------------------------

    文 末链接,经典算法研究系列

    本人这个经典算法研究系列,目前暂时只写了7篇,正在不断更新中。
    已经写或编写 的七个算法,如下(会持续、永久更新):
    1、经典算法研究系列:一、A* 搜索算法
    http://blog.csdn.net/v_JULY_v/archive/2010/12/23/6093380.aspx
    2、经 典算法研究系列:二、Dijkstra 算法
    http://blog.csdn.net/v_JULY_v/archive/2010/12/24/6096981.aspx
    3、经 典算法研究系列:三、动态规划算法解微软一道面试题[第56题]
    http://blog.csdn.net/v_JULY_v/archive/2010/12/31/6110269.aspx
    4、经 典算法研究系列:四、教你通透彻底理解:BFS和DFS优先搜索算法
    http://blog.csdn.net/v_JULY_v/archive/2011/01/01/6111353.aspx
    5、经 典算法研究系列:五、红黑树算法的实现与剖析
    http://blog.csdn.net/v_JULY_v/archive/2010/12/31/6109153.aspx
    6、经 典算法研究系列:六、教你从头到尾彻底理解KMP算法
    http://blog.csdn.net/v_JULY_v/archive/2011/01/01/6111565.aspx
    7、经 典算法研究系列:七、深入浅出遗传算法,透析GA本质 (十 二日更新
    http://blog.csdn.net/v_JULY_v/archive/2011/01/12/6132775.aspx
    有 问题,望不吝指正。谢谢。

    =============================================

     

    作者声明:
    本人July对本博客所有文章和资料享有版权,转载 或引用任何文章、资料请注明出处。
    谢谢。July、二零一一年一月十日。

     

  • 相关阅读:
    asp.net实现页面的一般处理程序(CGI)学习笔记
    .NET下的状态(State)模式 行为型模式
    (插件Plugin)AssemblyLoader解决方案(插件开发)
    SQL基础编写基本的SQL SELECT 语句
    在查询语句中使用NOLOCK和READPAST(ZT)
    C# 3.0语言增强学习笔记(一)
    ram,rom,flash
    自动激活你的ActiveX控件
    用C#编写ActiveX控件(二)
    用C#编写ActiveX控件(一)
  • 原文地址:https://www.cnblogs.com/LeoWong/p/1936504.html
Copyright © 2011-2022 走看看