第一章
挺有趣的,不过你可以跳过。
第二章
2.1 插入排序——老实说,你应该知道所有主要的排序算法,而不仅仅是插入排序。这只是基本的知识,你永远不知道什么时候有用。
2.2 算法分析——你可以跳过简短的介绍,但其他的要做一个了解。
2.3 算法设计——包含归并排序及其分析,以及分治法的概述,非常重要,值得一读。
第三章
All of it。必须学会大O表示法和时间复杂度分析。
第四章
4.1 最大子数组问题 - 可能有点值得你花时间。对于这个问题,有比“分而治之”更好的解决方案,但这是很好的实践,逻辑思考可以拓展你的思维方式。
4.2 Strassen的算法——我真的很喜欢这个算法,当我第一次看到它的时候,我被它的酷炫惊呆了,但是你可以在面试的时候跳过它。它不会出现。
4.3 代换法——你不会在面试中使用这种方法,但是你应该了解一下,因为它是一个基本的工具,用来找出递归算法的时间复杂度。
4.4 递归树法-与4.3相同
4.5 掌握方法-基本知识。你应该知道并练习它,能够在3秒内使用它。如果分析符合该表单的递归算法,您将在面试中使用这种方法。
4.6 主定理的证明——你可以跳过这个,不过至少去读一遍,这样你就能理解你在用主方法做什么。
第五章
老实说,我从来没有读过这一章,但我知道你需要在面试中对概率有一个基本的把握,因为很有可能他们会出现。也就是说,只要你知道与概率相关的面试问题的基本概率概念和实践(在我推荐的准备面试的书《编程面试的要素》中有解决方案解释方面的问题),你可能可以跳过这一章。粗略地看一下,它更像是数学而不是算法。
第六章
6.1、6.2、6.3、6.4、6.5 -堆和堆排序。
第七章
7.1、7.2、7.3 -快速排序及其随机化版本。“需要了解”之类的概念。我还推荐7.4(我曾在一次面试中被要求对随机算法进行高级分析),不过我想,你在面试中必须处理7.4这样的问题的概率相当低。
第八章
排序的下界,基本知识。可能会在谷歌的面试中被问到(虽然不太可能,但我知道以前发生过这样的情况)。
8.2 -计数排序-需要知道的细节。它以隐含的形式出现。
8.3 -基数排序-这是一个简单的算法。
8.4 -桶排序-可以跳过。
第九章
9.1 -值得一读。
9.2 -预期线性时间内的选择-非常重要,因为它不像快速排序那样是常识,但它在面试中经常出现。在一次面试中,我不得不对整个问题进行编码。
9.3 -在最坏情况下线性时间的选择-可以跳过。只要知道在最坏情况下线性时间是可能的,因为这可能会有所帮助。
第十章
10.1 -堆栈和队列——基本知识,绝对非常重要。
10.2 -链表-与10.1相同
10.3 -实现指针和对象-如果你使用c++或Java,跳过这个。否则我就不确定了。
10.4 -有根树的表示一值得快速阅读。
第十一章
对于哈希,我想说的是实现并不像链表那样重要,但是您应该对它有一定的了解,并且最重要的是了解搜索/插入/删除等的(预期和最坏情况)时间复杂性。还要知道,在实际中,它们是非常重要的数据结构,而且在实际中,预期的时间复杂度才是真正重要的。
11.1 -直接寻址-理解这个概念。
11.2 -哈希表-重要。
11.3 -哈希函数-有一个关于它们的想法是值得的,但我不会在这里太深入。只要知道几个好哈希函数和坏哈希函数的例子(以及它们为什么好/坏)。
11.4 -开放寻址法-值得了解的思想,但不太可能出现在面试中。
11.5 -完全哈希-跳过。
第十二章
12.1 -什么是二叉搜索树?必须知道。
12.2 -查询BST -必须知道。
12.3 -插入/删除-与12.2相同
12.4 -随机构建的BST -只知道定理12.4(随机BST的期望高度为O(lgn))
第十三章
这个很简单。了解红黑树是什么,以及它的最坏情况高度/插入/删除/查找是什么。阅读13.1和13.2,跳过其余部分。除非面试官“做错了”,或者面试官想看看你是否可以重新推导这些案例,否则你永远不会被要求插入/删除rb树(我怀疑这种情况无论如何也不会发生)。还要知道,rb树非常节省空间,一些c++ STL容器通常构建为rb树(例如map/set)。
第14章
可能值得略读14.2,只为了知道您可以增强数据结构,以及为什么它可能有用。否则,做一两个简单的关于扩充数据结构的问题,就可以在这里做。我会跳过14.1和14.3。
第15章
DP(dynamic programming动态规划) !必须学会!
15.1 - 钢条切割。标准DP问题,必须知道。
15.2 -矩阵-链乘法-和15.1一样,虽然我不是特别喜欢这部分的写法(我很少这样说CLRS)。
15.3 - DP的要素-值得一读,以便你正确地理解DP,但我想说的是,它比知道DP是什么(通过章节介绍)和实践它(通过这本书和面试准备书中的问题)更重要。
15.4 - 最长公共子序列 -与15.1相同
15.5 -最优二叉搜索树-我不能证明这部分的重要性,虽然我没有读过这一部分,但是我做的很好。
第十六章
您一定要知道什么是贪婪算法,所以请阅读本章的介绍。
16.1 -活动选择问题-还没有详细阅读这篇文章,但我想说,检查一下,如果不深入的话。
贪婪策略的元素-与16.1相同
16.3 -霍夫曼编码-我想说的是阅读问题和算法,但这就足够了。我见过一些面试问题,答案是霍夫曼编码(但问题会以“伪装”的形式出现,所以不会很明显)。
16.4 -拟阵和贪婪的方法-我从来没有读过这部分,但我在面试准备过程中做了很多贪婪的问题,这些东西从来没有出现过,所以我想说这部分与面试无关。
任务调度问题作为一个矩阵-与16.4相同。
第十七章
你们应该知道什么是均摊分析,但是我从来没有在书上读过,我觉得这是一个非常简单的概念,你们google一下,然后看几个例子,或者通过17.1节来理解它。所以:
17.1 -综合分析-阅读这篇文章,它解释了重要的东西。
17.2、17.3、17.4 -跳过。
第十八章
你应该知道什么是B树(和B+树),我听说过一些例子,候选人被问到一般意义上的B树(关于他们是什么以及为什么他们很棒的高层次问题)。但除此之外,我将跳过这一章。
第十九章
斐波那契堆-nope。
第20章
van Emde Boas树-直接跳过,看都不要看一眼。
21章
不相交集合的数据结构。
更新:我最初建议跳过这一节,但经过重新考虑,我发现它实际上比我最初认为的更重要。因此,我建议阅读21.1和21.2节,跳过其余部分。
Union-find有点重要,我已经看到至少有一个使用它的问题,不过这个问题也可以使用DFS和连接组件来解决。尽管如此,我也认为这并不是严格必要的,因为出于面试的目的,在不了解本章内容的情况下,一个人可能很容易就能想出一个足够类似的结构来解决一个需要union-find的问题。但是,我认为值得一读,这样,如果出现了一个问题,其预期解决方案是union-find数据结构,那么您就不会花时间在面试中提出它,而是提前了解它,这可能是一个很好的优势。尽管如此,我可能会把它列为不那么重要的其他材料在这个列表中,甚至比其他材料,甚至没有在CLRS(如尝试,例如)。
好了,现在来看图形算法。首先看一下介绍。现在,下面有很多需要学习的知识点,注意了!敲黑板!。
22章
22.1 -图形表示-需要学习。
22.2 - BFS -需要学习。然后,解决这个问题:ACM-ICPC Live Archive—Kermit the Frog。整个“使用BFS的状态空间搜索”是一个重要的概念,可以用来解决几个面试问题。
22.3 - DFS -需要学习。
22.4 -拓扑排序-需要学习。
22.5 -强连接组件-比上述4个组件出现的可能性小得多,但仍然是可能的,所以:需要学习。
23章
最小生成树——可能是最不重要的图形算法,除了max flow(当然,我的意思是以面试为目的)。我仍然认为你应该阅读它,因为这是一个众所周知的问题,但绝对要优先考虑其他事情。
23.1 - MST的增长-需要学习。
23.2 - Prim和Kruskal的算法-需要学习。
24章
最短路径算法很重要,尽管可能没有BFS/DFS重要。
读了介绍。总之,你应该通读所有的介绍,但是这篇很重要(而且很长),所以值得特别注意。
24.1 Bellman-Ford -了解算法及其正确性证明。
24.2 DAGs中的最短路径——绝对值得知道,可能会出现,甚至比Bellman-Ford还要多。
24.3 Dijkstra算法-需要学习。当然可以。我已经看到这个出现了很多次(有一些细微的变化),我甚至看到了一个*出现。 ( *代表研究生课程,需要使用更多的数学知识。)
24.4差分约束和最短路径-跳过。
第25章
也请阅读简介。
25.1 -矩阵乘法-我想跳过。这可能会出现(虽然可能性很小),但在我看来,这种可能性非常低,可能不值得这么做。不过,如果你有多余的时间,不妨读一读。
25.2 - Floyd-Warshall -是的,值得了解该算法及其时间复杂度和工作时间(这适用于所有加权图,除了具有负权循环的图)。它的代码大约有5行,所以没有理由不知道它。不过,这种分析可能有点言过其实。
25.3 - Johnson算法- Skip。
26章
最大流量——我从来没有在面试中听说过这个问题,我不知道为什么会这样,所以跳过吧。
27章 ~30章
这些东西大部分永远不会出现,所以对我来说,告诉你该读什么比不读什么更容易,所以这里有一些书中选定的主题。
31章
您应该从本章学到的大部分内容都可以从编程面试的实践中学习到(您的时间最好花在这方面),所以我建议跳过所有内容,除了第31.2节中的欧几里德GCD算法。
32章
32.1 -朴素字符串匹配算法-快速阅读。
我想说,你应该知道这一点,滚动哈希的概念是非常重要的,可以在许多字符串或搜索相关的面试问题有用。
附录
一个合计
了解时间复杂度分析的重要总结。
计数和概率
如果你不知道材料,阅读C.4,伯努利试验可能会出现在问题中(不是明确的,但你可能会使用它们,特别是在涉及概率/抛硬币的问题的时间分析中)。
一旦你涵盖了所有这些,我想说的是,从编程面试中汲取一些元素,为面试中的问题做大量准备。我在这里概述了我自己的面试准备过程——这可能会有所帮助。
注意:请记住,仅凭CLRS提供的上述知识是不够的。有许多话题不在CLRS中,但在面试中可能是相关的,其中许多是实际的(如特定于语言的问题),还有许多是理论性的,但在CLRS中没有明确涉及。例如,前缀树和tournament树是重要的数据结构(前者比后者更重要),它们在CLRS中没有专门的部分,而且已知还会询问跳表,等等。此外,上面包含的部分是详尽的,因为它们都是极有可能来自CLRS的主题。其中的一些你可以跳过,在面试中没有他们的很好(例如,您可能提出的算法分离集章自己作为解决方案如果需要,和mst可能不会出现),但我有一个详尽的清单,因为在我看来最好稍微比under-prepare准备过度,和在任何情况下,我认为所有的above-included话题可能会出现在一种或另一种形式,尽管有些可能性比另一些要小得多。