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。

十大经典算法朴素贝叶斯

十大经典算法朴素贝叶斯

朴素贝叶斯算法原理:
?
朴素贝叶斯算法原理:
朴素贝叶斯算法原理:
朴素贝叶斯算法原理:
n
? P ( X | yi ) ? P (ak | yi ) k?1
朴素贝叶斯算法原理:
贝叶斯算法处理流程:
贝叶斯算法的处理流程:
? 第一阶段——准备阶段:
该阶段为朴素贝叶斯分类做必要的准备。主要是依 据具体情况确定特征属性,并且对特征属性进行适当 划分。然后就是对一部分待分类项进行人工划分,以 确定训练样本。 这一阶段的输入是所有的待分类项,输出时特征属性 和训练样本。分类器的质量很大程度上依赖于特征属 性及其划分以及训练样本的质量。
购买电脑实例:
?
购买电脑实例:
P(X | buys_computer = “no”) P(buys_computer = “no”) = 0.019×0.357 = 0.007
? 因此,对于样本X,朴素贝叶斯分类预测
buys_computer =”yes”
? 特别要注意的是:朴素贝叶斯的核心在于它假设向量 的所有分量之间是独立的。
P(Y=jyX? x) =MAX{P(Y1 X=y? x),P(Y=2yX? x),...,P(Y=myX? x)}
而由贝叶斯公式:
P(Y ?
yj
X?
x) ?
P(X ?
x / Y ? yj )P(Y ? P(X ? x)
yj )
其中,P( C = ci) 可由领域专家的经验得到,而P( X = x | C = ci) 和P( X = x) 的计算则较困难。
B的后验概率。
? P(B)是B的先验概率或边缘概率,也作标准化常量(normalized constant).

20世纪十大算法

20世纪十大算法

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)。

[已整理]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越大,算出来的值便越精确。别小看这个数黄豆的笨办法,大到国家的民意测验,小到中子的移动轨迹,从金融市场的风险分析,到军事演习的沙盘推演,蒙特卡洛方法无处不在背后发挥着它的神奇威力。

十大经典大数据算法

十大经典大数据算法

十大经典大数据算法大数据算法是指应用于大规模数据集的算法,旨在从这些数据中提取有价值的信息和洞察力。

下面是十大经典大数据算法的介绍:1. MapReduce算法:MapReduce是一种用于处理大规模数据集的编程模型,它将任务分成多个子任务并在分布式计算环境中并行执行。

这种算法在Google的大数据处理框架Hadoop中得到广泛应用。

2. PageRank算法:PageRank是一种用于评估网页重要性的算法,通过分析网页之间的链接关系来确定网页的排名。

它在谷歌搜索引擎的排名算法中起到了重要作用。

3. Apriori算法:Apriori算法用于挖掘关联规则,通过发现数据集中的频繁项集来识别项目之间的关联。

该算法在市场篮子分析和推荐系统中有广泛应用。

4. k-means算法:k-means算法是一种聚类算法,用于将数据集划分为k个不重叠的簇。

该算法在数据挖掘和图像分析中常用于聚类分析。

5. 随机森林算法:随机森林是一种集成学习算法,通过构建多个决策树并对它们的结果进行投票来进行分类或回归。

该算法在数据挖掘和机器学习中常用于分类和预测问题。

6. SVM算法:支持向量机(SVM)是一种监督学习算法,用于进行分类和回归分析。

它通过构建一个最优的超平面来将不同类别的样本分开。

7. LDA算法:潜在狄利克雷分配(LDA)是一种用于主题建模的生成模型,用于从文本数据中发现隐藏的主题结构。

该算法在自然语言处理和信息检索中有广泛应用。

8. 特征选择算法:特征选择是一种用于从数据集中选择最相关特征的方法。

常用的特征选择算法包括信息增益、卡方检验和互信息等。

9. 随机梯度下降算法:随机梯度下降是一种用于优化模型参数的迭代优化算法。

该算法通过计算损失函数的梯度来更新模型参数,从而最小化损失函数。

10. 奇异值分解算法:奇异值分解(SVD)是一种矩阵分解方法,用于降低数据维度和提取数据的主要特征。

该算法在推荐系统和图像处理中常用于降维和特征提取。

十大数学算法

十大数学算法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

十大数学算法

十大数学算法

十大数学算法数学算法是解决数学问题的方法和步骤的集合。

在数学领域中,有许多重要且被广泛使用的算法。

这些算法不仅能够解决各种数学问题,还在计算机科学、工程和其他领域中得到了广泛应用。

在本文中,我们将介绍十大数学算法,它们分别是欧几里得算法、牛顿法、二分法、高斯消元法、快速傅里叶变换、动态规划、贝叶斯定理、蒙特卡洛方法、线性规划和迭代法。

1. 欧几里得算法欧几里得算法是解决最大公约数问题的一种常见方法。

该算法的核心思想是,通过不断用较小数去除较大数,直到余数为零,最后一个非零余数即为最大公约数。

欧几里得算法在密码学、数据压缩等领域得到了广泛应用。

2. 牛顿法牛顿法是一种用来求解方程近似解的迭代方法。

它基于函数的泰勒级数展开,通过不断迭代逼近函数的零点。

牛顿法在优化问题、图像处理和物理模拟等领域中广泛使用。

3. 二分法二分法又称折半查找法,是一种高效的查找算法。

它通过将查找区间一分为二,判断目标元素在哪一侧,并重复此过程,直到找到目标元素或确认不存在。

二分法在查找有序列表和解决优化问题时被广泛应用。

4. 高斯消元法高斯消元法是一种求解线性方程组的常用方法。

它通过对方程组进行一系列的行变换,将方程组化为简化的阶梯形式,从而求得方程组的解。

高斯消元法在计算机图形学、物理学和工程学等领域中得到广泛应用。

5. 快速傅里叶变换快速傅里叶变换是一种计算离散傅里叶变换的高效算法。

通过将离散信号转换为频域信号,可以在数字信号处理、图像处理和通信系统中实现快速算法和压缩方法。

6. 动态规划动态规划是一种解决具有重叠子问题和最优子结构性质的问题的算法。

通过将问题分解为子问题,并保存子问题的解,动态规划可以高效地求解一些复杂的优化问题,如最短路径、背包问题和序列比对等。

7. 贝叶斯定理贝叶斯定理是一种用来计算条件概率的方法。

它通过已知先验概率和观测数据来更新事件的后验概率。

贝叶斯定理在机器学习、人工智能和统计推断等领域中具有重要的应用。

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):一种基于分治法的优化算法。

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

人类历史上的29个重大算法

人类历史上的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世纪科学界十大算法

20世纪科学界十大算法

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)。

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 蒙特卡洛方法

十大人工智能经典算法

十大人工智能经典算法

十大人工智能经典算法随着人工智能技术的快速发展,越来越多的算法被提出并应用于各种领域。

本文将为您介绍十大人工智能经典算法,帮助您了解这些算法的基本概念、应用场景和优缺点。

一、线性回归算法线性回归算法是一种预测连续值的算法,通过对自变量和因变量之间的关系进行建模,来预测因变量的取值。

该算法广泛应用于金融、医疗、交通等领域。

优点是简单易行,缺点是对于非线性关系的数据处理效果较差。

二、逻辑回归算法逻辑回归算法是一种用于分类问题的算法,通过将连续值转换为二分类问题,来进行分类预测。

该算法广泛应用于欺诈检测、信用评分等领域。

优点是简单易行,缺点是对于多分类问题需要多次建模。

三、朴素贝叶斯算法朴素贝叶斯算法是一种基于贝叶斯定理的分类算法,通过计算已知类别的样本数据,来预测新样本的类别。

该算法广泛应用于垃圾邮件过滤、情感分析等领域。

优点是简单高效,缺点是对于特征之间关联性较强的数据效果较差。

四、决策树算法决策树算法是一种基于树结构的分类和回归算法,通过递归地将数据集划分为更小的子集,来构建决策树模型。

该算法广泛应用于金融、医疗、安全等领域。

优点是简单直观,缺点是对于连续型特征和缺失值处理效果较差。

五、随机森林算法随机森林算法是一种基于决策树的集成学习算法,通过构建多棵决策树并综合它们的预测结果,来提高分类和回归的准确率。

该算法广泛应用于金融、医疗、推荐系统等领域。

优点是准确率高,缺点是计算复杂度较高六、支持向量机算法支持向量机算法是一种基于统计学习理论的分类算法,通过找到能够将不同类别的样本点最大化分隔的决策边界,来进行分类预测。

该算法广泛应用于人脸识别、文本分类等领域。

优点是对于非线性问题具有较强的处理能力,缺点是对于大规模数据集计算效率较低。

七、K最近邻算法K最近邻算法是一种基于实例的学习算法,通过找到与新样本点最相近的K个已知类别的样本点,来进行分类预测。

该算法广泛应用于文本分类、图像识别等领域。

优点是简单高效,缺点是需要较大的存储空间和计算量。

世纪和年代的算法

世纪和年代的算法

世纪和年代的算法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年等等,五花八门。

20世纪十大数值算法

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大算法”

大话“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 程语言对于科学家 ( 尤其是数学家 , 物理

数学建模十大经典算法

数学建模十大经典算法

数学建模十大经典算法一、蒙特卡罗算法1946年,美国拉斯阿莫斯国家实验室的三位科学家John von Neumann,Stan Ulam 和 Nick Metropolis共同发明了,蒙特卡罗方法。

此算法被评为20世纪最伟大的十大算法之一。

蒙特卡罗方法(Monte Carlo method),又称随机抽样或统计模拟方法,是一种以概率统计理论为指导的一类非常重要的数值计算方法。

此方法使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。

由于传统的经验方法由于不能逼近真实的物理过程,很难得到满意的结果,而蒙特卡罗方法由于能够真实地模拟实际物理过程,故解决问题与实际非常符合,可以得到很圆满的结果。

蒙特卡罗方法的基本原理及思想如下:当所求解问题是某种随机事件出现的概率,或者是某个随机变量的期望值时,通过某种“实验”的方法,以这种事件出现的频率估计这一随机事件的概率,或者得到这个随机变量的某些数字特征,并将其作为问题的解。

有一个例子可以使你比较直观地了解蒙特卡洛方法:假设我们要计算一个不规则图形的面积,那么图形的不规则程度和分析性计算(比如,积分)的复杂程度是成正比的。

蒙特卡洛方法是怎么计算的呢?假想你有一袋豆子,把豆子均匀地朝这个图形上撒,然后数这个图形之中有多少颗豆子,这个豆子的数目就是图形的面积。

当你的豆子越小,撒的越多的时候,结果就越精确。

在这里我们要假定豆子都在一个平面上,相互之间没有重叠。

蒙特卡罗方法通过抓住事物运动的几何数量和几何特征,利用数学方法来加以模拟,即进行一种数字模拟实验。

它是以一个概率模型为基础,按照这个模型所描绘的过程,通过模拟实验的结果,作为问题的近似解。

蒙特卡罗方法与一般计算方法有很大区别,一般计算方法对于解决多维或因素复杂的问题非常困难,而蒙特卡罗方法对于解决这方面的问题却比较简单。

其特点如下:I、直接追踪粒子,物理思路清晰,易于理解。

II、采用随机抽样的方法,较真切的模拟粒子输运的过程,反映了统计涨落的规律。

计算机十大经典算法

计算机十大经典算法

计算机十大经典算法计算机科学领域有许多经典的算法,这些算法在解决各种问题时起到了重要的作用。

本文将介绍十大经典算法,分别是:二分查找算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法、归并排序算法、堆排序算法、动态规划算法、贪心算法和图的深度优先搜索算法。

一、二分查找算法二分查找算法是一种在有序数组中查找目标元素的算法。

该算法的基本思想是将数组分为两部分,然后判断目标元素在哪一部分中,继续在该部分中进行二分查找,直到找到目标元素或者确定目标元素不存在。

二、冒泡排序算法冒泡排序算法是一种简单的排序算法,它重复地遍历要排序的数组,每次比较相邻的两个元素,如果它们的顺序错误就交换它们,直到没有任何一对元素需要交换为止。

三、选择排序算法选择排序算法是一种简单的排序算法,它每次从待排序的数组中选择最小的元素,并将其放到已排序数组的末尾,直到所有元素都排序完成。

四、插入排序算法插入排序算法是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

五、快速排序算法快速排序算法是一种高效的排序算法,它的基本思想是通过一趟排序将待排序的数组分割成两部分,其中一部分的所有元素都比另一部分的所有元素小,然后再按此方法对两部分进行快速排序,整个过程递归进行,直到整个数组有序。

六、归并排序算法归并排序算法是一种稳定的排序算法,它的基本思想是将待排序的数组不断地划分为更小的数组,直到每个小数组只有一个元素,然后将这些小数组两两合并,直到合并成一个有序的数组。

七、堆排序算法堆排序算法是一种利用堆的数据结构进行排序的算法,它的基本思想是将待排序的数组构造成一个大顶堆或小顶堆,然后依次取出堆顶元素并调整堆,直到所有元素都被取出,最后得到一个有序的数组。

八、动态规划算法动态规划算法是一种解决多阶段决策过程最优化的算法,它的基本思想是将原问题拆分成多个子问题,通过求解子问题的最优解来求解原问题的最优解。

算法新闻发展历程

算法新闻发展历程

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

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

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

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世纪十个最伟大算法

20世纪十个最伟大算法20世纪十个最伟大算法!!在20世纪,人类产生了10种著名的算法。

它们是什么?下面是一篇介绍美国科学家选择的10种算法的文章。

如果你感兴趣,你可以看看。

《三面镜子先生》是20世纪最好的10种算法一、算法一词的来源ALGOS是一个希腊词,意思是“痛苦”,a1gor是一个拉丁词,意思是“冷却”。

这两个词都不是单词algorithm的词根,但单词A1 algorithm与9世纪的阿拉伯学者阿尔·赫瓦里兹米有关,他的书《阿尔贾布·阿尔穆卡巴拉》(AlJabrw’almuqabalah,代数)已经演变成中学代数教科书。

Ad khwarizmi强调解决问题的有组织的步骤。

如果他能活到今天,他会被以他的名字命名的方法的进步所感动。

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

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

1.montecarlo方法1946年,在洛斯阿拉莫斯科学实验室工作的johnvonneumann,stanulam和nickmetropolis编制了metropolis算法,也称为montecarlo方法。

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

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

2.线性规划的单纯形方法1947年,兰德公司的格罗奇·丹齐格创立了线性规划的单纯形法。

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

线性规划对那些想要在经济上立足的行业有着决定性的影响,这取决于它们是否有能力在预算和其他约束条件下实现优化(当然是“实际的”工业中的问题往往是非线性的;线性规划的使用有时是由预算估算引起的,这简化了模型)。

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

本世纪初,美国物理学会(American Institute of Physics)和IEEE计算机社团(IEEE Comp uter Society)的一本联合刊物《科学与工程中的计算》发表了由田纳西大学的Jack Dongar ra和橡树岭国家实验室的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提出的单纯形法便是求解类似线性规划问题的一个极其有效的方法,说来惭愧,本科二年级的时候笔者也学过一学期的运筹学,现在脑子里能想起的居然只剩下单纯形法了——不过这不也正说明了该方法的简单和直观么?
顺便说句题外话,写过《万历十五年》的黄仁宇曾说中国的传统是“不能从数目字上管理”,我们习惯于“拍脑袋”,而不是基于严格的数据做决定,也许改变这一传统的方法之一就是全民动员学习线性规划喔。

1950 Krylov子空间迭代法
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 主持这一项目的负责人JohnBa ckus在数十年后,回首这段往事的时候也感慨,说它生成代码的效率“出乎了所有开发者的想象”。

看来作为程序员,自己写的程序跑起来“出乎自己的想象”,有时候还真不一定是件坏事!
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,使得:a 1 x 1 +a 2 x 2 + . . . + a n x n =0 这一年BrighamYoung大学的Helaman Ferguson 和Rodney Forcade解决了这一问题。

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

二十一世纪的头五年也已经在不知不觉中从我们指尖滑过,不知下一次十大算法评选的盛事何时再有,也许我们那时已经垂垂老去,也许我们早已不在人世,只是心中唯一的希望——里面该有个中国人的名字吧!。

相关文档
最新文档