部署核心算法


307

为了证明算法的重要性(例如,对于不从事理论研究甚至是完全不同领域的学生和教授),有时手头准备一些已经在商业,政府,或广泛使用的软件/硬件。

我正在寻找满足以下条件的示例:

  1. 使用该算法的软件/硬件现在应该被广泛使用。

  2. 该示例应具体。请参考特定的系统和特定的算法。
    例如,在“算法X对图像处理有用”中,术语“图像处理”不够具体;在“ Google搜索使用图算法”中,“图算法”一词不够明确。

  3. 该算法应在典型的本科生或博士学位中教授。算法或数据结构中的类。理想情况下,典型算法教科书中会介绍该算法。例如,“众所周知的系统X使用鲜为人知的算法Y”是不好的。


更新:

再次感谢您的出色回答和链接!有人评论说,很难满足标准,因为核心算法无处不在,很难指出特定的用途。我看到了困难。但是我认为值得举一些具体的例子,因为根据我的经验告诉人们:“看,算法很重要,因为算法无处不在!” 不起作用。


评论不作进一步讨论;此对话已转移至聊天
比昂·乔斯·汉森(BjørnKjos-Hanssen)

Answers:


473

在我看来,作为系统背后主要驱动力的算法更容易在非算法课程中找到,原因相同的原因是,具有即时应用的定理在应用数学课程中比在纯数学课程中更容易找到。实际问题很少在讲座中具有抽象问题的确切结构。可以争论的是,我认为没有理由将时尚算法的课程资料(例如Strassen乘法,AKS素数测试或Moser-Tardos算法)与实现视频数据库,优化编译器和操作系统的低级实际问题相关。 ,网络拥塞控制系统或任何其他系统。这些课程的价值在于学习有多种方法可以利用问题的结构来找到有效的解决方案。先进的算法也是遇到简单分析的简单算法的地方。因此,我不会放弃简单的随机算法或PageRank。

我认为您可以选择任何大型软件,并找到在其中实现的基本和高级算法。作为案例研究,我已经针对Linux内核进行了此操作,并展示了Chromium的一些示例。

Linux内核中的基本数据结构和算法

链接指向github上源代码

  1. 链表双链表,无锁链表
  2. B +带有注释的,告诉您在教科书中找不到的内容。

    一个相对简单的B + Tree实现。我将其写为学习练习,以了解B + Trees的工作原理。原来也是有用的。

    ...

    使用了教科书中不常见的技巧。最低值在右侧,而不是左侧。节点内所有使用的插槽均在左侧,所有未使用的插槽均包含NUL值。大多数操作只是在所有插槽上循环一次,然后在第一个NUL处终止。

  3. 用于互斥驱动程序等的优先级排序列表

  4. 红黑树用于调度,虚拟内存管理,跟踪文件描述符和目录条目等。
  5. 间隔树
  6. 基数树用于内存管理,与NFS相关的查找以及与网络相关的功能。

    基数树的常见用法是存储指向结构页的指针;

  7. 控制组系统中使用的优先堆,从字面上讲,是一种教科书实现。

    基于CLR的简单纯静态静态大小优先级堆,包含指针,第7章

  8. 哈希函数,参考Knuth和论文。

    Knuth建议在乘法哈希中使用与机器字可表示的最大整数近似的黄金比例的质数。Chuck Lever验证了此技术的有效性:

    http://www.citi.umich.edu/techreports/reports/citi-tr-00-1.pdf

    选择这些素数是位稀疏的,也就是说,对于乘法较慢的机器,对它们的运算可以使用移位和加法而不是乘法。

  9. 代码的某些部分(例如此驱动程序)实现了自己的哈希函数。

    使用旋转哈希算法的哈希函数

    Knuth,D.计算机编程艺术,第3卷:排序和搜索,第6.4章。艾迪生·韦斯利(1973)

  10. 用于实现索引节点文件系统完整性检查等的哈希表
  11. 位数组,用于处理标志,中断等,并在Knuth Vol.1中进行了介绍。4。

  12. 信号量自旋锁

  13. 二进制搜索用于中断处理寄存器高速缓存查找等。

  14. B树二叉搜索

  15. 深度优先搜索目录配置中使用的变体。

    对名称空间树执行修改后的深度优先遍历,从start_handle指定的节点开始(和结束)。只要找到与type参数匹配的节点,就会调用回调函数。如果回调函数返回非零值,则搜索将立即终止,并将此值返回给调用方。

  16. 广度优先搜索用于检查运行时锁定的正确性。

  17. 链接列表上的合并排序用于垃圾回收文件系统管理等。

  18. 在驱动程序库中,气泡排序也得到了惊人的实现。

  19. Knuth-Morris-Pratt字符串匹配

    由于Knuth,Morris和Pratt [1],实现了线性时间字符串匹配算法。他们的算法完全避免了转移函数DELTA的显式计算。它的匹配时间是O(n),对于n是length(文本),仅使用辅助函数PI [1..m],对于m是length(pattern),它是根据时间O(m)中的模式预先计算的。阵列PI允许根据需要“即时”有效地计算转移函数DELTA。粗略地说,对于SIGMA中的任何状态“ q” = 0,1,...,m和任何字符“ a”,值PI [“ q”]都包含独立于“ a”的信息,并且需要计算DELTA(“ q”,“ a”)2。由于数组PI仅具有m个条目,而DELTA具有O(m | SIGMA |)个条目,因此我们保存| SIGMA |的因数。通过计算PI而不是DELTA在预处理时间中进行计算。

    [1] Cormen,Leiserson,Rivest,Stein算法简介,第二版,麻省理工学院出版社

    [2]参见有限自动化理论

  20. Boyer-Moore模式与参考和建议相匹配,以决定何时使用替代方法。

    实现Boyer-Moore字符串匹配算法:

    [1]一种快速的字符串搜索算法,RS Boyer和Moore。计算机器协会通讯,1977,20(10),762-772页。 http://www.cs.utexas.edu/users/moore/publications/fstrpos.pdf

    [2]精确字符串匹配算法手册,Thierry Lecroq,2004年 http://www-igm.univ-mlv.fr/~lecroq/string/string.pdf

    注意:由于Boyer-Moore(BM)从右到左执行搜索匹配,因此仍然有可能将匹配分布在多个块上,在这种情况下,该算法将找不到任何巧合。

    如果您愿意确保此类事情永远不会发生,请改用Knuth-Pratt-Morris(KMP)实现。总之,根据您的设置选择适当的字符串搜索算法。

    假设您正在使用textsearch基础结构进行过滤,NIDS或
    任何其他类似的以安全性为重点的目标,然后使用KMP。否则,如果您真的很在意性能,则说您要对数据包进行分类以应用服务质量(QoS)策略,并且您不介意可能的匹配分布在多个片段上,然后进行BM。

Chromium Web浏览器中的数据结构和算法

链接指向Google代码上源代码。我只列出一些。我建议使用搜索功能查找您喜欢的算法或数据结构。

  1. 八角树

    该树还通过分配策略(分配器)进行参数化。该策略用于在C免费存储区或区域中分配列表。参见zone.h。

  2. Voronoi图在演示中使用。
  3. 基于Bresenham算法的制表
Chromium代码中包含的第三方代码中也有此类数据结构和算法。

  1. 二叉树
  2. 红黑树

    朱利安·沃克的总结

    红黑的树是有趣的野兽。人们认为它们比AVL树(它们的直接竞争对手)更简单,而且乍一看似乎是这种情况,因为插入很容易。但是,当人们开始使用删除算法时,红黑树变得非常棘手。但是,这种增加的复杂性的平衡点是可以使用单次自上而下的算法来实现插入和删除。对于AVL树,情况并非如此,只有插入算法可以自上而下地编写。从AVL树删除需要自下而上的算法。

    ...

    红黑树很流行,因为大多数数据结构都带有异想天开的名称。例如,在Java和C ++中,库映射结构通常是用红黑树实现的。红黑树的速度也可与AVL树媲美。虽然平衡效果不是很好,但在红黑树中,保持平衡所需的工作通常更好。周围有一些误解,但在很大程度上,关于红黑树的炒作是准确的。

  3. AVL树
  4. Rabin-Karp字符串匹配用于压缩。
  5. 计算自动机的后缀
  6. 苹果公司实现的布隆过滤器
  7. 布雷森纳姆算法

编程语言库

我认为他们值得考虑。编程语言设计人员认为,一些工程师值得花时间和精力来实现这些数据结构和算法,而其他人则不必这样做。库的存在是我们可以找到在用C编写的软件中重新实现的基本数据结构的原因的一部分,而对于Java应用程序则是如此。

  1. C ++ STL包括列表,堆栈,队列,地图,载体和算法排序,搜索和堆操作
  2. Java API非常广泛,涵盖了更多内容。
  3. 所述升压C ++库包括像博耶-Moore和德纳莫里斯-普拉特字符串匹配算法的算法。

分配和调度算法

我发现这些很有趣,因为即使它们被称为启发式算法,您使用的策略也决定了所需的算法和数据结构的类型,因此需要了解堆栈和队列。

  1. 可以使用多种方式来实现“最近最少使用”。一个基于列表的执行在Linux内核中。
  2. 其他可能性包括先进先出,最少使用和循环赛。
  3. VAX / VMS系统使用了FIFO的变体。
  4. 时钟算法理查德·卡尔用于页面框架更换Linux操作系统。
  5. 英特尔i860处理器使用了随机替换策略。
  6. 自适应替换缓存在某些IBM存储控制器中使用,在PostgreSQL中使用,尽管出于专利方面的考虑只是短暂的
  7. 好友存储器分配算法,这是由在Knuth的卷TAOCP讨论。Linux内核中使用了1,而FreeBSD和facebook中使用了jemalloc并发分配器。

* nix系统中的核心工具

  1. grepawk都从正则表达式实现了NFA的Thompson-McNaughton-Yamada构造,这显然甚至超过了Perl的实现
  2. tsort实现拓扑排序。
  3. fgrep实现Aho-Corasick字符串匹配算法。
  4. GNU的grep实现了博耶-穆尔算法根据作者Mike Haertel。
  5. Unix上的crypt(1)在Enigma机器中实现了加密算法的一种变体。
  6. 由Doug McIllroy实现的 Unix diff基于与James Hunt共同编写的原型,其性能优于用于计算Levenshtein距离的标准动态编程算法。该 Linux版本的计算最小编辑距离。

密码算法

这可能是很长的清单。加密算法在可以执行安全通信或交易的所有软件中实施。

  1. Merkle树,特别是Tiger Tree Hash变体,被用于点对点应用程序,例如GTK GnutellaLimeWire
  2. MD5用于提供软件包的校验和,并用于* nix系统(Linux实现)上的完整性检查,并且在Windows和OS X上也受支持。
  3. OpenSSL实现了许多加密算法,包括AES,Blowfish,DES,SHA-1,SHA-2,RSA,DES等。

编译器

  1. LALR解析是由yacc和bison实现的。
  2. 大多数基于SSA格式的优化编译器都使用支配器算法。
  3. lexflex将正则表达式编译为NFA。

压缩和图像处理

  1. 用于GIF图像格式的Lempel-Ziv算法是在图像处理程序中实现的,从* nix实用程序开始,转换为复杂程序。
  2. 运行长度编码用于生成PCX文件(由原始的Paintbrush程序使用),压缩的BMP文件和TIFF文件。
  3. 小波压缩是JPEG 2000的基础,因此所有生成JPEG 2000文件的数码相机都将实现此算法。
  4. Reed-Solomon错误校正是在Linux内核,CD驱动器,条形码读取器中实现的,并与卷积相结合,用于从Voyager进行图像传输。

冲突驱动子句学习

自2000年以来,SAT求解器在工业基准上的运行时间(通常来自硬件行业,尽管也使用了其他来源)通常每年都以近乎指数的速度减少。此开发的一个非常重要的部分是冲突驱动子句学习算法,该算法将Davis Logemann和Loveland的原始论文中的布尔约束传播算法与源自约束编程和人工智能研究的子句学习技术相结合。对于特定的工业建模,SAT被认为是一个简单的问题(请参阅此讨论)。对我来说,这是近来最大的成功案例之一,因为它结合了多年来的算法进步,巧妙的工程思想,实验评估以及共同的共同努力来解决该问题。Malik和Zhang撰写CACM文章很不错。许多大学都曾教授过这种算法(在这种情况下,我参加过四次),但通常在逻辑或形式方法课程中讲授。

SAT求解器的应用众多。IBM,英特尔和许多其他公司都有自己的SAT求解器实现。OpenSUSE中的程序包管理器还使用SAT求解器。


5
@ HuckBennett,CDCL是一种由启发式参数化的算法,但它本身并不是一种启发式。它具有最坏的情况下的指数行为,但证明这一点并非易事。此外,我们无法证明做得更好,这是我们在实践中可以做的最好的,所以我觉得所有计算机科学家都应该知道这一点!至于LRU,FIFO等,它们是启发式的,但与ARC一样,可能需要巧妙的算法或数据结构来实现。
Vijay D

9
这样的评论是否不适用于Simplex:最初并没有被很好地理解,后来被证明是指数式的,但是在实践中起作用,后来又被证明具有多项式平滑复杂性?CDCL对于算法分析很有趣,因为您需要经历证明的复杂性才能得出表现出最坏情况行为的公式族,并且还需要证明它比某些分辨率变体更简洁。有各种各样的扩展,例如对称性打破和自给自足的技术,对此分析仍然是开放的。
Vijay D

28
对于学生来说,这是一个宝藏
neo1691 2013年

2
@EmanueleViola,我添加了更多示例。该职位已经很长了,所以我不想扩展它。也许您应该问一个关于Dijkstra,Simplex,Bloom过滤器作为诸如Linux,Chrome,Web服务器等真实系统的一部分的实现的新问题。我认为如果您是特定的,则您更有可能获得良好的答案。
Vijay D

4
黑客新闻和r /编程。
Vijay D

40

PageRank是最著名的此类算法之一。由Google的联合创始人拉里·佩奇(Larry Page)和合著者开发,它构成了Google原始搜索引擎的基础,并广受赞誉,可以帮助他们获得比当时的竞争对手更好的搜索结果。

我们想象一个“随机冲浪者”从某个网页开始,然后反复单击一个随机链接将他带到新页面。问题是,“冲浪者将在每一页上花费多少时间?” 冲浪者在页面上花费的时间越多,页面的重要性就越高。

更正式地说,我们将互联网视为图表,其中页面是节点,链接是有向边。然后,我们可以将冲浪者的行为建模为在图上的随机游动,或者等效为具有过渡矩阵的马尔可夫链。在处理了一些问题以确保马尔可夫链是遍历的(如果页面没有传出链接时,冲浪者会去哪里?)之后,我们将冲浪者在每一页上花费的时间计算为马尔可夫链的稳态分布。M

从某种意义上说,该算法本身是微不足道的- 对于大和任意初始分布我们只计算。这仅相当于重复的矩阵矩阵或矩阵向量乘法。算法的内容主要集中在设置(确保遍历性,证明遍历马尔可夫链具有独特的稳态分布)和收敛性分析(取决于的谱隙)上。 ķ π 0中号Mkπ0kπ0M


7
我认为这不是典型的算法材料。
Manu

14
顺便说一句,我首先在算法类中学习了PageRank。实际上,我认为教授之所以选择它,是因为它是“实践中使用的算法”的一个很好的例子。如果将示例限制为“ CLRS的前半部分”类型的内容,则示例列表将太长或太琐碎-快速排序,B树和Dijkstra的算法无处不在。
Huck Bennett

2
我们向大学生教授PageRank。
亚伦·罗斯

6
我也向本科生授课(包括在必修的算法课程和更专业的图形算法选修课中)。
David Eppstein

2
我是一名选修课的本科生,学习了PageRank。
Vijay D

33

我会提到用于解决线性编程问题的Simplex方法/算法的广泛使用的CPLEX软件(或类似软件)实现。它是经济和运筹学中最常用的算法。

“如果要统计一下哪个数学问题正在消耗世界上大多数计算机时间,那么(不计算排序和搜索之类的数据库处理问题)答案可能是线性编程。 ”(L。Lovász,新线性规划算法比单纯形法更好或更糟?Math。Intelligencer 2(3)(1979/80)141-146。)

单纯形算法在理论上也有很大的影响。参见,例如,(多项式)Hirsch猜想

我猜想是典型的本科生或博士学位。算法中的类处理单纯形算法(包括线性代数的基本算法,例如高斯消除法)。

(其他成功的算法,包括用于排序的Quicksort,在《算法》中列出 。)


“经济和运筹学”还不够具体。CPLEX也不是我一直在寻找的示例类型,因为它只是算法的实现。例如,如果gcc编译器使用了simplex方法,则将有所不同。
Manu

12
我认为当谈到经济和OR时,“线性编程问题”足够具体。另外,CPLEX指的是实现背后的算法。
vb le

16
“如今,大多数大型公司都使用线性编程来对产品定价和管理供应链。运输公司使用它来选择最便宜的方式,以整合,协调和路由许多产品的运输,这些产品从全球分销的供应商到受容量限制的遥远市场。石油工业将其用于勘探,混合,生产调度和分配。钢铁工业将其用于评估铁矿石,探索添加焦炉和选择产品……” news.stanford.edu/news/2005/may25/ dantzigobit-052505.html
Sasho Nikolov

谢谢。但是我发现报价含糊不清。我想,如果我在一群学生面前说,其中一半会入睡;-)如果我们说类似的话,那就不一样了:UPS使用LP运送包裹的方式如下...我不是说这样的例子很难找到,但是鉴于“大多数大型公司都使用LP”,我希望我们至少可以指出一个
Manu

10
自2007年起,LAX(机场)就开始使用软件来解决Stackelberg游戏,从而调度安全人员。解决大型LP是整个过程的一部分,请参见例如teamcore.usc.edu/ARMOR-LAX。除此之外,我还会问您的运营研究部门的某人:他们通常会有很多关于在现实生活中使用LP的战争故事
Sasho Nikolov 2013年

30

据我了解,长期以来,国家居民匹配计划只是将Gale-Shapley算法直接用于稳定婚姻问题。此后已进行了稍微更新,以处理一些额外的细节,例如配偶分配(又称“两体问题”)等。


我不确定稳定婚姻是否是典型的算法材料。
Manu

16
它在Tardos和Kleinberg算法设计书中,也在Motwani的Randomized Algorithms中,并且这两本书都被广泛使用。在算法课程中可能不会普遍教授稳定的婚姻,但是在许多课程中都肯定会教授这种婚姻。
Sasho Nikolov

10
快速搜索显示它已出现在伯克利的CS70麻省理工学院的6.042UMD的CMSC451等中
mhum 2013年

1
有趣的是,当您添加配偶分配时,问题会变成NP完整:arxiv.org/abs/1308.4534。然而,在实践中,这似乎并没有引起太多的问题:en.wikipedia.org/wiki/...
约书亚Grochow

2
@EmanueleViola虽然在传统上可能不包括在内,但它在Kleinberg / Tardos书中的收录使它更受欢迎,(如果不是,则应该如此!)
Suresh Venkat

24

如果您还包括博士学位级别的东西,那么许多(大多数?)研究生CS程序都包含一些编码理论课程。如果您有一门编码理论的课程,那么您肯定会讲授Reed-Solomon代码(它是光盘工作原理的组成部分)以及用于JPEG,MP3和ZIP文件格式的霍夫曼编码。根据课程的方向,您还可以介绍以GIF格式使用的Lempel-Ziv。就我个人而言,我在大学算法课程中获得了Lempel-Ziv,但我认为这可能是不典型的。


1
我得到了关于霍夫曼编码作为本科生的讲座,这是项目所必需的。
Brian S

霍夫曼属于《 CLRS》的第一章之一,因此绝对可以
胜任

21

GNU grep是一种命令行工具,用于在一个或多个输入文件中搜索包含与指定模式匹配的行的代码。众所周知,grep非常快!以下是其作者Mike Haertel的话(摘自此处):

GNU grep uses the well-known Boyer-Moore algorithm, which looks first for the
final letter of the target string, and uses a lookup table to tell it how far
ahead it can skip in the input whenever it finds a non-matching character.

19

更普遍的是,Kanellakis奖是由ACM授予的,正是因为这些在实践中产生重大影响的理论发现。

2012年的奖项是针对位置敏感的哈希,它已成为减少数据挖掘中针对近邻问题的降维方法的首选方法(相对易教-至少是算法本身)


我认为这是可以讲授的,但不能广泛讲授。
Manu

3
不幸的是,但事实如此。但是,LSH的变体(例如Count-min草图和亲属)开始出现在“大数据”或“数据挖掘”课程中。例如,我在算法课程中教授布隆过滤器。
Suresh Venkat 2013年

作为个人经验,LSH并未针对“大数据”(1亿项)实例进行扩展。
lynxoid13年

1
@lynxoid是一个单独的讨论/问题:)。还有的地方足够的例子工作,我认为这是有关此问题的讨论。
Suresh Venkat

18

来自数据流算法的CountMin SketchCount Sketch用于工业系统中的网络流量分析和非常大的非结构化数据的分析。这些是数据结构,用于汇总少量空间中大量项目的出现频率。当然,它们大概会这样做,并且可以保证的是,很有可能,任何项目的频率都近似于所有项目总“质量” 的分数之内(质量是第一或第二力矩)的频率矢量)。这足以找到“趋势”项,这是许多应用程序中所需要的。ε

这些数据结构的工业用途的一些示例是:

  • Google 用于非结构化数据分析的Sawzall系统使用Count Sketch来实现“最受欢迎的商品”功能
  • AT&T的用于网络流量监控的Gigascope “流数据库”系统实现了CountMin草图。
  • Sprint的持续监控(CMON)系统实现了 CountMin。

这也是一个收集有关CountMin应用程序信息的网站

就教学而言,我知道普林斯顿大学的离散数学课程教授基本的素描技术。我在第一门算法课程中教过CountMin草图。在任何情况下,CountMin的分析都比几乎任何其他随机算法的分析都简单:这是成对独立性和Markov不等式的直接应用。如果这不是大多数算法课程中的标准教材,我认为是出于历史原因。


1
很好的例子(尽管现在还不是很核心的算法)。
Manu

16

在过去的十年中,通过各种肾脏供体匹配计划,算法被用于增加肾脏移植的数量(和质量,我认为?)。我一直在寻找有关此问题的最新消息时遇到麻烦,但是这里至少有一些提示:

  • 直到2007年,配对捐赠联盟才使用Abraham,Blum和Sandholm的算法。他们可能仍在使用它,但我无法通过在线搜索找到它。尽管此算法几乎肯定不在“标准”课程中涵盖,但它结合了在这些课程中肯定会讲授的几个基本思想,可以为通常为NP完全的问题(循环覆盖的一种变体)提供足够好的算法)。

  • 国家肾脏登记处还使用一些标准算法,包括(一点)CPLEX。这导致了实际执行的移植链连接了60人

这是我最喜欢的例子之一,不仅是算法的成功,而且是研究算法以解决NP完全问题的重要性。他们实际上可以挽救生命,而且已经做到了!


此外,这些算法的更简单版本用于交易棋盘游戏:okasaki.blogspot.co.uk/2008/03/what-heck-is-math-trade.html
Radu GRIGore

15

维特比算法仍被广泛用于语音识别和多种其他应用中:http : //en.wikipedia.org/wiki/Viterbi_algorithm该算法本身是基本的动态编程。

来自维基百科:“维特比算法是安德鲁·维特比(Andrew Viterbi)于1967年提出的,它是一种用于在嘈杂的数字通信链路上进行卷积码的解码算法。[1]该算法已广泛应用于解码CDMA和GSM数字蜂窝网络中使用的卷积码,拨号调制解调器,卫星,深空通信和802.11无线LAN。现在,它还普遍用于语音识别,语音合成,关键字识别,计算语言学和生物信息学。例如,语音到文本(语音)识别),将声音信号视为观察到的事件序列,并将文本字符串视为声音信号的“隐藏原因”。Viterbi算法在给定声音信号的情况下找到最可能的文本字符串。”


13
  1. A *用于许多个人导航设备(又称GPS单位)
  2. A *的定义非常明确,并且实现起来非常简单。
  3. A *并非完全无关紧要,但不需要博士学位。了解它。

在游戏设计中也经常教授A *。我不认为现代3D游戏通常会使用A *进行NPC导航,但是2D /等距游戏以及较旧的游戏确实会使用该算法。
Brian S

@BrianS您是否知道3D游戏中使用的寻路算法的示例,特别是游戏中的敌人NPC(例如射击者NPC)我记得读过类似的文章...将地图划分为六边形,然后将其用作节点而不是正方形,从而使移动更加流畅。
Goodwine

@Goodwine,对不起,我没有3D游戏中任何实际的寻路算法示例。我的个人经验是在类似“立方体”的环境(由立方体制成的地图上放置角色,尽管3D渲染,角色基本上是2D)和用于测试玩家角色的虚拟AI。
Brian S

12

查看Jens Vygen的项目BonnTools for Chip Design。 http://www.or.uni-bonn.de/~vygen/projects.html 我听过一些有关此的演讲,还看了他们的一些论文。他们使用Raghavan-Thompson样式的随机四舍五入以及乘性权重更新方法来解决大规模的多商品流LP。但是,像任何大型项目一样,他们也需要进行一些工程设计,但是该方法非常基于众所周知的算法。


我来看一下,但这听起来不像典型的算法材料。
Manu

8
嗯,随机四舍五入通常在博士学位级别的算法课程中教授,不是吗?
Chandra Chekuri 2013年

2
为什么只是随机取整?Sanjeev Arora,Elad Hazan和Satyen Kale认为,甚至多重加权更新方法也足以在UG级别上教授:)“我们认为我们的元算法及其分析非常简单和有用,因此应将它们视为基本工具。教给所有算法学生,以及分治制,动态编程,随机采样等。” (请参阅cs.princeton.edu/~arora/pubs/MWsurvey.pdf)。
Jagadish


10

令我惊讶的是,在上面所有花哨的算法中,没有人提到过古老的Lempel-Ziv压缩算法系列(于1977/78发明)。

  1. 这些信息无处不在-文本到图像进行流处理。LZ *很可能是现有的最常用算法家族。
  2. 字典压缩是压缩理论上的重大突破,与Shannon-Fano风格方法截然不同。
  3. 该系列中的算法非常简单易懂。

更新资料

显然已经简短地提到了它。


10

奇异值分解(SVD)与统计因子分析主成分分析有很强的联系,并且可以在本科线性代数或统计学课程中理解,并且具有许多重要的理论属性。它还在图像压缩算法中起作用。它在价值100万美元的Netflix奖项竞赛(历史上全球最大的数据挖掘竞赛之一)的获奖作品中扮演了关键角色,现在已在其网站上实施以预测用户收视率。它也已知与起源于生物学理论的Hebbian自组织神经网络高度相关。

梯度下降也有一些联系,它在机器学习人工神经网络中被广泛使用,并且作为一种非常普遍应用的优化技术,在这种情况下,牛顿法是一种基本的二维形式。有一种用于获得SVD的梯度下降算法。


10

寻找欧拉路径是基因组组装的基础-在处理完整基因组时(生物信息学,医学,法医学,生态学)通常执行此任务。

更新忘记了这一明显的问题:UPS,FedEx,USPS都必须每晚解决大型旅行商问题。为他们节省了很多时间和金钱,使他们可以按最佳路线安排司机。

UPDATE2最小反馈顶点集问题用于许多操作系统中的死锁解决。


您确定TSP是包裹运送公司要解决的问题吗?我认为更大的实际挑战是背包和其他包装问题。
安德拉斯·萨拉蒙

司机的分配每天都在变化(即,UPS的家伙不必每天都去同一所房子),因此必须每天更新路线。它不是纯粹的TSP,它还存在其他一些限制,例如单向街道,不掉头,在街道的一侧而不是另一侧运送包裹。
lynxoid13年

我敢肯定包装也很重要。
lynoidoid

9

我喜欢这种系统,该系统可通过以下最大匹配算法(配对和无私的肾脏捐赠)来挽救英国肾脏移植的最大生命。他们将需要肾脏的人与不相配的朋友/亲戚相匹配,与处于相同情况的其他人以最大的方式进行捐赠。然后在捐赠日,所有捐赠者同时进行捐赠,然后迅速将肾脏运往全国各地。


8

这本相对较新的书值得考虑,以方便,扩展/收集的形式作为问题的完整/详细答案,并且可以用作算法课程的补充材料。[其中一些已经被提及;强烈的重叠本身是值得注意的。]


第二参考文献最初来自2000年1月/ 2000年2月号的《科学与工程计算》,这是美国物理学会和IEEE计算机学会的联合出版物。由田纳西大学和橡树岭国家实验室的客座编辑Jack Dongarra和国防分析研究所计算科学中心的Francis Sullivan共同编辑
vzn13年


6

思考非常基本的算法

  1. 随机数生成器随处可见,特别是在所有游戏中。
  2. 数据库由许多算法组成,包括B +,哈希,优先级队列,正则表达式,加密,排序等。我的一个朋友说SGBD位于计算食物链的顶部。
  3. 排序无处不在,例如在Excel中。实际上,它在现实生活中一直被使用,但是通常人类会使用即席算法
  4. 到处都使用奇偶校验位
  5. 霍夫曼编码在压缩和传输软件中
  6. 堆栈(LIFO)随处可见。内部编程语言,CPU等...

很高兴表明它们出现在现实生活中:

A.许多团体使用一种覆盖树算法进行通信,方法是在人们之间分层划分电话列表。B.十字路口的汽车通常使用轮询算法(以自愿方式)C.大多数地方,例如银行和医院,以FIFO算法组织其客户


4
排序不是一种算法。这是一项任务,即您希望执行的任务,您必须为此设计(或在实践中选择)算法。
David Richerby

这些似乎不是问题所要求的特定示例。
卡夫

SGBD == RDBMS供您参考。
Autodidact

6

在CT扫描的医学应用中出现了令人着迷的算法问题。在计算机断层扫描(CT)中,人体从不同角度暴露于X射线。扫描仪的一端是X射线发射器,另一端是传感器。通过这样的一系列扫描,可以重建图像供医师检查!

滤波反投影 算法是用于从一组扫描的图像的重建的基础。该算法实际上是一种近似问题的一种形式,其中“信号”以奈奎斯特速率以下采样。该算法在所有医院中都在“幕后”使用,基本的滤波反投影利用诸如傅立叶变换的本科数学来实现傅立叶切片定理


6

FFT的一个例子

我曾经帮助将FFT算法移植到其他系统语言。

该算法用于确定电视/互联网/电话同轴传输中的断线。基本上,技术人员会要求将信号发送到客户的邮箱,与此同时,他们会调出特定客户的统计信息的实时显示,例如QoS,dB等。数据和图表来确定房子和电线杆之间几英尺内存在部分中断的地方(或告诉我多次中断的地方)。

如上所述,FFT已被广泛使用,但这是我在实践中看到的最明显和明显的(就为什么和如何而言)之一。

抱歉,我必须保持较高水平。


5

Bresenham的line算法是我遇到的最有用的算法。易于理解的Ive在很多应用中使用了它,从线条绘制到复杂的夹板,3d铸造引擎再到复杂的多边形渲染器,以及复杂的动画和缩放比例使用。



2

维基百科在列表中或多或少地分类了一些算法/应用程序。Microsoft提供了引用次数最多的论文,但未对计算机科学领域或应用程序作任何明确的解释。由黄教授汇编的来自不同CS会议的时间顺序清单_http://jeffhuang.com/best_paper_awards.html_。

频谱聚类是一种优雅的聚类算法,众所周知的是由Jianbo Shi和Jitendra Malik引入的归一化分割算法进行图像分割。它在数据集群应用程序中也得到了很好的开发,是两个社区之间的良好交集。


-2

另外两个个人最喜欢的示例牢固地扎根于计算机科学,但可能会被抽象主义理论家轻易忽略,在过去的几十年中,它们已经取得了巨大的/变革性的进步,并在日常生活中产生了从大到大的实际/应用影响。已经有整整一代人长大了,他们不了解世界。基本上是建模和仿真的类别。

  • 物理模拟算法。主要使用牛顿定律,但使用其他定律(例如流体动力学)。用于各种应用,包括工程应用,视频游戏,有时还包括电影。通过使虚拟/测试设计经受模拟应力,这也有助于显着提高例如汽车和飞机的安全性,效率或可靠性。生物信息学的一个主要的相关正在进行的研究领域,在生物学上具有重大意义,例如药物设计,疾病预防等:蛋白质折叠/结构预测。还应注意的是,今年的诺贝尔化学奖因化学模拟而被授予沃瑟尔的勒维特(Karplus),勒沃特(Larvit)。物理模拟算法高度参与核武器安全/测试 例如在洛斯阿拉莫斯实验室。

  • 光线追踪/ CGI算法。仅仅在几十年前,它就作为一个研究主题开始了(一个朋友获得了CS编写光线跟踪算法的硕士学位),但后来在游戏和电影制作业务中得到了广泛应用,达到了非同寻常的水平,导致大量电影中的特殊效果。这些行业投资了数十亿美元,并依赖这些算法,整个大型公司都基于利用这些算法,例如Pixar。这项技术最初主要用于例如科幻电影,但现在如此普及,甚至在“典型”电影中也被常规使用。例如最近The Great Gatsby 严重依赖CGI效果来绘制令人信服的或风格化的环境,修饰电影/角色等。


-3

Rosetta Code列出了通过编程任务(692)和具有语义MediaWiki的编程语言(518)所应用的算法。


这是“部署在商业,政府或广泛使用的软件/硬件中的核心算法...”的一个例子吗?
David Richerby

将其他答案中列出的每个优秀算法的实现交叉引用到Wikipedia / DBpedia URI将会很有用。所有这些算法都没有Wikipedia / DBpedia URI。但是有Rosetta代码页。
Wes Turner 2013年

bigocheatsheet.com还列出了Big-O的复杂性,并提供了有关许多算法的Wikipedia文章链接。
Wes Turner 2013年

该问题要求提供在重要软件中使用的核心算法的示例。“这是一个用一百万种语言实现算法的网站”根本没有回答这个问题。实际上,这与所要查找的内容完全相反。
David Richerby 2013年

尽管如此,还是有用的,与上下文相关的参考。
Wes Turner

-5

到此为止,也许已经提到了该受众感兴趣的所有主要/首选算法。但是,还有一些值得一提的完整性。以及有关什么被认为是重要算法的分析在这里是相关的。

在CS和IT领域中,似乎很早以前在AI中就注意到了一种现象,称为“移动球门柱”。这是一种心理现象,该领域进展相对较快,但是人们很快就适应了“新常态”,并在完成(即被淡化或最小化)后取得了平凡或回想起来不多的真实甚至突破性进展。这个问题在算法从研发到“部署”的过程中得到了高度重视。在稍后的评论中引用问题的作者:

实际上,从算法的角度来看,所编写的所有代码中可忽略的一部分正在实现任何有趣的事情。

但这是有问题的,基本上是以TCS为中心的“算法”一词的重新定义。大概是有趣的算法被改进了。这是否意味着如果将问题简化为高级算法,则不再“有趣”?而“先进”显然是一个移动的目标。因此,有一种方法可以狭义地广义地定义“算法” 。TCS定义似乎随上下文而改变,但是请注意,即使在TCS中,也存在向广泛定义的趋势,例如在所谓的“算法镜头”中

有时最无所不在的算法也最容易被忽略!互联网和WWW是算法的大型环境/近生态环境。仍然相对年轻,只有大约20年的历史(大约1991年发明),它在短时间内迅速成倍增长。WWW网站的增长甚至可能超过了著名的指数摩尔定律。

许多复杂的算法都支持Internet / WWW。互联网在路由器中内置了复杂的路由算法(再次为数十亿美元的公司(例如Cisco)供电)。一些先进的理论可以应用于路由算法。这些算法是数十年前新兴的,先进的/前沿研究的主题,但是现在已经如此微调和充分理解,以至于它有些看不见。

我们不应该很快忘记几十年前,一流的研究人员甚至不确定互联网世界是否可行或是否可行(在早期的分组交换研究中见过,这是从先前的电路交换开始的一种激进的新设计模式),并且即使在几年前,人们也担心它会在某个时候无法扩展规模,并且由于音量的急剧上升而开始失败。

它还使用复杂的错误检测/纠正功能。互联网可能人类有史以来最大,最容错的系统,并且仍在不断发展。

接下来,有充分的理由可以证明支持WWW的算法是先进的。HTTP和Web服务器经过高度优化/优化,并且还使用高级安全/加密协议(HTTPS)。网页的呈现逻辑在HTML5CSS3以及Javascript编程语言中已经变得极为先进。

相对较新的CSS具有类似于OOP编程的各种原理,例如可重用性和继承。说到排版,TeX是Knuth发明的一种重要的,内部复杂的科学排版系统(与编程语言没有太大不同),现在可以在网页上呈现(并且可能在成千上万的科学论文中使用)。

基于集体智能的互联网上算法的另一个相对较新的领域仍在兴起。stackexchange软件本身就是复杂的集体情报系统的一个示例。社交网络还展现了集体智慧的关键特征,并且不断增加其功能以增加智慧(例如,facebook“ Likes”只有几年的历史)。评级系统领域基于协作过滤算法,并且仍在基于新的研究和应用而不断发展。

简而言之,所有革命性的成功都在改变人们的日常体验,实际上远远超出了仅仅“目标”。作为问题标题,部署了所有核心算法。现在它无处不在且无形,以至于类似于IT表达式“管道的一部分”。


许多引用可以添加到此。这是一个开始:DARPA和 Waldrop 的互联网革命
vzn

关于互联网优化的另一个参考,akamai联合创始人丹尼·莱文(Danny Lewin)的传记,“改变互联网的天才”
vzn

-8

上电复位是一种非常成功的(硬件)算法。

如果没有一个系统,当通电时计算机处于已知状态,那么其他任何事情都不会发生

上电复位是为什么任何有CPU的东西都可以工作的原因,无论是嵌入式还是其他方式。

下次您遇到程序员和计算机科学家的水坑时,请举起一杯樱桃苏打水重新开机。


5
上电复位不是算法。这是一项任务,即您希望执行的任务,必须为此设计一个算法。
David Richerby
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.