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世纪科学界十大算法
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世纪最伟大的十大算法
二、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):一种基于分治法的优化算法。
动态规划在问题可分解为重叠子问题时,通过保存子问题的解,避免重复计算,从而提高算法效率。
人类历史上的29个重大算法
人类历史上的29个重大算法1. 蒙特卡洛方法—用随机数模拟处理问题的算法。
一般用于对复杂问题进行近似求解。
2. 快速排序算法—一种常用的排序算法,采用分治策略,平均时间复杂度为O(nlogn)。
3. Dijkstra 最短路径算法—用于计算图中两个点之间的最短路径,采用贪心思想。
4. KMP 字符串匹配算法—通过预处理模式串,避免不必要的匹配,从而提高算法效率。
5. RSA 加密算法—一种非对称加密算法,在信息传输领域中广泛应用。
6. 贪心算法—一种算法思想,通过局部最优选择来达到整体最优解。
7. 分治算法—一种分而治之的算法思想,处理问题时将其分成子问题分别处理,最终合并成一个总问题的解。
8. 梯度下降算法—用于寻找函数的最小值或最大值,例如神经网络的参数优化。
9. 动态规划算法—用于解决具有重叠子问题和最优子结构性质的问题。
10. 二分查找算法—用于在有序数组中查找指定元素的算法,时间复杂度为O(logn)。
11. 哈希表算法—基于哈希函数实现查找、插入和删除操作,时间复杂度为O(1)。
12. 最小生成树算法—用于求加权连通图的最小生成树,包括Prim算法和Kruskal算法。
13. Floyd 算法—用于求所有点对之间的最短路径,时间复杂度为O(n^3)。
14. A* 算法—用于图的最短路径搜索,结合了Dijkstra算法和贪心算法的思想,常用于人工智能领域。
15. 布隆过滤器算法—用于判断一个元素是否存在于集合中,具有高效率和低空间占用的优点。
16. PageRank 算法—用于衡量网页排名的算法,由谷歌公司开发。
17. 马尔可夫链蒙特卡洛算法—用于采样高维分布的一类重要随机算法。
18. SHA 加密算法—用于数字签名和消息认证等领域。
19. B 树算法—一种平衡查找树,常用于数据库系统中,具有高效率和低磁盘访问次数的特点。
20. 基数排序算法—一种特殊的排序算法,适用于排序的数据范围比较小的情况下。
20世纪十大算法
十、1987 快速多极算法
1987年,莱斯利的Greengard,和耶鲁大 学的Rokhlin发明了快速多极算法。 此快速多极算法用来计算经由引力或静电 力相互作用的N 个粒子运动的精确计算
二、1947 单纯形法
1947年,兰德公司的 George Dantzig,发明了 单纯形方法。 Dantzig提出的单纯形法便 是求解类似线性规划问题 的一个极其有效的方法。
三、1950 Krylov子空间迭代法
1950年Magnus Hestenes, Eduard Stiefel, Cornelius Lanczos发明了Krylov子空间迭 代法 Krylov子空间迭代法是用来求解形如Ax=b 的方程,A是一个n*n 的矩阵,当n充分大 时,直接计算变得非常困难,而Krylov方法 则巧妙地将其变为 KXi+1 =KXi +b-AXi 的迭代 形式来求解。
四、1951 矩阵计算的分解方法
1951年,阿尔斯通橡树岭 国家实验室的Alston Householder提出,矩阵计 算的分解方法。 这个算法证明了任何矩阵 都可以分解为三角、对角、 正交和其他特殊形式的矩 阵,该算法的意义使得开 发灵活的矩阵计算软件包 成为可能。
五、1957 优化的Fortran编译器
九、1977 整数关系探测算法
1977年:Helaman Ferguson和 伯明翰大 学的Rodney Forcade,提出了Forcade检 测算法的整数关系。 整数关系:给定—组实数X1,X2,...,Xn,是 否存在不全为零的整数a1,a2,...an,使 得:a1 x 1 +a2 x2 + . . . + an x n =0?
LOGO
20世纪十大算法Βιβλιοθήκη 一、1946 蒙特卡洛方法
20世纪十大数值算法
二十世纪十大数值算法这份算法名单是CiSE (Computing in Science & Engineering) 的两位编辑在 2000 年评出的,基本已经得到大家的认可了。
按时间顺序列出:1. 1946: the Metropolis algorithm, also known as the Monte Carlo method.蒙特卡罗算法, 一年级的时候接触到这个名词. 忘记是"对且很可能快"还是"快且很可能快"了....去随机性ms已经成为很重要的问题....费了半天劲搞出了随机性, 又要处心积虑的去随机化......2. 1947: the simplex method for linear programming. 不懂, 貌似是线性规划方面的3. 1950: Krylov subspace iteration methods. 不懂4. 1951: Formalization of the decompositional approach to matrix computations.好像是矩阵处理方面的东东, 包括LU分解之类的. 如此看来此算法无愧于10大算法. 矩阵在符号计算方面的重要性不言而喻嘛5. 1957: Development of the Fortran optimizing compiler. 即使现在, 科学计算领域还有一席之地6. 1959–61: QR algorithm. 计算矩阵特征值.7. 1962: Quick sort. 快速排序8. 1965: FFT (Fast Fourier Transform) . 快速傅立叶变换....,9. 1977: Integer relation detection algorithm. 不懂.10. 1987: Fast multipole algorithm. 依然不懂...........The Top Ten Algorithms of the CenturyJack Dongarra and Francis Sullivan published a list of "The Top Ten Algorithms of the Century." Their list included:1.The Monte Carlo method or Metropolis algorithm, devised by John von Neumann, Stanislaw Ulam,and Nicholas Metropolis;2.The simplex method of linear programming, developed by George Dantzig;3.The Krylov Subspace Iteration method, developed by Magnus Hestenes, Eduard Stiefel, andCornelius Lanczos;4.The Householder matrix decomposition, developed by Alston Householder;5.The Fortran compiler, developed by a team lead by John Backus;6.The QR algorithm for eigenvalue calculation, developed by J Francis;7.The Quicksort algorithm, developed by Anthony Hoare;8.The Fast Fourier Transform, developed by James Cooley and John Tukey;9.The Integer Relation Detection Algorithm, developed by Helaman Ferguson and Rodney Forcade;(given N real values X I, is there a nontrivial set of integer coefficients A I so that sum ( 1 <= I <= N )A I * X I = 0?10.The fast Multipole algorithm, developed by Leslie Greengard and Vladimir Rokhlin; (to calculategravitational forces in an N-body problem normally requires N^2 calculations. The fast multipole method uses order N calculations, by approximating the effects of groups of distant particles using multipole expansions)Reference 1:Dongarra and Sullivan,Top Ten Algorithms of the Century,Computing in Science and Engineering,January/February 2000.Reference 2:Barry Cipra,The Best of the 20th Century: Editors Name Top 10 AlgorithmsSIAM News,Volume 33, Number 4, May 2000, page 1.。
大话“20世纪10大算法”
黄 豆 的笨 办 法 . 到 国家 的 民意 测验 , 大 小 到 中子 的移 动 轨 迹 .从 金融 市 场 的 风 险
D n ar o gr a和橡树 岭国家实验室的 Facs rn i
到军事演 习的沙盘推演 , 蒙特卡洛 Sl a联名 uin 摆写 ” l v 的 世纪十大算法” 分析 , 一
文 , 文 ” 图 整理 出在 2 世 纪 对 科 学 该 试 O
方法无处不在背后发挥着 它的神奇威力。
维普资讯
(pr i eerh 的一 部 分 ,成 为 管理 oeao rsac ) tn 科 学领 域 的一 种 重 要 工具 。而 D n i提 at g z 出 的 单 纯 形 法 便 是 求 解 类 似 线 性 规 划 问
满 争 议 的 , 因 为 实 在 是 没 有 最 好 的 算 法 ” 他 们 只 好 用 编 年 顺 序 依 次 列 出 了 这 ,
十项算法领域人类 智慧 的巅峰 之作——
给 出 了一 份 没 有 排 名 的 算 法排 行 榜 。 有
趣的是 .该期杂志还专 门邀请 了这些 算 法相关领域的 “ 大拿” 为这十大算法撰写 十篇综述文章 , 实在是蔚为壮观。 本文的
是解 决 这 个 问题 的巧 妙方 法 : 随机 向该 正 方形 内扔 N ( 是 一 个 很 大 的 自然数 )个 N
黄豆 ,随后数数有多少个黄豆在这个不
规则几何形状内部 . 比如 说 有M个 : 么 . 那 这 个 奇 怪 形 状 的 面积 便 近 似 于 M/ N N. 越
大 算出来的值便越精确。 I , { 4看这个数 J
15 9 7优化的 F rr n编译器 ota
说实话 ,在这份 学术气息无比浓郁 的榜单里 突然 冒出一个编译器 ( o e) cm r 如此工程化的东东实在让人有 “ 关公战 秦琼 ” 的感觉。 不过换个角度想想 ,Fr o- tn r 这一 门几乎为科学计算度身定制的编 a 程语言对于科学家 ( 尤其是数学家 , 物理
十大算法
算法一:快速排序算法快速排序是由东尼·霍尔所发展的一种排序算法。
在平均状况下,排序 n 个项目要Ο(n log n)次比较。
在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。
事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。
快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
算法步骤:1 从数列中挑出一个元素,称为“基准”(pivot),2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。
在这个分区退出之后,该基准就处于数列的中间位置。
这个称为分区(partition)操作。
3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。
虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
算法二:堆排序算法堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。
堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
堆排序的平均时间复杂度为Ο(nlogn) 。
算法步骤:创建一个堆H[0..n-1]把堆首(最大值)和堆尾互换3. 把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置4. 重复步骤2,直到堆的尺寸为1算法三:归并排序归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。
该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
算法步骤:1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置4. 重复步骤3直到某一指针达到序列尾5. 将另一序列剩下的所有元素直接复制到合并序列尾算法四:二分查找算法二分查找算法是一种在有序数组中查找某一特定元素的搜索算法。
数学建模十大经典算法
数学建模十大经典算法一、蒙特卡罗算法1946年,美国拉斯阿莫斯国家实验室的三位科学家John von Neumann,Stan Ulam 和 Nick Metropolis共同发明了,蒙特卡罗方法。
此算法被评为20世纪最伟大的十大算法之一。
蒙特卡罗方法(Monte Carlo method),又称随机抽样或统计模拟方法,是一种以概率统计理论为指导的一类非常重要的数值计算方法。
此方法使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。
由于传统的经验方法由于不能逼近真实的物理过程,很难得到满意的结果,而蒙特卡罗方法由于能够真实地模拟实际物理过程,故解决问题与实际非常符合,可以得到很圆满的结果。
蒙特卡罗方法的基本原理及思想如下:当所求解问题是某种随机事件出现的概率,或者是某个随机变量的期望值时,通过某种“实验”的方法,以这种事件出现的频率估计这一随机事件的概率,或者得到这个随机变量的某些数字特征,并将其作为问题的解。
有一个例子可以使你比较直观地了解蒙特卡洛方法:假设我们要计算一个不规则图形的面积,那么图形的不规则程度和分析性计算(比如,积分)的复杂程度是成正比的。
蒙特卡洛方法是怎么计算的呢?假想你有一袋豆子,把豆子均匀地朝这个图形上撒,然后数这个图形之中有多少颗豆子,这个豆子的数目就是图形的面积。
当你的豆子越小,撒的越多的时候,结果就越精确。
在这里我们要假定豆子都在一个平面上,相互之间没有重叠。
蒙特卡罗方法通过抓住事物运动的几何数量和几何特征,利用数学方法来加以模拟,即进行一种数字模拟实验。
它是以一个概率模型为基础,按照这个模型所描绘的过程,通过模拟实验的结果,作为问题的近似解。
蒙特卡罗方法与一般计算方法有很大区别,一般计算方法对于解决多维或因素复杂的问题非常困难,而蒙特卡罗方法对于解决这方面的问题却比较简单。
其特点如下:I、直接追踪粒子,物理思路清晰,易于理解。
II、采用随机抽样的方法,较真切的模拟粒子输运的过程,反映了统计涨落的规律。
计算机十大经典算法
计算机十大经典算法计算机科学领域有许多经典的算法,这些算法在解决各种问题时起到了重要的作用。
本文将介绍十大经典算法,分别是:二分查找算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法、归并排序算法、堆排序算法、动态规划算法、贪心算法和图的深度优先搜索算法。
一、二分查找算法二分查找算法是一种在有序数组中查找目标元素的算法。
该算法的基本思想是将数组分为两部分,然后判断目标元素在哪一部分中,继续在该部分中进行二分查找,直到找到目标元素或者确定目标元素不存在。
二、冒泡排序算法冒泡排序算法是一种简单的排序算法,它重复地遍历要排序的数组,每次比较相邻的两个元素,如果它们的顺序错误就交换它们,直到没有任何一对元素需要交换为止。
三、选择排序算法选择排序算法是一种简单的排序算法,它每次从待排序的数组中选择最小的元素,并将其放到已排序数组的末尾,直到所有元素都排序完成。
四、插入排序算法插入排序算法是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
五、快速排序算法快速排序算法是一种高效的排序算法,它的基本思想是通过一趟排序将待排序的数组分割成两部分,其中一部分的所有元素都比另一部分的所有元素小,然后再按此方法对两部分进行快速排序,整个过程递归进行,直到整个数组有序。
六、归并排序算法归并排序算法是一种稳定的排序算法,它的基本思想是将待排序的数组不断地划分为更小的数组,直到每个小数组只有一个元素,然后将这些小数组两两合并,直到合并成一个有序的数组。
七、堆排序算法堆排序算法是一种利用堆的数据结构进行排序的算法,它的基本思想是将待排序的数组构造成一个大顶堆或小顶堆,然后依次取出堆顶元素并调整堆,直到所有元素都被取出,最后得到一个有序的数组。
八、动态规划算法动态规划算法是一种解决多阶段决策过程最优化的算法,它的基本思想是将原问题拆分成多个子问题,通过求解子问题的最优解来求解原问题的最优解。
历年全国数学建模试题及解法
一、历年全国数学建模试题及解法赛题解法93A 非线性交调的频率设计拟合、规划93B 足球队排名图论、层次分析、整数规划94A 逢山开路图论、插值、动态规划94B 锁具装箱问题图论、组合数学95A 飞行管理问题非线性规划、线性规划95B 天车与冶炼炉的作业调度动态规划、排队论、图论96A 最优捕鱼策略微分方程、优化96B 节水洗衣机非线性规划97A 零件的参数设计非线性规划97B 截断切割的最优排列随机模拟、图论98A 一类投资组合问题多目标优化、非线性规划98B 灾情巡视的最灾情巡视的最佳佳路线图论、组合优化99A 自动化车动化车床床管理随机优化、计随机优化、计算算机模拟99B 钻井布局0-1规划、图论00A DNA 序列分类模式识别式识别、、Fisher 判别判别、、人工神经网络00B 钢管订购和运输组合优化、组合优化、运输运输运输问题问题01A 血管三维重建曲线拟合、线拟合、曲面重建曲面重建01B 工交车调度问题多目标规划02A 车灯线光源光源的优化的优化非线性规划02B 彩票彩票问题问题问题 单目标目标决决策 03A SARS 的传播传播 微分方程、微分方程、差差分方程分方程03B 露天矿生产矿生产的车的车的车辆安辆安辆安排排 整数规划、整数规划、运输运输运输问题问题问题 04A 奥运会临时超市网点奥运会临时超市网点设计设计设计 统计分析、数计分析、数据处据处据处理、优化理、优化理、优化 04B 电力市场电力市场的的输电阻塞输电阻塞管理管理管理 数据拟合、优化拟合、优化 05A 长江长江水水质的评价和预测评价和预测 预测评价预测评价、数、数、数据处据处据处理理 05B DVD 在线租赁租赁 随机规划、整数规划随机规划、整数规划二、赛题发展的特点1.对选手对选手的计的计的计算算机能力提出了更高能力提出了更高的的要求:要求:赛题的解赛题的解赛题的解决依赖决依赖决依赖计计算机,题目的数题目的数据较据较据较多多,手工,手工计计算不能完成,如03B ,某些,某些问题问题问题需要需要需要使用使用使用计计算机软件,01A 。
世纪和年代的算法
世纪和年代的算法1.世纪的算法1)第1种算法:100年一世纪。
这种奇数的纪年法来自于耶稣纪元后,其中的1年通常表示“吾主之年”(year of our lord),因此第1世纪从公元1年到公元100年,而第2世纪则从公元101年到公元200年。
因此,在计算世纪时,年÷100后,除得整数即为几世纪,如2000年,2000÷100=20,即为20世纪,从公元1901年到公元2000年;如果除得小数,不管小数点后是多少,则世纪一律是整数+1。
如1999年,1999÷100=19.99,同样为20世纪。
因此2001—2100年都是21世纪。
2)第2种算法:第1世纪从公元1年到公元99年,为99年,从第2世纪开始为每世纪100年,即第2世纪:公元100年—199年,第3世纪:公元200年—299年等。
这种记世法,在计算世纪时,年÷100后,不管是除得整数还是小数,世纪都是整数+1,如2000年,2000÷100=20,即为21世纪;2099÷100=20.99,也为21世纪,所以21世纪是从公元2000年到公元2099年。
3)2种算法基本相同,唯一的不同只是除得的整数归属问题,第一种整数归前,第二种整数归后。
如2000年,2000÷100=20,第一种20世纪,第二种为21世纪。
2.年代的算法:年代和世纪的算法都是很混乱的,年代的算法更混乱。
最初年代是把一个世纪100年分成10段计数,每10年为1个10年代。
这样一来就出现了2个问题:(1)整十的归属:比如10,是归于10年代还是20年代?有的认为按0—9算,有的认为按0—10算。
(2)0—9是算0十年代还是算10年代?有的认为0—10算10年代、90—99算100年代,有的把0—10叫某世纪初,把90—99叫某世纪末,有的把0—10叫作第一个10年、把90—99叫作第二个10年等等,五花八门。
经典算法的起源
经典算法的起源算法是计算机科学中的核心概念,它是解决问题的一种方法或步骤。
在计算机科学的发展史上,许多经典算法被提出并被广泛应用。
这些算法的起源可以追溯到数学、物理和工程等领域。
在这篇文章中,我们将探讨一些经典算法的起源和发展。
欧几里得算法欧几里得算法是一种用于计算两个数的最大公约数的算法。
它的起源可以追溯到公元前300年左右的古希腊。
欧几里得是一位著名的古希腊数学家,他在他的著作《几何原本》中提出了这个算法。
欧几里得算法的基本思想是通过连续的除法操作,将两个数的余数不断地代入到下一次的除法运算中,直到余数为0为止。
在这个过程中,最后的除数就是两个数的最大公约数。
虽然欧几里得算法的思想很简单,但它在计算机科学中的应用非常广泛。
在计算机科学中,欧几里得算法被用于许多领域,如密码学、编码和图形学等。
快速排序算法快速排序算法是一种高效的排序算法,它的起源可以追溯到20世纪60年代。
快速排序算法的发明者是英国计算机科学家托尼·霍尔(Tony Hoare)。
快速排序算法的基本思想是通过分治法将待排序的序列分成两个子序列,其中一个子序列的元素都比另一个子序列的元素小,然后再对这两个子序列进行递归排序。
在这个过程中,选择一个合适的枢轴元素是非常重要的,它决定了算法的效率。
快速排序算法的时间复杂度为O(nlogn),它是一种非常高效的排序算法。
在计算机科学中,快速排序算法被广泛应用于各种领域,如数据库、操作系统、网络和图形学等。
Dijkstra算法Dijkstra算法是一种用于解决最短路径问题的算法,它的起源可以追溯到20世纪50年代。
Dijkstra是一位荷兰计算机科学家,他在1956年发表了这个算法。
Dijkstra算法的基本思想是通过不断地更新起点到其他点的最短距离来求解最短路径。
在这个过程中,需要使用一个优先队列来选择下一个需要更新的点。
当所有的点都被更新后,最短路径就可以得到。
Dijkstra算法在计算机科学中的应用非常广泛,它被用于许多领域,如路由算法、图形学和自然语言处理等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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算法一直是最成功的算法之一。
线性规划对于那些要想在经济上站住脚,同时又有赖于是否具有在预算和其他约束条件下达到最优化的能力的工业界,有着决定性的影响(当然,工业中的“实际”问题往往是非线性的;使用线性规划有时候是由于估计的预算,从而简化了模型而促成的)。