“经典算法”的真实世界实现

时间:2008-11-30 12:21:30

标签: algorithm language-agnostic

我想知道你们中有多少人实施了计算机科学的“ classical algorithms ”,如Dijkstra's algorithm数据结构(例如二元搜索树) )在现实世界,而不是学术项目?

当有大量的库,框架和API为您提供相同的功能时,了解这些算法和数据结构是否有益于我们的日常工作?

12 个答案:

答案 0 :(得分:15)

  

当有大量的库,框架和API为您提供相同的功能时,了解这些算法和数据结构是否有益于我们的日常工作?

库不知道您的问题域是什么,并且无法选择正确的算法来完成工作。这就是我认为了解它们很重要的原因:然后你可以正确选择算法来解决你的问题。

答案 1 :(得分:8)

理解您的工具是否有益处,而不仅仅是知道它们存在?

是的,当然有。举一个简单的例子,你不认为知道List(或你的语言的等效动态数组实现)和LinkedList(或你的语言等价物)有什么区别是有好处的吗?知道一个人具有恒定的随机访问时间,而另一个是线性的,这一点非常重要。如果在序列的中间插入一个值,则需要N个副本,而另一个可以在恒定时间内完成。

您是否认为理解相同的排序算法并不总是最优的?例如,对于几乎排序的数据,快速排序很糟糕?如果你不了解引擎盖下发生的事情,天真只是调用Sort()并希望最好的可能会变得非常昂贵。

当然,你可能不需要很多算法,但即便如此,只要了解它们的工作方式,就可以让自己更容易找到有效的算法来解决其他无关的问题。

答案 2 :(得分:8)

知道或能够理解这些算法非常重要,这些都是您交易的工具。这并不意味着你必须能够在一小时内从内存中实现A *。但是你应该能够弄清楚使用红黑树而不是普通的不平衡树的优点是什么可以决定你是否需要它。 需要能够判断算法是否适合解决问题。

这可能听起来像学校一样,但这些“经典算法”并不是为了给大学生提供考试问题而发明的,它们是为了解决问题或改进现有解决方案而发明的,就像数组,链表或堆栈一样编写程序的构建块也是其中的一部分。就像在数学中你从加法和减法转向整合和区分一样,这些都是先进的技术,可以帮助你解决那里的问题。

它们可能不会直接适用于您的问题或工作情况,但从长远来看,了解它们将有助于您作为专业软件工程师。

为了回答你的问题,我最近为游戏实施了A *。

答案 3 :(得分:5)

好吧,有人必须编写库。在地图软件公司工作时,我实现了Dijkstra,以及二叉搜索树,b树,n-ary树,bk-trees和隐藏的马尔可夫模型。

此外,如果您想要的只是一个“众所周知”的算法,并且您还希望自由专业化并优化它,如果它对性能至关重要,包括整个库似乎是一个糟糕的选择。

答案 4 :(得分:4)

在我之前的EDA公司工作场所,我们实现了Prim和Dijsktra算法的版本,不相交的集合数据结构,A *搜索等等。所有这些都具有现实世界的意义。我认为这取决于问题域 - 一些域更加算法密集,而另一些域则更少。

话虽如此,走路还行,我认为重新实施STLJava Generics没有商业理由。在许多情况下,标准库比“发明轮子”更好。您在核心应用程序附近越多,实现教科书算法或数据结构的可能性就越大。

答案 5 :(得分:4)

我们使用Knuth SemiNumeric的p-random数字生成器的本地实现作为一些统计处理的辅助

答案 6 :(得分:2)

如果您从不使用性能关键代码,请认为自己很幸运。但是,我认为这种情况不切实际。性能问题可能发生在任然后有必要知道如何解决这个问题。显然,仅仅知道一些算法名称在这里是不够的 - 除非你想要实现它们并一个接一个地尝试它们。

不,了解(至少某些)不同算法的内部运作对于衡量其优势和劣势以及分析它们如何处理您的情况非常重要。

显然,如果有一个图书馆已经完全按照你的需要实现了,那你就非常幸运。但是让我们面对它,即使有这样的库,使用它通常也不是完全直接的(至少,接口和数据表示通常必须进行调整)所以知道期待什么仍然是好的。

答案 7 :(得分:2)

用于pac man克隆的A *。我花了好几个星期才真正开始,但直到今天我认为这是一件美丽的事情。

答案 8 :(得分:2)

我必须从数值分析中实现一些经典算法。编写自己的文件比连接现有库更容易。此外,我不得不在经典算法上编写变体,因为教科书案例不适合我的应用程序。

对于经典数据结构,我几乎总是使用标准库,例如STL for C ++。最近有一次,当我认为STL没有我需要的结构(一堆)时,我自己滚动,只是让某人几乎立即指出我不需要这样做。

答案 9 :(得分:2)

我在实际工作中使用的经典算法:

  • 拓扑排序

  • 一棵红黑树(虽然我会 承认我只需要实施 插入该应用程序和 它只用在原型中)。 这习惯于实现一个 “有序的dict”类型结构 蟒。

  • 优先级队列

  • 各种状态机

  • 可能还有一两个我记不住的了。

至于问题的第二部分:

理解算法如何工作,它们的复杂性和语义得到了相当规律的使用。它们还告知系统的设计。有时,人们必须做一些涉及解析或协议处理的事情,或者一些稍微聪明的计算。掌握算法的作用,它们如何工作,它们有多昂贵,以及它们可能在图书馆代码中找到它们的位置,这对于了解如何避免重新发明轮子非常有用。

答案 10 :(得分:1)

经典算法通常与迷人的东西相关联,如游戏,网络搜索或科学计算。但是,我不得不将一些经典算法用于纯粹的企业应用程序。

我正在构建元数据迁移工具,我不得不使用拓扑排序来进行依赖项解析,使用各种形式的图遍历来查询元数据,以及修改Tarjan的union-find数据结构变体以将类似森林的结构化元数据分区为树。

这是一次非常令人满意的经历。大多数算法之前都已实现过,但是它们的实现缺少我的任务所需要的东西。这就是理解他们内部的重要性的原因。

答案 11 :(得分:1)

我使用Levenshtein distance算法来帮助实现'你的意思 [建议的词] ?'我们网站搜索功能。

与我们的'标记'系统结合使用时效果很好,它允许我们将额外的单词(标题/描述/等中的单词除外)与数据库中的项相关联。 \

它无论如何都不是完美的,但如果我自己也不这样说,它会比大多数公司网站搜索更好; )