英文原文:The real 10 algorithms that dominate our world
不久前的某一天,我在浏览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)算法
毫无不夸张地说,如果没有这个算法,当今互联网将无法有效工作。这是一种图搜索算法,它被广泛应用在能够建模为图的问题中,用以找出两个节点之间的最短路径。
目前,即便我们已经拥有了解决最短路径问题的更好方法,迪杰斯特拉算法依然在那些重视稳定性的系统中得到应用。
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. 随机数生成
现在我们还没有一个“真正的”随机数生成器,但我们已经有了一些伪随机数生成器,这够用了。随机数生成器的用途非常广泛,从互联联络、数据加密、安全哈希算法、电子游戏、人工智能、优化分析,到问题的初始条件、金融等等,都有它们的身影。
(推荐阅读:《当随机不够随机:一个在线扑克游戏的教训》)
最后,我想强调一下,上面这个列表经供参考,它并不完整。因为在机器学习、矩阵乘法、分类化等领域也有一些算法,它们对我们的世界同样重要,但在这里还没有提到。
相关推荐
"数学建模十大算法程序详解.zip"这个压缩包包含了十个常用的数学建模算法,这些算法通常在解决实际问题时扮演着重要角色。下面,我们将详细讨论这些算法及其在MATLAB环境中的应用。 1. **线性规划**:线性规划是一...
经过与现有的NSGAⅡ算法以及传统的小世界遗传算法对比,改进小世界遗传算法在处理大规模调度问题时表现出了更快的收敛速度和更高的求解质量。 这项研究为今后将复杂网络特性用于求解大规模调度问题提供了新的思路和...
里面是一下世界比较经典的算法,很有趣味性,适合入门学习。
然而,传统的灰度世界算法在某些特定情况下可能失效,特别是在给定图像仅有少量几种颜色或者存在大面积单一颜色区域时(例如大片的蓝色天空或绿色草地)。为了解决这些问题,研究者提出了一些改进算法,包括基于标准...
2. **分治算法**:将大问题分解为若干小问题,分别解决后再合并答案。比如快速排序、归并排序等都是典型的分治策略应用。在数学建模中,分治算法可以用于解决复杂度较高的问题,提高计算效率。 3. **动态规划(DP)...
Matlab十大算法源代码 Floyd算法 动态规划 分治算法 概率算法 灰色预测 聚类算法 类比法 蒙特卡洛 模拟退火,禁忌搜索,遗传算法,神经网络-MATLAB程序合集 模拟退火算法 神经网络 搜索算法 贪婪算法 图论...
数据挖掘十大算法是该领域内影响力和应用范围最广的算法集合,对于数据分析师和数据科学工程师而言,掌握这些算法是必要的技能之一。 1. C4.5算法:C4.5是一种决策树算法,它是基于信息增益准则来选择特征,构建...
十大算法精讲资料中包含了<树>、<链表栈递归>、<图论>、<贪心法与动态规划>、<认识机器学习>、<概率分治机器学习>、等算法的详细介绍。
常见10大算法,从原理,动图解析到代码实现,逐步分析,让你轻松入门算法
本文将详细讨论被称为“数模十大算法”的一系列方法,特别是其中与遗传学相关的算法。这十大算法是解决数学建模问题的常用工具,涵盖了优化、模拟、预测等多个方面。 首先,我们要了解的是遗传算法(Genetic ...
数据挖掘十大算法,清华大学出版社。 有两个文件,小的没有封面,根据需要自行阅读吧。
数模竞赛十大算法,数学建模中必不可少的计算方法,附代码
以下是对"数学建模十大算法详解"中可能包含的一些重要算法的详细介绍: 1. **线性规划**:这是最基础的优化算法之一,用于在满足一组线性约束条件下,最大化或最小化一个线性目标函数。例如,资源分配问题、生产...
本文将深入探讨Weka中包含的十大算法,包括AdaBoost、Apriori、C4.5、CART、EM、K-means、KNN、PageRank、SVM以及朴素贝叶斯。 1. AdaBoost(Adaptive Boosting):这是一种集成学习方法,通过迭代和调整弱分类器的...
10. **分治算法**:分治策略将大问题分解为小问题,分别解决后再合并,如快速排序、归并排序和大数乘法等。 压缩包中的文件名显示了具体应用实例,如使用MATLAB实现的算法程序,如穷举法求解0-1整数规划问题,以及...
关于比较重要比较常见的软件算法的说明介绍,复杂的算法都是基于这些算法之上。
20世纪10大算法(数学、电子信息、计算机等专业必备基本背景知识
本篇文章将深入探讨标题和描述中提到的一些核心算法,包括动态规划、分治算法、概率算法、模拟退火算法、搜索算法、贪婪算法、在线MATLAB应用、遗传算法以及组合算法。 1. **动态规划**:动态规划是一种解决具有...
因此,对于非常长的序列,该算法的运行时间可能会变得相当长,不适合大规模数据处理。 **应用与改进** 为了提高效率,科学家们提出了多种优化策略,如使用Hirschberg算法进行半全局比对,或者采用Smith-Waterman的...