【翻译】算法导论应对面试导读

从网上看到了一个Facebook的工程师写的攻略,介绍了用算法导论来应付面试应该读哪些,略过哪些。下面对其做一个翻译。供以后面试来查缺补漏。

Chapter 1

非常有趣的一章,但是你可以跳过它。

Chapter 2

2.1 插入排序 - 说实话你应该掌握所有的排序算法,而不是一个插入排序。 这只是基础知识,而且你永远不知道什么时候可以派的上用场。
2.2 分析算法 - 你可以跳过开始的介绍,但是应该了解剩下的部分。
2.3 设计算法 - 包含了并归排序以及对分治法的分析,十分重要的一节,值得一读。

Chapter 3

整个一章。 你必须知道大O符号和时间复杂度分析。

Chapter 4

4.1 最大子数组问题 - 非常值得花时间一读。 这一节对此类问题有比分治法更好的解法,这值得去做一些练习,而且这种流动的逻辑有助于发展你的思考方式。
4.2 矩阵乘法的Strassen算法 -我特别喜欢这个算法,当我第一眼看到它就觉得它很酷。 但是对于面试你可以跳过它,它不会出现。
4.3 用代入法求解递归式 - 你在面试中不会用到这种方法, 但你应该知道它,因为它是分析递归算法时间复杂度的基本工具。
4.4 用递归树方法求解递归式 - 同 4.3
4.5 用主方法求解递归式 - 基本知识。 你应该知道并练习它,并能在3秒内使用它。 如果在面试中要求分析递归算法,这是一个合适的方法。
4.6 证明主定理 - 你可以跳过这一部分,但是最好能阅读至少一次,这样你才能理解你在使用master方法时发生了什么。

Chapter 5

说实话我从来没有读过这一章节。 但我所知道的是你需要掌握基础的概率知识,因为他们很有可能会出现在面试中。 也就是说你需要理解概率的概念,并做一些有关概率的面试题(我推荐用这本书 Elements of Programming Interviews来准备面试, 在这本书里有很多概率问题的详解), 所以你可以跳过这一章节或者粗略的浏览一下。这一章节着重介绍了数学而不是算法。

Chapter 6

6.1, 6.2, 6.3, 6.4, 6.5 - 堆和堆排序,Check。

Chapter 7

7.1, 7.2, 7.3 - 快速排序和它的随机化版本。 必须要掌握概念. 而且我也很推荐 7.4 节(我曾在面试时被要求要深度分析一下随机算法), 但是我猜你在面试中被问到像7.4节内容的概率非常的低。

Chapter 8

8.1 - 排序算法的下界 - 是的非常基础的知识。 可能会在谷歌的面试中被问到 (虽然不太可能,但我知道它之前发生过)。
8.2 - 计数排序 - 必须要知道细节。它会以变换形式的方式出现。
8.3 - 基数排序 - 这是一个简单的算法。
8.4 - 桶排序 - 可以跳过。

Chapter 9

9.1 - 非常短的一节,值得一读。
9.2 - 期望为线性时间的选择算法 - 非常重要。 虽然它不像快速排序一样经常出现在面试中。但是我有一次在面试中不得不对其进行完整编码。
9.3 - 最坏情况线性时间的选择算法 - 可以跳过。只需要知道在最坏的情况下线性时间是可能发生的,因为这可能在什么时候起到帮助。

Chapter 10

10.1 - 栈和队列 - 基础知识,绝对的非常重要。
10.2 - 链表 - 同 10.1
10.3 - 指针和对象的实践 - 如果你使用C++或者Java可以跳过这一节。其它的情况我不确定。
10.4 - 有根树的表示 - 非常短的一节, 值得快速的读一遍。

Chapter 11

对于哈希,我会说实现并不像链表那样重要,但是你应该对链表有一个了解,最重要的是要知道搜索/ 插入/删除的(预期和最坏情况)时间复杂度。实际上对于哈希也是。它们是非常重要的数据结构,预期的时间复杂性是现实世界中最重要的。
11.1 - 直接寻址表 - 只需要知道含义。
11.2 - 哈希表 - 重要。
11.3 - 哈希函数 - 值得对它有所了解,但我不会在这里深入探讨。只要知道几个好的和坏的哈希函数的例子(以及它们好/坏的原因)。
11.4 - 开放寻址法- 值得对它有所了解,但不太可能出现在实际的面试中。
11.5 - 完美散列 - 跳过.

Chapter 12

12.1 - 什么是二叉搜索树? - Yep.
12.2 - 查询二叉搜索树 - Yep.整个一节 
12.3 - 插入和删除 - 同 12.2。
12.4 - 随机构建二叉搜索树 - 只需要知道12.4的定理(随机BST的预期高度为O(lgn)) 而且要知道为什么是真的。

Chapter 13

这一章非常的简单。知道什么是红黑树,以及它的高度/插入/删除/查找最坏情况是什么。 只需要阅读 13.1节和 13.2节就可以跳过剩余的部分。除非面试官“做错了”,面试官想看看你能否重新推导出这些案例。否则你永远不会被要求进行红黑树的插入/删除操作,在这种情况下,知道它也不会有什么帮助(我怀疑是可能会发生这种情况的)。同时还要知道红黑树非常节省空间,并且一些C ++ STL容器通常被构建为红黑树(例如map / set)。

Chapter 14

值得浏览去14.2节,这样你就可以知道如何扩张数据结构以及它可能的用途。或者你可以在这里做一到两个有关数据结构扩展的问题。 我跳过了14.1节和14.3节。

Chapter 15

DP! 必须要知道。
15.1 - 钢条切割. 经典的DP问题,必须知道
15.2 - 矩阵链乘法 - 同15.1,虽然我并不特别喜欢这一部分的编写方式(我很少对CLRS这么说)。
15.3 - 动态规划原理 - 值得一读,这样你才能正确理解DP,但是这没有知道什么是DP (通过章节介绍) 和练习DP (通过这本书的课后题和一些面试准备书籍)重要。
15.4 - 最长公共子序列 - 同15.1.
15.5 - 最优二叉搜索树 - 我从来没有读过这一节,所以我不能讨论它是否重要,虽然我不知它,但也没啥事。

Chapter 16

你必须要知道什么是贪心算法。所以要阅读整个一章。
16.1 - 活动选择问题 - 我没有仔细阅读这一节,如果不是很难,最好还是看一下,
16.2 - 贪心算法原理 - 同16.1.
16.3 - 赫夫曼编码 -我看过一些答案是霍夫曼编码的面试题,所以我想说去看它的问题和算法就足够了(但这个问题会以“伪装形式”出现,所以不会很明显。)。
16.4 - 拟阵和贪心算法 -我从来没有读过这一章节,但是在面试准备期间我已经做了很多贪心的问题而且这些东西从未在面试中出现过,所以这部分与面试无关。
16.5 - 用拟阵求解任务调度问题 - 同16.4.

Chapter 17

好吧,你应该知道什么是摊还分析。但是我从来没用通过书来了解它,我觉得这是一个非常简单的概念,你只需谷歌它并查看一些关于它的例子,或者通过阅读17.1节来理解它。 
17.1 - 聚合分析 - 读这个,它解释了重要的东西。
17.2, 17.3, 17.4 - 跳过。.

Chapter 18

你应该对B树(和B+树)有一个概念。我听过有些候选人被问到了有关它们的一些案例 (通常是一些很高级的问题,它们是什么和它们为何这么棒).对于其他情况可以跳过这一章。

Chapter 19

斐波那契堆 - 不需要。

Chapter 20

van Emde Boas 树 - 二叉, 三叉, 还有四叉都不需要。

Chapter 21

并查集
更新: 我一开始推荐跳过这一章,但重新考虑后, 我注意到这比我原来想的重要。 因此我推荐去阅读21.1节和21.2节,跳过剩余的部分。
union-find比较重要,而且我已经至少看到一个使用它的问题。 虽然使用DFS和连接元素也可以解决该类问题。 话虽如此,我也认为这并不是绝对必要的,因为出于面试的目的,一个人很可能会想出一个足够相似的结构来轻松地解决一个需要union-find的问题,从而无需了解本章的内容。但是我认为本章节还是值得一读的,如果你在面试前就知道了的话,如果在面试中遇到这种union-find问题,就不需要再花时间去想,这是一个很大的优势。不过,我认为它的重要性不如该列表中大多数其他章节,甚至一些算法导论中没有的资料 (比如字典树).
 
好的,现在是图相关算法。 首先阅读介绍。 这里有很多要了解的内容,请继续往下看。

Chapter 22

22.1 - 图的表示 - Yes.
22.2 - 广度优先遍历 - Yes. 在你读过之后去解决这个问题: ACM-ICPC Live Archive - Kermit the Frog. “使用BFS进行空间搜索”是一个重要的概念,可以解决几个面试问题。
22.3 - 深度优先遍历 - Yes.
22.4 - 拓扑排序 - Yes.
22.5 - 强连通分量 - 相对于上面4个出现的概率很小,但还是有可能的,所以还是Yes.

Chapter 23

最小生成树 - 可能是最不重要的图算法,除了最大流量(当然,我的意思是面试)。我仍然会说你应该阅读它,因为它是一个众所周知的问题,但绝对优先考虑其他事情。
23.1 - 最小生成树的形成 - 按顺序, yes.
23.2 - Prim 算法 和 Kruskal 算法 - 按顺序, yes.

Chapter 24

最短路径算法也是很重要的,但可能不如BFS / DFS那么重要。
阅读介绍。 总的来说,你应该阅读所有的介绍,但这个很重要(而且很长),因此需要特别注意。
24.1 Bellman-Ford 算法 -了解算法及其正确性证明。
24.2 有向无环图中的单源最短路径问题- 值得理解,可能会在面试中出现,甚至比 Bellman-Ford 更常见。.
24.3 Dijkstra 算法 - Yes. 当然,我已经看到了这个算法在面试中出现了很多次(及其变形),甚至我还看到了A*算法。
24.4 差分约束和最短路径 - 跳过

Chapter 25

只需要读介绍即可。
25.1 - 最短路径和矩阵乘法 -我想说应该跳过。虽然可能会出现 (但是可能性非常的小),所以在我看来可能性如此之小不值得花时间去读。不过如果你有额外的时间,不妨去读一读。
25.2 - Floyd-Warshall 算法 - Yep, 值得了解该算法及其时间复杂度以及是如何生效的 (适用于所有加权图,除了负权重有环图)。 它的代码只有5行,没有理由不去了解它。虽然它的分析可能有些过头。
25.3 - Johnson 算法 - Skip.

Chapter 26

最大流 - 我从来没有听说这个算法会出现在面试中,我页不敢去想如果出现了的情况。所以跳过这一章

Chapters 27+

从这一章节往后的大部分内容永远不会出现。 因此对我来说,我可以很容易的告诉你哪些内容需要阅读,哪些是不需要的。 因此从这往后是从书中选择出来的章节:

Chapter 31
大部分需要从本章学习的内容都可以从编程面试练习中学习(所以你最好花时间去做)。所以我想说的是除了欧几里得算法中求公约数其它的都可以跳过。在章节  31.2.

Chapter 32
32.1 - 朴素字符串匹配算法 - 只需要快速阅读。
32.2 - Rabin-Karp算法  - 我想说你应该知道这个。旋转哈希概念非常重要,在许多与字符串或搜索相关的面试问题中很有用。

Appendices

A - 求和
需要知道时间复杂度分析的重要总结

C - 计数与概率
如果您不了解C.4的内容,可以阅读一下,伯努利试验可能会被问到(没有明确说明,但您可以使用它们,专门用于时间分析涉及概率/硬币翻转的问题)。

猜你喜欢

转载自www.cnblogs.com/Tanc-ANT/p/9426622.html