全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 数据分析师(CDA)专版
4656 4
2016-02-17

原文:Marcos Otero

译者:伯乐在线 - Justin Wu

链接:http://blog.jobbole.com/70639/


不久前的某一天,我在浏览Reddit发现了一篇有趣的文章《统治世界的十大算法》,作者George Dvorsky在那篇文章中试图解释算法之于当今世界的重要性,以及哪些算法对人类文明最为重要。

此时此刻,如果你已经学过算法的话,那么在你阅读那篇文章时,你脑海中所浮现的第一件事也许是“作者是否明白算法是什么?”或是“Facebook的新闻提要是一种算法?”,因为如果Facebook的新闻提要也算是一种算法的话,那么最终你可以把几乎所有的东西都归类为算法。因此,在本文中我会试着去解释什么是算法,以及哪十个(也许更多)算法是真正统治世界的。

什么是算法?

直白地说,算法就是任何明确定义的计算过程,它接收一些值或集合作为输入,并产生一些值或集合作为输出。这样,算法就是将输入转换为输出的一系列计算过程。来源:Thomas H. Cormen, Chales E. Leiserson (2009), 《算法导论第三版》。

简而言之,我们可以说算法就是用来解决一个特定任务的一系列步骤(是的,不止计算机在使用算法,人类也同样如此)。目前,一个有效的算法应该含有三个重要特性:

1. 它必须是有限的:如果你设计的算法永无休止地尝试解决问题,那么它是无用的。


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


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

还有一个要点需要指出,算法不仅仅在计算机科学中使用,同时也存在于数学领域中。事实上,首个被记载的数学算法要追溯到公元前1600年,古巴比伦人开发了已知最早的算法,用作因式分解和计算平方根。这里,我们回答了前面所提到的那篇文章中的第一个问题,它认为算法是计算机范畴的实体,但如果你知晓算法这个词的真正内涵的话,真正统治世界的十大算法也能在数学书籍中找到(加法、减法、乘积等等)。

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

1. 归并排序,快速排序和堆排序

哪个排序算法最好?这取决于你的需求,这也是为什么我要将这三个使用频率较高的排序算法置于一处的原因。可能你比较偏爱其中一个,但它们都是同等重要的。

归并排序算法是目前为止我们拥有的最重要的算法之一。它是一种基于比较的排序算法,使用分治法解决那些原本复杂度为O(N^2)的问题。归并排序是由数学家John von Neumann于1945年发明的。

快速排序是解决排序问题的另一种途径,它使用就地分解算法,同时它也是一种分治算法。这个算法的问题在于它是不稳定的排序算法,但它在基于内存的数组排序上确实非常高效。

最后,堆排序算法使用一个优先队列降低数据的查找时间,它也是一种就地排序算法,同样也是不稳定的排序算法。

相较于曾经使用的其他排序算法(如冒泡排序),上述算法带来了显著的改进。事实上,多亏了它们,今天我们才有了数据挖掘、人工智能、链接分析,以及世界上大部分的计算机工具,也包括网络在内。

(推荐阅读:《视觉直观感受 7 种常用的排序算法》)


2. 傅立叶变换与快速傅立叶变换

整个数字世界都在使用这些简单而又强大的算法,将信号从频域转换为时域,反之亦然。事实上,正是归功于这些算法,你才能看到这篇文章。

互联网、你的WIFI、智能手机、电话、计算机、路由器、卫星,几乎所有内置计算机的东西都会以各种方式使用这些算法实现各自的功能。如果你没有学习这些重要的算法,你将无法获得电子、计算机或通信方面的学位。

编注:关于傅里叶变换,可以看看韩昊写的这篇文章《通俗讲解傅里叶变换【完整版】》。


3. Dijkstra 算法

毫无不夸张地说,如果没有这个算法,当今互联网将无法有效工作。这是一种图搜索算法,它被广泛应用在能够建模为图的问题中,用以找出两个节点之间的最短路径。

目前,即便我们已经拥有了解决最短路径问题的更好方法,Dijkstra 算法依然在那些重视稳定性的系统中得到应用。


4. RSA算法

如果没有信息加密和网络安全,互联网不会像现在那么重要。你可以认为“安全问题理所当然应该是美国国家安全局和其他情报机构的事情”或“你认为你身处在互联网是安全的,这太天真了”。但是,人们需要在他们花钱时保有安全感,毕竟你不会在网络服务器上输入你的信用卡号,如果你知道它是不安全的话。

在信息加密领域,有一个算法始终是世界上最重要的算法之一,它就是RSA算法。这个算法是由RSA公司的创始人所建立的,它使信息加密惠及千家万户,奠定了当今信息加密的运作基础。RSA算法用来解决一个简单而又复杂的问题:怎样在不同平台和终端用户之间共享公钥,继而实现信息加密(我想说明一下这个问题还没完全解决,我想我们需要基于这个方向做更多工作)。

5. 安全哈希算法

准确地说,它不能称之为是算法,它是美国国家标准暨技术学会定义的加密散列函数族中的一员,但是这族算法对整个世界的运作至关重要。从你的应用商店,你的邮件,你的杀毒软件,到你的浏览器等等,所有这些都在使用安全哈希算法,它能判断你是否下载了你想要的东西,也能判断你是否是中间人攻击或网络钓鱼攻击的受害者。

(推荐阅读:《加盐密码哈希:如何正确使用》)

6. 整数因式分解

这是在计算机领域被大量使用的数学算法,没有这个算法,信息加密会更不安全。该算法定义了一系列步骤,得到将一合数分解为更小因子的质数分解式。这被认为是一种FNP问题,它是NP分类问题的延伸,极其难以解决。

许多加密协议(如RSA算法)都基于这样一个原理:对大的合数作因式分解是非常困难的。如果一个算法能够快速地对任意整数进行因式分解,RSA的公钥加密体系就会失去其安全性。

量子计算的诞生使我们能够更容易地解决这类问题,同时它也打开了一个全新的领域,使得我们能够利用量子世界中的特性来保证系统安全。

7. 链接分析

在互联网时代,分析不同实体间的关系是相当重要的。从搜索引擎,社交网络,到营销分析工具,每个人都在不停寻找互联网的真正结构。

有证据显示,链接分析是公众心目中伴随着最多谬见和误解的算法之一。这里的问题在于,有很多不同的方式可以进行链接分析,也存在很多特性使这些算法看起来有细微的区别(这些区别允许该算法独立申请专利),但它们本质上是类似的。

链接分析背后的理念非常简单,以矩阵形式描绘出一张图,将问题转换为特征值问题。特征值是一种很好的渠道,它有助于展现图的结构以及每个节点的相对重要性。该算法是由Gabriel Pinski和Francis Narin于1976年建立的。

谁在使用这个算法?Google的Page Rank算法,Facebook向你展示的新闻提要(这就是为什么Facebook的新闻提要不是算法,只是使用算法的结果而已),Google+和Facebook的好友推荐,LinkedIn的工作和联系人推荐,Netflix和Hulu的电影,YouTuBe的视频,等等。虽然每个都有不同的目标和参数,但它们背后的数学理念是相同的。

最后,我想说明一点,尽管看上去Google是第一家使用这类算法的公司,然而在1996年(Google之前两年),Robin Li(李彦宏)所建立的一个小型搜索引擎“RankDex”就已经在它的网页排名机制中使用了这项理念。后来,HyperSearch的创始人Massimo Marchiori基于各网页之间的关系使用了另一种网页排名算法。(Google在它的专利中提到了这两位创始者)

(推荐阅读:《张洋:浅析PageRank算法》)

8. 比例积分微分算法

你是否曾经用过飞机、汽车、卫星服务或手机网络?你是否曾经在工厂工作或是看见过机器人?如果回答是肯定的,那么你应该已经见识过这个算法了。

大体上,这个算法使用一种控制回路反馈机制,将期望输出信号和实际输出信号之间的错误最小化。无论何处,只要你需要进行信号处理,或者你需要一套电子系统,用来自动化控制机械、液压或热力系统,这个算法都会有用武之地。

可以这样说,如果没有这个算法,现代文明将不复存在。

9. 数据压缩算法

要判断哪种数据压缩算法最为重要是很困难的,因为它取决于不同的应用环境。它们可以应用在zip和mp3上,也可以应用在JPEG和MPEG-2上。但众所周知,在所有结构中这些算法都极其重要。

除了显而易见的zip文件,在哪我们能够找到这些算法?这张网页就进行了数据压缩并被下载到你本地,同时我们还能在电子游戏、视频、音乐、数据存储、云计算、数据库等等地方找到这些算法。可以说,数据压缩算法处处可见,它们使系统成本更低、效率更高。

10. 随机数生成

现在我们还没有一个“真正的”随机数生成器,但我们已经有了一些伪随机数生成器,这够用了。随机数生成器的用途非常广泛,从互联联络、数据加密、安全哈希算法、电子游戏、人工智能、优化分析,到问题的初始条件、金融等等,都有它们的身影。

(推荐阅读:《当随机不够随机:一个在线扑克游戏的教训》)

最后,我想强调一下,上面这个列表经供参考,它并不完整。因为在机器学习、矩阵乘法、分类化等领域也有一些算法,它们对我们的世界同样重要,但在这里还没有提到。


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2016-2-17 11:14:56
作者July总结了一篇关于计算方法的文章《细数二十世纪最伟大的10大算法》

一、1946 蒙特卡洛方法

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 computingeigenvalues, 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 年图灵奖。

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

八、1965 快速傅立叶变换

[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.]

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

快速傅立叶算法是离散傅立叶算法(这可是数字信号处理的基石)的一种快速算法,其时间复杂度仅为O(Nlog(N));比时间效率更为重要的是,快速傅立叶算法非常容易用硬件实现,因此它在电子技术领域得到极其广泛的应用。

九、1977 整数关系探测算法

[1977: Helaman Ferguson and Rodney Forcade of Brigham Young University advance an integerrelation detection algorithm.]

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

整数关系探测是个古老的问题,其历史甚至可以追溯到欧几里德的时代。具体的说:给定—组实数X1,X2,...,Xn,是否存在不全为零的整数a1,a2,...an,使得:a1 x 1 +a2 x2 + . . . + an xn =0?这一年BrighamYoung大学的Helaman Ferguson 和Rodney Forcade解决了这一问题。该算法应用于“简化量子场论中的Feynman图的计算”。

十、1987 快速多极算法

[1987: Leslie Greengard and Vladimir Rokhlin of Yale University invent the fast multipolealgorithm.]

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

此快速多极算法用来计算“经由引力或静电力相互作用的N 个粒子运动的精确计算——例如银河系中的星体,或者蛋白质中的原子间的相互作用”。ok,了解即可。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-2-17 13:07:45
听说过一些,但不敢奢望。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-2-17 13:33:21
owlskipjack 发表于 2016-2-17 11:14
作者July总结了一篇关于计算方法的文章《细数二十世纪最伟大的10大算法》

一、1946 蒙特卡洛方法
人好
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-2-17 16:33:13
向伟大的数学及数学家们致敬!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群