在过去的几十年中,哪些算法对人类有重要意义?[关闭]


40

在过去的几十年中,哪个世界上最重要的算法对人类贡献最大?

我认为这是开发人员应了解的良好常识。

更新:
如果可能,请保留特定编程算法的答案。
我想得到最重要的列表,每个答案只有一个算法。
请考虑说明算法为何如此重要和重要...


2
之所以关闭,是因为(到目前为止)有四个人认为它“不是一个真正的问题”,这可能是因为我们没有一个真正的想法,孤立地知道什么是重要的编程算法。
David Thornley,2010年

2
它可能是题外话,但这是一个真正的问题。
杰里米

1
+1好问题。我建议在cstheory.stackexchange.com上再询问一次
Aleksandr Levchuk 2010年

1
你为什么要回答自己的问题?几次?

2
没有错误的答案+无限数量的答案+明确的评论要求“每个答案一个” +作者发布了自己的几个答案=教科书中的非建设性问题。我知道它很旧,但是让我们关闭它。
亚伦诺特,2011年

Answers:


59

公/私钥加密非常重要。没有它,互联网商务将无处不在。


4
+1并添加到您的答案中,RSA。
2010年

将密码代码(例如RSA)转化为实际解决方案时,涉及一整套算法和最佳实践。
Donal Fellows,

37

Dijkstra的算法

该算法存在于世界上的每台路由器中,用于识别网络中两个节点之间最佳路由


你确定吗?大多数路由器要么知道该IP编号属于它,然后将其转发到本地网络上的计算机,要么知道一个更了解的路由器-默认路由器-在这种情况下,数据包将到达该路由器。大型路由器可能知道,对于IP地址范围X1-Y1,数据包应到达路由器R1,对于范围X2-Y2,数据包应到达路由器R2,以此类推。这不涉及Dijkstras算法。

2
@ThorbjørnRavn Andersen:但是,为了让路由器知道这些信息,某个时候某人将不得不使用Dijkstra的算法。是的,它并不是用于实际路由每个数据包,而是用于确定大型网络上的路由表。+1。
Billy ONeal 2010年

@Billy,您究竟期望在哪里实际使用Dijkstra算法?

@ThorbjørnRavn Andersen:据我了解,它在OSPF中起着作用,这是为小型网络选择正确路由的基础。较大网络之间的连接使用BGP,这是基于策略的。我不确定BGP是否使用Dijkstra的算法。
Billy ONeal 2010年

3
@Billy,但我的反对意见是“存在于世界上每一个路由器中”。我认为那是完全错误的。

30

快速傅立叶变换(FFT)

FFT是一种非常重要且广泛使用的从采样信号提取有用信息的方法。

快速傅立叶变换(FFT)是一种有效的算法,可以计算离散傅立叶变换(DFT)及其逆。


4
我曾经有一个老板,几十年前,他为PDP-11编写了一系列FFT函数。他在《大众科学》的背面出售了一副带有这些功能的打孔卡,并获得了相当不错的收入。显然,他让人们使用他的代码进行从信号处理到股票市场预测的所有工作。
丹·雷

26

网页排名

PageRank是一种链接分析算法,以Larry Page命名,由Google Internet搜索引擎使用,该算法为 超链接的文档集(例如,万维网)中的每个元素分配数值权重,目的是“测量”其相对集内重要性。


哈哈,我们的答案相隔仅2秒,对不起:)
Maksee 2010年

没问题!:)
Amir Rezaei 2010年

36
我从未意识到它是以拉里·佩奇(Larry Page)命名的。我一直以为这个名称与网页有关。
JohnFx 2010年

1
@JohnFx哇,不要开玩笑!
Mark C 2010年

+1:但是,如果人类不知道实际的算法,是否可以限定?(IIRC维基百科是一个近似值)
史蒂文·埃弗里斯

22

数据压缩算法

在计算机科学和信息论中,数据压缩或源编码是通过使用特定的编码方案,使用比未编码表示要使用的位数(或其他信息承载单元)更少的位(或其他信息承载单元)对信息进行编码的过程。


2
确实,我认为基本压缩算法LZW可被视为软件工程中最精美的算法之一。
mojuba 2010年

“如果可能,请提供特定算法的名称”

14

史密斯·沃特曼(和史密斯·沃特曼)

这可能太牵强,所以请发表评论。

Smith-Waterman:序列比对算法

我认为这样的例子之一是Smith-Waterman和Needleman-Wunsch算法及其近似。它们基本上都在做同一件事:两个或多个字符串(序列)对齐。生物学具有重要意义。当DNA或蛋白质序列比对后,就会揭示出结构,功能和进化相似性的区域。

高炉作为史密斯沃特曼的后裔

一种近似史密斯-沃特曼的启发式方法是BLAST。它允许在大型数据库序列中搜索生物学相似性。BLAST的普及性非常好-它很可能是生物学中使用最广泛的算法。生物信息学和基因组学的新领域具有比BLAST更精确的Smith-Waterman / Needleman-Wunsch算法的更新更好的近似值。

基因组大会,史密斯·沃特曼的后裔

Smith-Waterman和Needleman-Wunsch的高通量逼近速度比BLAST快,可用于从shot弹枪测序中组装基因组-测序仪机器的产物是从基因组任意部分读取的大量DNA(十亿)。非常短(50至100个核苷酸)。该方法用于完成人类基因组计划。所有现代测序都是通过这种方式完成的。

多序列比对Smith-Waterman的扩展

存在大量的多序列比对算法-它们近似于Smith-Waterman / Needleman-Wunsch的多序列版本。多个序列作为一个组同时彼此对齐。与成对配对相比,这是一个困难得多的问题,但是解决方案可提供对相关序列的生物学功能,结构和进化历史的更多了解。


您好,欢迎来到程序员!您可能希望针对此处提出的每种算法,将答案分解为一个,因为对于这样的列表问题,习惯上是这样,以方便投票和排序。
Yi Jiang

@Yi Jiang:我的万神殿!我将您的评论误解为“促进呕吐”。:-/
Hannibal Lecter博士2010年

在这里,我只讨论一种算法
-Smith

13

Siam将以下内容命名为20世纪最重要的算法:

1946年:针对Monte Carlo的Metropolis算法。通过使用随机过程,该算法提供了一种有效的方法,可以解决那些过于复杂而无法准确解决的问题。

1947年:线性规划的单纯形法。解决计划和决策中常见问题的绝佳解决方案。

1950年:Krylov子空间迭代方法。一种快速求解科学计算中大量存在的线性方程的技术。

1951年:矩阵计算的分解方法。数值线性代数的一组技术。

1957年:Fortran优化编译器。将高级代码转换为有效的计算机可读代码。

1959年:用于计算特征值的QR算法。另一个至关重要的矩阵运算变得迅速而实用。

1962年:用于排序的Quicksort算法。用于高效处理大型数据库。

1965年:快速傅立叶变换。也许是当今使用最广泛的算法,它将波形(如声音)分解为周期性分量。

1977年:整数关系检测。一种快速查找由看似无关的数字满足的简单方程式的快速方法。

1987年:快速多极方法。在解决n体计算的复杂性方面的突破,应用于从天体力学到蛋白质折叠的问题。

我个人将用PageRank替换整数关系检测


1
在此列表中,我将添加两本书,尽管它们更多地是关于20世纪的“最​​重要的定理”:五个黄金法则amazon.com/Five-Golden-Rules-20th-Century-Mathematics/dp/…,以及五项黄金法则。amazon.com/Five-More-Golden-Rules-20th-Century/dp/0471395285
Tangurena,2010年

蒙特卡洛技术仍然或多或少地以原始形式使用。FFT和Quicksort也是如此。其余大多数我根本不熟悉。与更现代的方法相比,用于LP的Simplex方法根本无法扩展。
David Thornley 2010年

9

PageRank,喜欢还是讨厌,但它每天都会影响全球数以百万计的人的决策和行动。


9

如果我必须列出当今计算机中使用的前3个最重要的算法,我会说:

  1. 二元搜寻
  2. 快速排序
  3. Dijkstra的算法

二进制搜索算法就是不断用缩小的排序列表内的项目,大多数的索引查找将使用这些方针的东西在某些时候。该算法可在o(log n)时间内搜索有序列表。

快速排序算法终于设法得到排序下降到为O(n log n)的平均情况,并为O(n ^ 2)最坏的情况。排序是计算机中最常见的数据任务之一,也是最昂贵的任务之一,改进平均案例排序是效率方面的巨大进步。

如前所述,Dijkstra算法在图形中的点之间产生最短路径。它广泛用于各种路由应用程序,最广泛地用于Internet本身,以确保使用经过缠结的互连路由器网的最快路径。


二进制搜索必须非常非常古老……我的意思是,它是“过去”的形式,并且处于“十年”之中,但是它已经存在了数百年。
柯克·布罗德赫斯特

@柯克·布罗德赫斯特(Kirk Broadhurst):尽管如此,它对于计算机来说是一个非常重要的算法。不论人类何时开始受孕。
2011年

8

贝叶斯定理

它可能对将收件箱中浪费时间的垃圾邮件数量保持在可管理的水平做出了最大贡献。

当然,我已经在许多其他有价值的应用程序中使用了它,但我最喜欢SPAM杀戮。


我会给你竖起大拇指,但这是一个定理(最好的定理之一),而不是一个算法。但是,许多算法都基于该定理。
阿米尔·雷扎伊

我只是试图将它们全部归为一类通用算法,但是从技术上来说,您是正确的。
JohnFx 2010年

@AmirR技术上正确,最好的一种正确!
Mark C

7

蒂姆·索特

这是PythonJava 7Android现在使用的排序算法

基本上:

  • O(N log N)最坏的情况(不会退化)
  • O(N)用于几乎排序的列表(实际上N-1完全在已排序的列表上)

和美丽吗?很稳定!因此适合根据各种标准进行多遍分选。

顺便说一下,如果有人手头有优化的C ++实现...


它不能为Θ(NlogN),因为它在已排序的列表上具有更好的行为。O(NlogN)是正确的符号。
Donal Fellows,

尽管这是一个不错的选择,但我当然不会将其称为“过去几十年来发明的最伟大的算法之一”。Timsort所基于的Mergesort是真正的成就。
比利·奥尼尔

6

对我而言,用于解决3D计算机动画中可见性问题的所有算法似乎都很关键。

画家的算法

画家的算法(也称为优先级填充)是3D计算机图形中可见性问题的最简单解决方案之一。将3D场景投影到2D平面上时,有必要确定哪些多边形可见,哪些多边形隐藏。

Z缓冲

在计算机图形学中,z缓冲是对三维(3-D)图形中图像深度坐标的管理,通常在硬件中完成,有时在软件中完成。这是可见性问题的一种解决方案,可见性问题是确定渲染场景的哪些元素可见以及哪些元素被隐藏的问题。画家的算法是另一种常见的解决方案,尽管效率较低,但也可以处理非透明场景元素。Z缓冲也称为深度缓冲。

隐藏表面确定

在3D计算机图形学中,隐藏表面确定(也称为隐藏表面去除(HSR),遮挡剔除(OC)或可见表面确定(VSD))是用于确定从某个角度看哪些表面和部分表面不可见的过程隐藏表面确定算法是解决可见性问题的方法,可见度问题是3D计算机图形学领域的第一个主要问题,隐藏表面确定过程有时被称为“隐藏”,这种算法有时被称为“隐藏器”线渲染的类似物是隐藏线去除,例如,需要隐藏表面来确定正确渲染图像的位置,以便在虚拟现实中无法看穿墙壁。


3

解决您当前问题所需的任何一种。


1
那就是我要说的。现在我不必说了。
罗伯特·哈维

哪个不是一个好的答案。无论哪种算法对人类都不重要。
阿米尔·雷扎伊

6
这不是一个特定的算法,即使它可能对人类也不重要。
杰森

3

Soundex是用于通过声音索引名称的语音算法。


soundex对人类有何贡献?
barjak,2010年

它提高了使用自然语言的能力,纠正了拼写和区域发音上的细微差异。
萨尔


3

MP3

尽管它是比特定算法更笼统的术语,但我还是将MP3称为不同算法和技术的集合,这些算法和技术可以协同工作以生成这种有损音频格式。

在“数字时代”,这无疑是非常重要的。


3

Runge-Kutta数值积分。没有它,许多模拟将是不可能的。没有太空计划,没有核能,没有弹道系统,没有运动模拟,没有防弹背心,没有碰撞测试模拟,没有流体运动模拟,没有化学相互作用模拟,没有抗震建筑物……清单还在继续。


+1 @ j172我知道这一点,它在数值分析和模拟中非常有用。
阿米尔·雷扎伊


2

1
!我当然希望人们在生产代码中不要使用quicksort。更重要的是,mergesort出现得较早,并且几乎一样快。(希望大多数代码在Introsort上使用某些变体)
Billy ONeal 2010年

2
@Billy ONeal,在.NET中排序就是Quicksort。因此,任何调用List <T> .Sort()的程序都会在生产中使用quicksort。
史蒂文·埃弗斯

@SnOrfus:你有那句话的证据吗?据我了解,List <t> .Sort是基于introsort的。
Billy ONeal

3
@Billy奥尼尔:直接从MSDN - msdn.microsoft.com/en-us/library/b0zbh7b6.aspx
ysolik

3
@Thorbjørn:它仍然不是一个好的通用算法。Introsort 快速排序,但是如果超出给定的递归深度,它将切换到堆排序。这样可以使人具有快速排序的良好特性,但是即使算法选择了错误的数据点,也始终可以避免病理情况。
Billy ONeal

1

插入排序

易于实现,在小列表上非常快,并且在合并排序/快速排序实现中用于加速它们。它很稳定,并且可以在O(n)排序列表上(按升序排序时)。



1

卡尔曼滤波

它被广泛用于导航,目标跟踪(几乎用于任何传感器:雷达,声纳,FLIR,激光雷达)。一本教科书显示了磁盘驱动器控制器中的应用程序。机器人控制系统经常使用卡尔曼滤波器。


0

口语和书面语言。

它们是当前将知识从一件事转移到另一件事的最有效算法之一。没有语言,公民社会就不会存在,信息也无法传达。


5
-1:可以使用自然语言来表达算法,但是自然语言不是算法。
史蒂文·埃弗斯

2
您会说压缩算法不是算法吗?所有语言所做的只是压缩从源传递到接收者的信息。与其他任何算法一样,它具有必须遵循的特定规则(语法),并且需要输入(您的经验)并产生不同的输出(知识)。我看不到您如何不能将语言视为一种算法。
Malfist 2010年

它在许多方面都无法满足算法的所有标准定义。
詹姆斯·恢复莫妮卡·波尔克(Monica Polk)2010年

0

的数据结构和其相关联的对堆建设和维护算法。

并表示对Quicksort的尊重。即使不是总是这样的选择,它也是计算机科学历史发展中的基本算法之一,并且是理解递归和算法分析的重要工具。它很漂亮,是的,我喜欢它。


0

索引算法,例如B树,B +树,哈希索引,二叉树索引等。用于索引大量数据。



-1

蛮力算法!

许多人低估了这种蛮力算法。实际上,它主要用于解决没有模式的问题。我非常喜欢!


5
那不是算法。这是一种算法。
亚当李尔

这是一种破坏加密的方法。
阿米尔·雷扎伊

我认为它也被归类为算法。“从x到y开始做某事。” <---算法对不对?
xport 2010年

算法是完成特定任务的一系列步骤。这不是特定的。
安托

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.