二十世纪最伟大的10大算法

March 31, 2026
Published in 计算机科学

Abstract

二十世纪不仅是科技飞速发展的时代,更是计算与算法领域实现重大突破的黄金时期。本文将带您回顾这段历史中诞生的最具影响力的十大算法,它们不仅奠定了现代计算机科学与工程计算的基础,更深刻地影响了物理、金融等众多交叉学科。让我们一起来领略这些改变世界的智慧结晶。

Keywords: 算法, 计算机科学, 数学历史, 计算物理

1946年:蒙特卡洛方法

蒙特卡洛方法(Monte Carlo method)的应用场景非常广泛,横跨物理学、金融学和计算机科学等多个领域。以计算机科学为例,自然语言处理(NLP)中的隐狄利克雷分布(LDA)模型,以及杰弗里·辛顿(Geoffrey Hinton)早年提出的深度置信网络(DBN)模型,都充分应用了该方法。

1946年,美国洛斯阿拉莫斯国家实验室(Los Alamos Scientific Laboratory)的三位科学家约翰·冯·诺伊曼(John von Neumann)、斯塔尼斯拉夫·乌拉姆(Stan Ulam)和尼古拉斯·梅特罗波利斯(Nick Metropolis)共同发明了梅特罗波利斯算法(Metropolis algorithm),即后来为人熟知的“蒙特卡洛方法”。

算法原理: 假设在广场上画一个边长为1米的正方形,在正方形内部随意用粉笔画一个不规则的形状。现在要计算这个不规则图形的面积,应该如何操作呢?蒙特卡洛方法给出的答案是:均匀地向该正方形内撒 $N$($N$ 是一个极大的自然数)个黄豆,随后清点有多少个黄豆落在这个不规则几何形状内部,假设数量为 $M$。那么,这个奇怪形状的面积便近似于 $M/N$。$N$ 的值越大,计算出的结果就越精确。这里需要假定所有的豆子都平铺在一个平面上,且相互之间没有重叠。

应用举例(近似计算圆周率): 蒙特卡洛方法可以用于近似计算圆周率 $\pi$。

  1. 让计算机每次随机生成两个0到1之间的实数,构成一个二维坐标点。
  2. 判断该随机点是否位于单位圆内。
  3. 生成一系列随机点,并统计落在单位圆内部的点数与总点数的比例。 由于单位圆在其外接正方形中的面积之比为 $\pi : 4$,当随机点取得足够多时(尽管取 $10^9$ 个点时结果才在小数点后前4位与 $\pi$ 吻合),其结果将无限接近于圆周率。

1947年:单纯形法

单纯形法(Simplex method)是一种非常实用的、用于寻找最优基本可行解的运筹学方法。

1947年,兰德公司(RAND Corporation)的乔治·丹齐格(George Dantzig)发明了求解线性规划的单纯形法。自此之后,单纯形法成为了线性规划学科的重要基石。

基本思想:

  1. 首先找到一个基本可行解。
  2. 判断该解是否为最优解。
  3. 如果不是,则转换到相邻且能改善当前目标函数值的基本可行解。
  4. 持续迭代,直到找到最优解为止。

所谓线性规划,简单来说,就是给定一组线性约束条件(即所有变量均为一次幂),求一个特定目标函数的极值。例如约束条件为:

a_1 x_1 + b_1 x_2 + c_1 x_3 > 0

这听起来似乎有些抽象,但在现实世界中却有着极为广泛的应用。例如,对于一家生产型公司而言,其能够投入生产的人力和物力是有限的(这就构成了“线性约束条件”),而公司的核心目标是实现利润最大化(即“目标函数取最大值”)。由此可见,线性规划非常贴近现实生活。

作为运筹学(Operations Research)的重要组成部分,线性规划已成为管理科学领域不可或缺的工具。而丹齐格提出的单纯形法,正是求解此类线性规划问题的极其有效的一种解法。

1950年:Krylov子空间迭代法

Krylov子空间方法在提高大型科学与工程计算的效率方面发挥了至关重要的作用。

1950年,美国国家标准局(National Bureau of Standards)数值分析研究所的马格努斯·海斯滕斯(Magnus Hestenes)、爱德华·施蒂费尔(Eduard Stiefel)和科尼利厄斯·兰佐斯(Cornelius Lanczos)开创了Krylov子空间迭代法(Krylov subspace iteration methods)。

该方法主要用于求解大型线性方程组。当方程组规模 $n$ 极大时,直接进行精确计算会变得非常困难。而Krylov方法则巧妙地将其转换为如下形式的迭代计算来求解:

K x_{i+1} = K x_i + b - A x_i

这里的矩阵 $K$(来源于俄罗斯数学家Nikolai Krylov姓氏的首字母)是一个特意构造出来的、近似于矩阵 $A$ 的矩阵。这种迭代算法的精妙之处在于,它使得原本高度复杂的整体计算被分解转化为了阶段性的、易于处理的子步骤。

1951年:矩阵计算的分解方法

1951年,奥克里奇国家实验室(Oak Ridge National Laboratory)的阿尔斯通·豪斯霍尔德(Alston Householder)将其对矩阵计算的分解方法(Decompositional approach to matrix computations)进行了完整的规范化与理论化。

该算法从数学上证明了,任何矩阵都可以被分解为三角矩阵、对角矩阵、正交矩阵等特殊基本形式。这一理论与算法的深远意义在于,它使得开发灵活且高效的通用矩阵计算软件包成了一件水到渠成的事情。

1957年:优化的Fortran编译器

1957年,约翰·巴库斯(John Backus)执导带领IBM公司的一支团队开发了Fortran优化编译器(Fortran optimizing compiler)。

Fortran(亦译作“福传”)是由“Formula Translation”两个词组合缩写而成,意为“公式翻译”。它是世界上第一个被正式采用、并流传至今的高级编程语言。随着时代的发展,该语言仍在不断演进(如广为人知的Fortran 2008版本),至今在科学计算和数值分析领域仍有着举足轻重的地位。

1959-1961年:计算矩阵特征值的QR算法

1959至1961年间,位于英国伦敦的费伦蒂有限公司(Ferranti Ltd.)的J.G.F. 弗朗西斯(J.G.F. Francis)找到了一种稳定计算矩阵特征值的方法,这就是著名的QR算法(QR algorithm)。

这同样是一种与线性代数密切相关的算法。矩阵特征值的计算是矩阵运算中最核心的内容之一。传统的求解方案往往需要解高次方程求根,当问题规模极其庞大时,求解过程繁琐且极易因舍入误差而陷入困境。

算法精髓: QR算法是一种高效的迭代算法,它将目标矩阵巧妙地分解为一个正交矩阵与一个上三角矩阵的乘积。该方法将复杂的高阶方程求根难题分解成了阶段性的、易于计算的迭代步骤,从而使得利用计算机求解大规模矩阵的特征值成为了现实可能。

1962年:快速排序算法

1962年,来自伦敦埃利奥特兄弟有限公司(Elliott Brothers, Ltd.)的托尼·霍尔(Tony Hoare)正式提出快速排序(Quicksort)算法。这或许就是无数程序员在学习数据结构与算法时接触到的第一个耳熟能详的经典算法。

作为各大排序算法中的常青树,快速排序及其衍生变体的身影在现代计算机应用中随处可见。

基本思想: 该算法本质采用了分治法(Divide and Conquer):

  1. 在待排序的序列中选取基准元素,将序列分为左、右两半。
  2. 确保左边一半所有的元素总是“较小”的,而右边一半所有的元素总是“较大”的。
  3. 对左右子序列不断进行递归排序操作,直到整个序列完全有序。

说起快速排序算法,它其实只是托尼·霍尔爵士在学术生涯中不经意间的一个小小发现。他对于计算机科学的伟岸贡献实际上主要集中于形式化方法理论研究,以及推动了ALGOL 60编程语言的规范发明等方面。也正是因为这些难以磨灭的成就,他荣获了1980年度的图灵奖。

1965年:快速傅立叶变换

1965年,IBM T.J. 沃森研究中心(IBM T.J. Watson Research Center)的詹姆斯·库利(James Cooley),与普林斯顿大学及AT&T贝尔实验室(Princeton University and AT&T Bell Laboratories)的约翰·图基(John Tukey)携手推出了快速傅立叶变换(Fast Fourier transform,简称 FFT)。

快速傅立叶变换是离散傅立叶变换(后者是数字信号处理领域绝对的基石)的一种极速实现算法。

  • 卓越的时间复杂度: 其运算时间复杂度仅仅为 $O(N \log N)$ 级别。
  • 硬件易实现性: 相比于算力上的时间效率跨越,更重要的是快速傅立叶算法极其容易通过硬件结构(例如芯片)来实现。

正因如此,它在现代电子技术、通信工程、声学研究及数据处理领域得到了无比广泛的应用。

1977年:整数关系探测算法

1977年,杨百翰大学(Brigham Young University)的赫拉曼·弗格森(Helaman Ferguson)和罗德尼·福尔卡德(Rodney Forcade)共同提出了用于检测整数关系的算法(Integer relation detection algorithm)。

整数关系探测是一个渊源极深的古老数学问题,其历史甚至可溯源至欧几里德时代。具体而言,该问题是:给定一组实数 $X_1, X_2, \dots, X_n$,是否存在一组不全为零的整数 $a_1, a_2, \dots, a_n$,使得以下等式严格成立?

a_1 X_1 + a_2 X_2 + \dots + a_n X_n = 0

这个千百年来不断困扰数学家的悬案,最终在1977年被弗格森和福尔卡德妥善解决。时至今日,该探测算法已经被成功应用于一些前沿学科领域,例如被用于“简化量子场论中的费曼图(Feynman diagrams)的高阶计算”中。

1987年:快速多极算法

1987年,耶鲁大学(Yale University)的莱斯利·格林加德(Leslie Greengard)和弗拉基米尔·罗赫林(Vladimir Rokhlin)联手发明了快速多极算法(Fast multipole algorithm)。

该算法主要被用来计算由万有引力或静电力引起相互作用的 $N$ 个粒子的运动轨迹与状态。它能够进行极为精密与准确的模拟计算,典型宏观层面的应用如计算银河系中海量星体的运动过程,微观层面则表现为深刻揭示蛋白质大分子结构内部原子间的静电力相互作用。