我在大学时对“算法分析”课程感到痛苦,但最近在现实世界中找到了它的需要。 - 无论如何,我正在寻找一个简单但有效的速成课程。有什么想法吗?
相关旁注:如果Dilbert教授的“算法分析卡通指南”肯定会很好。
更新:可以在以下网址找到一个非常相似的问题:How to get started on ALGORITHMS?
答案 0 :(得分:22)
关于这个主题有很多好书。我喜欢An Introduction to the Analysis of Algorithms。另请查看MIT OpenCourseWare上的算法课程(使用CLRS作为课程文本)。它有点深,但在网上让你可以按照自己的节奏前进。
我最近开始阅读的其他几本书是Algorithms in a Nutshell和Algorithm Design Manual。它们都采用比大多数算法书更轻松的方法。这些书不是繁重的数学和正式证明,而是为您提供实际的问题陈述,并向您展示优化算法所采取的步骤。它们还向您展示了如何估计和衡量解决方案的复杂性。我强烈推荐这两本书。
答案 1 :(得分:5)
同样,加州大学伯克利分校有无数播客,你可能会觉得有帮助。
答案 2 :(得分:4)
Google Code University提供的a page on Algorithms指向Stanford和Princeton提供的部分幻灯片。
答案 3 :(得分:4)
Erik Öjebo向great answer发布了a nearly identical question,在您的关注后不久询问。
引用他的回答:
麻省理工学院在他们Open Courseware Program的课程中有一门关于算法的课程,包括视频,音频和PDF讲座。
在ArsDigita University还有一个在线课程,也有视频讲座。
在University of Florida,有Java课程中的数据结构和算法,就像上面一样,它提供了在线提供的视频讲座。
在freescienceonline.blogspot.com,你可以找到很多关于算法的视频讲座,以及很多其他有趣的视频。
答案 4 :(得分:3)
我喜欢Cormen,Leiserson,Rivest和Stein的Introduction to Algorithms。它有点沉重,但我发现它是一个不错的参考文本。
答案 5 :(得分:3)
你没有对你背后的其余部分说太多。对于算法的直接分析,你评估算法以找到它的顺序统计和行为的方法,如果你对数学一般感到满意 - 比如你已经有两年的微积分,或者一个好的抽象代数课程 - 那么你不能比阅读Knuth Volume One做得更好。
通常的“算法分析”课程也是数据结构课程,因此如果您还需要了解列表,树木等,数据结构文本可能会更好。我在研究生院最喜欢的是Aho, Hopcroft and Ullman
我喜欢Cormen作为参考;它还可以作为一个令人钦佩的门挡,用于执行大型的小虫,用于夹紧小胶接头(光滑的盖子释放大多数木胶),并作为一本书,因为它有一个书挡就位。不推荐它作为介绍文本。
答案 6 :(得分:3)
有一个简单的快捷方式来理解搜索和排序算法的性能,如果这是您正在寻找的。 p>
首先,排序基本上是重复搜索。对于每个N项,您正在搜索在列表中插入它的位置,然后插入它,因此它需要N次搜索过程的大O.
要理解搜索的大O,一种简单的方法是将其视为一系列决策(通常是二元的),并且具有获取每个分支的一定概率。
假设您的表有N = 1024个条目。这意味着它需要10位来索引表,因为log(1024)= 10(基数2)。搜索是学习这10位的过程。
如果决策点的走向大致相等,那么它的熵为-0.5 log(0.5) - 0.5 log(0.5)(base 2),即1位,因此它学习1位信息在每个决定。瞧!它需要大约10个决策,或log(N)。因此排序为O(N log(N))。所有NlogN排序算法都基于具有大致相同可能结果的二元决策。
假设您正在进行线性搜索(如冒泡排序)。在第一个决定,正确的机会是1/1024对比1023/1024。熵是1/1024 * log(1024/1)+ 1023/1024 * log(1024/1023)或大约10/1024 + 0(即约0.01)。所以在第一个决定时你只能学习.01位,因为结果是如此偏斜。这就是线性搜索效率低下的原因。它采用N次操作的顺序,因此排序需要O(N * N)。
(旁白:线性搜索实际上是指数式的。如果你将问题的信息内容定义为n = log(N),那么线性搜索需要O(2 ^ n)步。这就是为什么像非制导游戏这样的原因树的搜索是移动次数的指数。)
另一方面,假设您正在编制索引,而不是做出二元决策。您可以获取您正在寻找的单词的部分或全部位,并将它们用作数组的索引,您可以在其中预先存储答案。如果该索引操作具有1024个同样可能的结果,那么它将学习10位,因此只需要大约1次操作即可获得答案。这是哈希编码背后的基本思想。如果您的哈希函数恰好遵循了顺序,则可以使用它来制作O(N)排序算法。
有很多方法可以分析算法,也许这就是你所需要的,但是把它们当作学习信息来看它可以满足我99%的需求。
答案 7 :(得分:2)
我对算法的唯一最有用的工具是Introduction to Algorithms。
这是我所知道的算法的最佳资源。它涵盖了很多深入的主题,并且贯穿始终。我仍然经常提到它。
如果没有那本书,我的算法分析课就会很痛苦。
答案 8 :(得分:1)
大学的大多数算法分析课程只向高年级本科生和研究生开放。为什么您希望这个主题易于学习?有些算法很容易分析,而Big O notation上的维基百科文章可能足以理解如何对它们进行分析并对其进行分析,但对任何相当复杂的算法进行分析都是非常重要的。 Cormen的书可能是最广泛使用的算法书,但我不会考虑从它或任何其他书中学习算法分析。
答案 9 :(得分:1)
如果您更喜欢看,而不是阅读,我可以推荐MIT课程“算法简介”。您可以在此处免费观看:http://academicearth.org/courses/introduction-to-algorithms
虽然我对所涉及的数学知识不够,但我发现它非常好并且教学很好。
答案 10 :(得分:1)
我推荐Adam Drozdek在Java和C ++版本中提供的Data Structures and Algorithms。
答案 11 :(得分:0)
大约一年前,我参加了1天(9小时)的算法培训。前提是Comp Sci的本科学位,或至少2年的编程经验。我发现培训非常有用,特别是我得到的实物书签值得我花时间(和金钱,无论公司付出什么)。如果有机会,我会参加另一个这样的会议,即使它基本相同。显然,很大程度上取决于教练。我们很棒 - 有趣,实用,活跃的程序员,虽然他有丰富的教学经验。