定制设计算法的好处

时间:2012-02-22 23:04:35

标签: java c++ algorithm

在许多语言中,对我来说,特别是Java和C ++,有一个庞大的标准库。计算机科学,搜索,排序,散列等等中的许多经典问题都在这个库中实现。我的问题是,与简单地使用库的版本相比,实现自己的算法有什么好处吗?这有什么特别的例子吗?

我只是问,因为在学校花了很多时间来说排序,但是在我的实际代码中,当人们已经在Java和C ++中实现和优化排序算法时,我没有理由利用这些知识。

编辑:我和我认识的一位教授详细讨论了这个问题,并且我发布了他的回复,有人可以考虑增加它吗?

7 个答案:

答案 0 :(得分:1)

大多数情况下,库存库功能将比您自定义代码的任何功能更高效。

如果你有一个非常具体的(而不是通用的)问题,你可以通过编写一个专门的函数来获得性能提升,但作为一个开发人员,你应该有意识地努力不“重新发明轮子”。

答案 1 :(得分:1)

排序是一个值得考虑的好例子。如果您对要排序的数据一无所知,除了如何比较元素,那么标准排序算法就会很好。在这种情况下,在C ++中,STL排序会很好。

但有时您对数据了解得更多。例如,如果您的数据由均匀分布的数字组成,则基数排序可以更快。但基数排序是“侵入性的”。从某种意义上说,它需要更多地了解您的数据而不仅仅是一个数字是否大于另一个数字。这使得编写可由每个人共享的通用接口变得更加困难。因此STL缺少基数排序,在这种情况下,您可以通过编写自己的代码来做得更好。

答案 2 :(得分:1)

通常,标准库包含非常快速的代码,用于解决非常普遍的问题。如果您遇到特定问题,在许多情况下您可以比库更好。当然,您最终可能会遇到一个图书馆无法解决的复杂问题,在这种情况下,您从研究解决问题的解决方案中获得的知识可能是非常宝贵的。

答案 3 :(得分:1)

在大学,学校,或者作为一名休闲程序员学习,你(或者我认为你应该)鼓励你自己实施这些事情的一部分。为什么?学习。为我解决一个重要的已经发明的轮子(B-Tree)的实施是我在大学时间中最重要的形成体验之一。

当然,我同意作为开发者,你应该努力不重新发明轮子,但是当通过形成体验学习时,不同的规则适用。我在这个论坛的其他地方读到要在抽象级别N使用某些东西,拥有抽象级别N-1的工作知识并熟悉N-2级是一个非常好的主意。我同意。除了具有形成性之外,它还可以帮助您在库存库不合适的情况下为遇到问题做好准备。相信我,这可能发生在你50年的职业生涯中。如果你正在学习data structures这样的基础知识,那么最终目标不是你的成品的完整性,而是自我改进,那么花时间去“重新发明轮子”。

答案 4 :(得分:1)

预代数/代数/三角学/微积分值得学习吗?

我不知道这是否是“我在学校浪费时间/金钱”的目标问题,或者这是一个真诚的问题,即你自己的版本是否会更好。

至于在学校浪费你的时间/金钱:如果你想做的就是开发一个有用的应用程序,那么你通过了解这些已经实现的算法绝对浪费你的时间 - 你只需要将某些东西整合在一起,效果很好。努力工作。

另一方面,如果你想要创造一些真正重要的东西,需要快速,并且需要成为正确工作的正确工具 - 好吧,那么它通常不存在而且你已经存在了回到像Stack Overflow这样的网站,询问第一年或第二年的计算机科学问题,因为你不熟悉现有技术来推广自己的变种。

根据我的工作,我一直在双方。我需要快速开发它,还是必须运行良好?对于快速的应用程序编程,它的库存函数很多,除非我绝对必须解决性能或功能障碍。对于专业游戏编程,它必须快速运行。当真正的知识进入内存管理,IO访问优化,计算几何,低级别和算法优化以及各种巧妙的乐趣时。并且很少有股票实施能够完成工作。

我是否在学校里学到了大部分内容?不,因为已经知道了大部分内容,但学位毫无疑问得到了帮助。另一方面,你知道大部分内容(否则你不会问),所以是的,简而言之:这是值得的。

一些具体的例子:

  • 如果您想制作真正令人惊叹的游戏,直播和呼吸算法,那么您可以编写其他人无法编写的代码。如果你想制作并不特别令人惊奇的有趣游戏,请使用股票代码并专注于设计。这是限制性的,但它的发展速度更快。

  • 如果您想对嵌入式设备(一个相当大的市场)进行编程,通常股票代码就不会这样做。通常存在库实现不满足的代码或数据存储器约束。

  • 如果您需要从适度的硬件获得严格的服务器性能,那么股票代码就无法做到。 (See this Slashdot entry.)

  • 如果您想进行任何有趣的手机开发,资源紧缩需要您变得聪明,甚至经常用于“无聊”的应用程序。 (用户体验就是一切,大部分数据的库存分类功能通常都太慢了。)

  • 您经常使用的库不能满足您的需求。 (例如,C#没有“稳定”排序方法。我一直遇到这种烦恼,并且自此编写了我自己的解决方案。)

  • 如果您正在处理大量数据(目前大多数企业都在使用它),您最终会遇到界面太慢且需要一些聪明的解决方法的情况,通常需要充分利用自定义数据结构。

答案 5 :(得分:1)

这些库为您提供运行良好的经过测试的实现,因此经验法则是使用这些实现。如果您有一个非常特殊/复杂的问题,您可以使用某些领域知识,那么您需要实现自己的算法版本。

我记得Bill Pugh在他的编程语言课中给出的一个例子,他们分析了复杂应用程序的性能,并且他们实现了程序员对排序算法的错误自定义实现(该代码在实际运行中多次使用应用程序)负责90%的性能下降!

答案 6 :(得分:0)

在与计算机科学教授详细讨论之后,以下是他的观点:

使用图书馆的理由

1。您正在编写截止日期的代码。

  • 妨碍您快速及时地完成项目的能力是没有意义的。这就是为什么要编写库,以节省时间并避免“重新发明轮子”

2. 如果您想完全优化代码。

  • 很可能是那些用Java或C ++编写算法的人才团队,或者无论是谁的图书馆在优化他们的语言算法方面都做得更好,不管你花了多长时间才能在一两个小时内完成。或者四个。

3。您之前已经解决了这个问题。

  • 如果您已经解决了这个问题并且对它的设计有了很好的理解,那么您就不需要为复杂的解决方案而努力,因为您无法获得多少好处。

话虽如此,仍有很多理由可以自行解决。

自己动手的原因

1。一旦遇到非库解决方案更好地优化的问题,就必须对问题解决技术和算法有一个基本的了解。

  • 如果您遇到严重问题,在使用网络或游戏等时经常会出现这种情况。能够发现特定算法将优于库版本的情况变得非常宝贵。

2。对算法及其设计和使用有很好的理解,这使您在工作场所更有价值。

  • 任何一个体面的程序员都可以编写一个函数来比较两个对象,然后将它们扔进一个库函数中,然而能够发现情况并最终改进程序功能和速度的函数将被很好地看待管理。

3。拥有如何做某件事的概念通常就像能够做到这一点一样有价值。

  • 凭借对Java库以及如何使用它们的出色知识,您可以在Java中找到合理成功的任何问题。然而,当你被雇用在erlang工作时,你将面临艰难时期。如果您已经知道Java的库是如何做的,那么您可以将这些想法转移到任何语言。

4。我们作为程序员从来没有真正满足于仅仅有“工作”的东西。

  • 你很难理解事情的原因。正是这种好奇心可能会让你进入这个研究领域。不要否认这种好奇心!鼓励它并学习你的内心。

5。最后,创建自己的排序或散列等方式会带来巨大的成功感和成就感。

  • 想象一下,当你宣称可以在n log(n)时间找到2个顶点之间的最短路径时,你的朋友会看到你多酷!值得一提的是,知道您完全有能力理解并选择基于知识的最佳解决方案是非常有益的。不是某些图书馆给你的。