Algorithm 无痛的';算法分析&x27;训练?

Algorithm 无痛的';算法分析&x27;训练?,algorithm,Algorithm,我在大学时曾有过“算法分析”课程的痛苦经历,但最近发现在现实世界中需要它不管怎样,我正在寻找一个简单而有效的速成班。有什么想法吗 相关旁注:如果有Dilbert教授的“算法分析卡通指南”,那一定很好 更新:一个非常类似的问题可以在以下网址找到:有很多关于这个主题的好书。我喜欢。还可以查看上的算法课程(用作课程文本)。这有点深,但在线可以让你按照自己的节奏前进 我最近开始读的其他几本书是和。它们都采用比大多数算法书籍更轻的方法。这些书不是繁重的数学和形式证明,而是给你现实的问题陈述,并向你展示改进

我在大学时曾有过“算法分析”课程的痛苦经历,但最近发现在现实世界中需要它不管怎样,我正在寻找一个简单而有效的速成班。有什么想法吗

相关旁注:如果有Dilbert教授的“算法分析卡通指南”,那一定很好


更新:一个非常类似的问题可以在以下网址找到:

有很多关于这个主题的好书。我喜欢。还可以查看上的算法课程(用作课程文本)。这有点深,但在线可以让你按照自己的节奏前进


我最近开始读的其他几本书是和。它们都采用比大多数算法书籍更轻的方法。这些书不是繁重的数学和形式证明,而是给你现实的问题陈述,并向你展示改进算法所采取的步骤。它们还向您展示了如何估计和度量解决方案的复杂性。我强烈推荐这两本书。

我喜欢Cormen、Leiserson、Rivest和Stein的作品。它有点重,但我发现它是一个不错的参考文本。

同样,加州大学伯克利分校有无数的播客,你可能会觉得有用


提供了指向和提供的一些幻灯片。

大学的大多数算法分析课程只对高水平本科生和研究生开放。为什么你认为这个话题容易学?有些算法很容易分析,维基百科上的文章可能足以理解如何对它们进行分析,但对任何合理复杂的算法进行分析都是非常重要的。Cormen书可能是最广泛使用的算法书,但我不会考虑从它或任何其他书中学习算法分析。

你不说很多关于你的背景的其余部分。对于算法的直截了当的分析,你评估一个算法以找到它的顺序统计和行为的方法,如果你对一般的数学感到满意——比如说你有两年的微积分,或者一门很好的抽象代数课程——那么你真的没有比阅读更好的了

通常的“算法分析”课程也是一门数据结构课程,因此如果您还需要学习列表、树等,那么数据结构文本可能会更好。我在研究生院最喜欢的是

我喜欢科尔曼作为参考;它还可以作为一个令人钦佩的门挡,用于执行大的讨厌的虫子,用于夹紧小的胶水接头(光滑的封面释放了大部分的木材胶水),并且作为一本书的结尾,因为它可以将书端固定在适当的位置。不建议将其作为介绍文本。

发布了一个到,在您的介绍后不久询问

引用他的回答:

麻省理工学院有一门关于算法的课程,包括视频、音频和PDF讲座

还有一个在线课程,也有视频讲座

此外,还有Java中的数据结构和算法课程,正如上面所述,它还有在线视频讲座

在这里,你可以找到许多关于算法的视频讲座,以及许多其他有趣的视频


我对算法最有用的工具是

这是我所知道的最好的算法资源。它涵盖了如此多的主题,非常深入,并且自始至终都有例子。我仍然经常提到它


如果没有那本书,我的算法分析课会很痛苦。

如果你想了解搜索和排序算法的性能,有一个简单的捷径

首先,排序基本上是重复搜索。对于N个项目中的每一个,您都在搜索在列表中插入它的位置,然后再插入它,因此需要N倍于搜索过程的big-O

要理解搜索的big-O,一个简单的方法是将其视为一系列决策(通常是二进制的),每个分支都有一定的概率

假设您的表有N=1024个条目。这意味着索引表需要10位,因为log(1024)=10(基数2)。搜索是一个学习这10位的过程

如果一个决策点具有大致相等的向任何一个方向移动的概率,那么它的熵为-0.5 log(0.5)-0.5 log(0.5)(基数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(即大约.01)。所以,在第一个决定中,你只了解了0.01位,因为结果是如此扭曲。这就是线性搜索效率低下的原因。它有N个操作的顺序,因此排序需要O(N*N)

(旁白:线性搜索实际上是指数型的。如果你将一个问题的信息内容定义为n=log(n),那么线性搜索需要O(2^n)个步骤。这就是为什么像无指导博弈树搜索这样的东西在移动次数上是指数型的。)

另一方面,假设您正在编制索引,而不是进行二进制决策。你把你要寻找的单词的部分或全部比特,作为索引放入一个数组,在那里你已经预先存储了答案。如果索引操作有1024个同样可能的结果,那么它学习10位,因此只需要大约1个操作就可以得到答案。这就是散列编码背后的基本思想。如果您的哈希函数恰好符合perserve顺序,则可以使用它来生成O(N)排序算法