保罗·埃尔多斯(Paul Erdos)谈论了“书”,其中上帝保留了每个数学定理的最优雅的证明。这甚至启发了一本书(我相信现在是第四版):书中的证明。
如果上帝有一本类似的算法书,那么您认为哪种算法是候选人?
如果可能的话,还请提供可点击的参考以及使之起作用的关键见解。
请每个答案仅使用一种算法。
保罗·埃尔多斯(Paul Erdos)谈论了“书”,其中上帝保留了每个数学定理的最优雅的证明。这甚至启发了一本书(我相信现在是第四版):书中的证明。
如果上帝有一本类似的算法书,那么您认为哪种算法是候选人?
如果可能的话,还请提供可点击的参考以及使之起作用的关键见解。
请每个答案仅使用一种算法。
Answers:
联合查找是一个美丽的问题,其最佳算法/数据结构(不相交集森林)是基于意大利面条堆栈的。尽管非常简单直观,足以向聪明的孩子讲解,但花了好几年时间才能确定其运行时间。最终,它的行为被发现与逆阿克曼函数有关,该函数的发现标志着关于计算的观点发生了转变(实际上已包含在希尔伯特的《无限》中)。
Wikipedia很好地介绍了Disjoint Set Forests。
Knuth-Morris-Pratt字符串匹配。您将看到的最漂亮的八行代码。
百隆,弗洛伊德,普拉特,维斯特和的Tarjan的算法来找到ķ个未排序列表的元素以线性时间是一个美丽的算法,只有工作,因为数字是恰到好处,以适应在主定理。内容如下:
二进制搜索是我遇到过的最简单,最漂亮,最有用的算法。
我很惊讶没有在这里看到所有对的最短路径的Floyd-Warshall算法:
d[]: 2D array. d[i,j] is the cost of edge ij, or inf if there is no such edge.
for k from 1 to n:
for i from 1 to n:
for j from 1 to n:
d[i,j] = min(d[i,j], d[i,k] + d[k,j])
考虑到可能存在边时,最短,最清晰的非平凡算法之一和性能非常敏捷。那将是我进行动态编程的招贤纳士!O (n 2)
可能看起来有些琐碎(尤其是与其他答案相比),但是我认为Quicksort确实很优雅。我记得当我第一次看到它时,我认为它确实很复杂,但是现在看来太简单了。
用Schwartz-Zippel引理进行多项式恒等式检验:
如果某人在半夜把您叫醒,并要求您测试两个单变量多项式表达式的身份,您可能会将它们简化为乘积和的形式,并比较结构身份。不幸的是,减少可能要花费指数时间。这类似于将布尔表达式简化为析取范式。
假设您是喜欢随机算法的那种,那么您的下一个尝试可能是在随机选择的点上评估多项式以查找反例,并声明多项式如果通过了足够的测试就很可能是相同的。Schwartz-Zippel引理表明,随着分数数量的增加,假阳性的机会会迅速减少。
没有确定的算法可以在多项式时间内运行。
深度优先搜索。它是许多其他算法的基础。这也是欺骗性简单:例如,如果你通过一个栈替换在BFS执行队列中,你得到DFS?
Dijkstra的算法:具有非负边路径成本的图的单源最短路径问题。它无处不在,是那里最漂亮的算法之一。没有它,就无法路由互联网-它是路由协议IS-IS和OSPF(开放式最短路径优先)的核心部分。
Gentry的完全同态加密方案(在理想晶格上或在整数上)非常漂亮。它允许第三方在不访问私钥的情况下对加密数据执行任意计算。
加密方案是基于几个敏锐的观察结果。
在他的论文中,克雷格·金特里(Craig Gentry)解决了密码学中一个长期存在(且华丽)的开放问题。确实存在完全同态方案的事实要求我们认识到,可计算性存在一些固有的结构,否则我们可能会忽略它们。
http://crypto.stanford.edu/craig/craig-thesis.pdf
构造后缀数组的线性时间算法确实很漂亮,尽管它并没有得到应有的认可http://www.cs.helsinki.fi/u/tpkarkka/publications/icalp03.pdf
高斯消除。它完成了从欧几里得GCD算法到Knuth-Bendix的泛化序列。
在乌龟和野兔算法。我喜欢它,因为我确信即使我一生都在浪费时间去寻找它,我也绝不会想出这样的主意。
欧几里得证明无穷多个素数的一个基本且“琐碎”的例子:
MAX-CUT的2逼近 -对每个顶点独立地,以相等的概率将其分配给两个分区之一。
我一直都喜欢Christofides的算法,该算法为公制TSP提供(3/2)近似值。实际上,称呼我为好,但我什至喜欢它之前的2-近似算法。Christofides通过添加奇数度顶点的匹配项(而不是复制所有边缘)来使最小权重的生成树Eulerian的技巧简单而优雅,并且几乎没有理由说服这种匹配的权重不超过一半最佳游览。
合并排序。简单,优雅,高效。
线性编程的算法:单纯形,椭圆形和内点法。
Marcus Hutter 针对所有定义明确的问题的最快和最短算法。
这种做法与清单中其他产品的精神背道而驰,因为它只是理论上的而不是实践上的利益,但是标题再次说明了一切。对于那些只看算法渐近行为的人来说,也许应该把它作为一个警示故事。
Knuth的算法X可以找到精确覆盖问题的所有解决方案。他提出的有效实现它的技术如此神奇:Dancing Links。
我认为我们必须包括Schieber-Vishkin,它可以在恒定时间内回答最低的共同祖先查询,并在线性时间内对森林进行预处理。
我喜欢Knuth在第4卷Fascicle 1中的论述以及他的沉思。他说他花了整整两天的时间才能完全理解它,我记得他的话:
我认为它很漂亮,但令人惊讶的是,它在文学作品中受到了很大的反响(..)它是基于使我兴奋的数学方法。