在实践中最常使用哪种算法?


19

哪种算法最常用?

请为每个答案编写一个算法,并尽量使答案简短(一两行)。


卡夫,也许您应该在提供这么多之前等待回应?:)
Suresh Venkat 2010年

1
@Suresh:对不起。:)
Kaveh'9

3
最常在什么意义上?(实现该算法的不同计算机程序的数量;使用该算法的已安装软件的数量;该算法的执行次数;使用该算法处理的数据量;该算法使用的CPU秒数)。(学术界,工业界,家用PC?)是否有可能估算出这样的值?我们可以有任何数据来支持任何答案吗?
Jukka Suomela 2010年

1
正如Jukka Suomela指出的那样,这个问题太模糊了。如果不作进一步澄清,答案将不会比关于算法的教科书目录更好。
伊藤刚(Tsuyoshi Ito)2010年

1
John MacCormick最近有一本书:“改变未来的九种算法:驱动当今计算机的巧妙思想”。参见press.princeton.edu/titles/9528.html
亚历山德罗·

Answers:


18

快速傅立叶变换算法是每天由真实计算机系统解决的大多数算法问题吗?它必须很近。因此,我提名了Cooley-Tukey FFT算法


我喜欢这个,FFT被忽视了基本的计算机科学教育,但它肯定在我们的现代社会产生了巨大影响的算法,和我们身边有很多现代的东西捣鼓FFT所有的时间。
Jukka Suomela 2010年

14

乘法。

也许是最古老的非平凡算法之一,而且比FFT更能解决这个问题。


乘法不是一种算法,而是许多子问题的问题,这些子问题可以通过不同的算法解决:固定大小的整数和浮点数,由硬件或软件执行;可变大小的bignums(取模与否),矩阵,...
别再作恶了'

我指的是现代CPU中的硬件乘法电路(用于整数和浮点数;最后这两个并没有什么不同)。我的理解是,它们往往是同一基本方法的“恰如其分”的精心设计的版本–“长乘法”算法,这在中世纪已广为人知。
Jukka Suomela 2010年

我认为减法(比较)比乘法使用更多,并且我看不出任何将乘法算作算法而加法/减法不算的原因。但是,我不知道这是否可以作为答案。
伊藤刚(Tsuyoshi Ito)2010年

是的,加法和减法比乘法更经常使用–实际上,长乘法算法本质上将乘法减为加法。但是,我不知道是否可以在这里指定一个加减法算法?
Jukka Suomela 2010年

@JukkaSuomela:二进制补码加减法将是一个不错的选择。
John Gietzen 2012年

13

DijkstraBellman-Ford最短路径算法。有至少互联网作为2010年每个AS运行的是链路状态路由协议(Dijkstra算法)或距离向量路由协议(贝尔曼-福特)上35000个自治系统(AS)的活性。一个AS中的路由器通常每隔几分钟(例如10分钟)定期更新其表。

因此,Dijkstra和Bellman-Ford每天被处决的数量至少为500万。那只是来自路由器。

我们还没有计算出Google Maps之类的最短路径计算量,而最短路径计算应该很容易占到10倍。每天要执行五十亿次死刑并非易事。


每天执行10亿次执行听上去可能很多,但请记住,例如,地球上有数十亿部手机。这些东西一直在做什么?还是他们在每次通话中都在做什么?我不知道,但是我的猜测是,与最短路径相比,它们至少在做FFT方面要多得多。
Jukka Suomela

8

14
顺便说一句,快速排序是现实世界中最常用的排序算法吗?我快速浏览了一些常用编程语言中通用“ sort”功能的实现。Perl:最近似乎已经从quicksort切换到mergesort。Python:使用Timsort(合并排序/插入排序混合)。Java:以前是mergesort,现在是Timsort。数据库倾向于使用外部排序。quicksort已经是濒临灭绝的物种吗?
Jukka Suomela 2010年

我认为这是一个很好的观点。如果有人可以编辑答案,那就太好了。
Juan Bermejo Vega 2012年

@Juan,尽管Jukka提到的观点是正确的,但我认为没有任何理由可以编辑答案。
卡韦


7

我认为最常用的算法是奇偶校验(或可能是CRC或某种纠错代码),因为它们出现在每次RAM访问中。


对于通过任何基于IP的网络发送的每个数据包也至少使用一次
Claus Broch



4

通过转换为有限自动机来匹配正则表达式-我相信grep函数遵循这些原则。



3

很难想到比现代TCP实现中使用更广泛的算法:即,避免拥塞快速重传。虽然这取决于人们如何确定符合算法标准的条件...


但是,您真的可以比FFT(已经在此列表中)更频繁地使用TCP算法吗?如果我的计算机发送单个IP数据包(是否为TCP),它通常不会触发全部FFT计算吗?通常,数据包是通过使用WLAN,ADSL和GSM等技术在某个时刻传输的,我认为其中大多数使用的调制方式严重依赖FFT。
Jukka Suomela 2010年

我觉得你是对的。
列夫·雷津


2

SHA-1(通常是散列函数)。就执行次数而言,可能击败了大多数其他算法。



2

调度算法。世界各地的每个用户设备和服务器都使用它们。使用了多种变体,我发现了很多有关“多级反馈队列”的参考


1

此响应根据实际CPU周期解释“最频繁”。

我在20世纪70年代学习计算时,我回想起曾经读过的文章,其中绝大多数计算机(阅读:大型机)周期都用于排序。业务应用程序要求对分析和报告进行大量排序。我不认为这种变化有太大变化,但是其他应用程序(电子邮件,文字处理等)的兴起必定改变了两者的组合。由于需要对连续的字段进行排序以创建子排序,因此这些排序通常是稳定排序(不是Quicksort)。

但是严格来说,最常用的算法是毫无疑问的Windows系统等待进程执行的任何其他操作;-)。


1

Sprase矩阵向量乘法

...是几乎所有线性系统解决方案背后的计算主力。结果,它无论何时都可以运行

  • 科学家/工程师解决微分方程
  • 统计人员发现新的相关性(PCA)
  • Google运行pagerank
  • 您的手机可以通过GPS,加速度计,手机信号塔位置来预测您的位置
  • 您的汽车可调节您的悬架运动
  • 等等....

任何超级计算机或集群上的大多数FLOP都用在稀疏的mat-vec内部。


1

牛顿法。它用于计算平方根,用于计算除法。它可以用来进行线性编程。更一般地,它是(凸)优化的主力军。它可以通过最小化作用/能量来解决物理中的微分方程。


1

散列和红黑树。

它们已经在STL(hash_map,map)中实现,每个程序员都知道,无论何时您要存储由任意数据类型索引的某些信息,这样的容器都非常方便。



0

动态规划

我认为到目前为止,与调查中引用的其他算法相比,使用DP的频率更高。我推断“更多频率”是指程序员在现实生活中多久执行一次非平凡的算法概念,而不是调用某个算法的特定实现多少次。

DP具有多种功能,并且有很多面孔。有时我有些潜意识地使用它,后来才意识到我正在做DP。

当然,有些东西甚至比动态程序更常见,但它们大多是数据结构(数组,链表,哈希)。


7
这与其他建议有些不同,因为它是一种算法设计范例(类似于贪婪或原始对偶),而不仅仅是一个算法。
Jukka Suomela 2010年

0

字符串匹配,一直在应用程序软件中和数据库级别使用。

在确切的情况下,有几种相当复杂的算法(KMP,Boyer-Moore),其中一些算法可以实现亚线性期望运行时间。从CS的角度来研究它们也很有趣。

近似字符串匹配(即对齐)可能更有趣。您知道“自动校正”功能吗?同样,使用比对来完成对嘈杂的字符串数据(例如DNA)的搜索。

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.