到目前为止,我主要集中在如何正确设计代码,使其尽可能可读和尽可能可维护。所以我总是选择了解编程的更高层次细节,例如类交互,API设计等。
算法我从未真正发现特别有趣。因此,即使我可以为我的程序设计一个好的设计,即使我能够找到解决特定问题的解决方案,它也很少有效。
是否有一种特定的方式来思考可以帮助您提出尽可能高效的解决方案的问题,或者在实践和/或记忆方面是否简单?
另外,您可以推荐哪些在线资源,教您针对不同问题的各种高效算法?
答案 0 :(得分:12)
数据占主导地位。如果你围绕正确的抽象数据结构(ADT)设计你的程序,你经常得到一个干净的设计,算法非常自然地遵循,当缺乏性能时,你应该能够“插入”更有效的。
数学和逻辑方面的强大背景在这里有所帮助,因为它允许您将程序在高级别可视化为函数,集合,图形,序列等之间的交互。然后,您可以决定是否需要对集合进行排序(平衡BST,O(lg n)操作)或不(散列表,O(1)操作),需要支持的序列(类似矢量或类似列表)等等。
如果你想学习一些算法,可以买一本好书,如Cormen等。并尝试实现主要数据结构:
int
或字符串)答案 1 :(得分:7)
Introduction To Algorithms是一本很棒的书,可以帮助您思考不同算法/数据结构的效率。
本书的作者还讲授麻省理工学院的算法课程。您可以找到大多数讲座here
答案 2 :(得分:3)
我想说,在提出好的算法(实际上是好的设计恕我直言的一部分)时,你必须开发一种思维方式。这最好通过研究算法设计来完成。通过研究,我并不仅仅意味着只知道教科书中涵盖的所有常用算法,而是实际了解它们的工作方式和原因,并能够将其中包含的基本思想应用于您试图解决的实际问题。
我建议读一本关于算法的好书(我最喜欢的是CLRS)。对于在线资源,我会推荐TopCoder Algorithm Tutorials中的一系列文章。
我不明白为什么你会同时提到练习和记忆。记忆对你没有任何帮助(你可能已经知道了),但练习是必不可少的。如果你不能应用你学到的东西,那就不是真的在学习。您可以在各种在线编程竞赛/拼图网站上练习,例如SPOJ,Project Euler和PythonChallenge。
答案 3 :(得分:1)
建议: 首先,我推荐“Altro算法简介,第二版由corman”这本书,很棒的书有你需要的大部分(如果不是全部)算法。 (一些更重要的主题是排序算法,最短路径,动态编程,许多数据结构,如bst,哈希映射,堆)。
学习算法的另一个好方法是http://ace.delos.com/usacogate,这是开始之后的好习惯。
对于你的问题,你将习惯于编写好的快速运行代码,经过一些练习后你就不想编写效率低下的代码。
答案 4 :(得分:0)
虽然我认为@larsmans是正确的,因为理解逻辑和数学是理解如何选择有用的ADT来解决特定问题的快速方法,研究现有的解决方案对于那些与这些主题斗争的人来说可能更有启发性。特别是,审查已建立软件(OSS)的代码,该代码解决了与您感兴趣的问题类似的问题。
我发现这种研究方法的一个特别好的方法是审查这样一个项目的单元测试。例如,Apache Lucene有一个包含大量示例的源代码控制存储库。虽然它没有揭示底层算法,但它有助于追踪解决某个问题的特定功能。这导致了研究其内部的机会 - 即一种有趣的算法。在Lucene的案例中inverted indices浮现在脑海中。
虽然这并不能保证您发现的算法是最好的,但可能会受到很多审查,并且可能来自可能回答您问题的活动邮件的项目。因此,找到一个可能比我们大多数人自己想出的解决方案更好的解决方案是一个很好的资源。