算法导论划重点.cn

 

算法导论划重点

原文

第一章 算法在计算中的作用

随你便。

第二章 算法基础

2.1 插入排序:讲道理你应该了解所有主流排序算法,不仅是插入排序,插入排序属于基础常识,不一定什么时候就会用到。
2.2 算法分析:说明部分可以跳过,剩下部分应该了解。
2.3 设计算法:包括了归并排序以其算法分析,以及分治思想简介,肥肠重要,值得一读。

第三章 函数的增长

完整阅读,需要知道大O记号和时间复杂度分析,就酱。

第四章 分治策略

4.1 最大子数组问题:值得花时间一读。对于这个问题本身,有比分治更好的解法,但是这是个不错的练习,里面的逻辑流会有助于你理清思路。
4.2 Strassen 算法:我超爱这个算法,## 第一次见到这个算法时感觉超酷超震惊,不过如果要应付面试,可以跳过,不会考的。
4.3 代换法:面试不考系列。不过你还是需要了解一下,因为它是求解递归算法时间复杂度的基本工具。
4.4 递归树:同4.3。
4.5 主方法:精华级内容,你应该熟练掌握,3秒钟之内就能求解,这就是你面试时,面对一个恰好符合模板的递归算法时应该使用的工具。
4.6 主定理的证明:基本可以跳过,不过推荐至少看一遍,这样你才能知道我们在使用主方法时都在干什么。

第五章 概率分析和随机算法

讲真这一章我一次都没看过,不过据我所知,面试时候还是要对概率有一个基本了解,因为概率问题还是有一定概率出现的,也就是说,如果你对基本的概率有一定了解,对面试中可能出现的概率问题做过练习(推荐准备面试的人看 Elements of Programming Interviews 这本书,里面有一些此类问题),可以跳过这章。大致看了一下,这一章的数学比算法更多。

第六章 堆排序

6.1, 6.2, 6.3, 6.4, 6.5:堆和堆排序,勾上。

第七章 快速排序

7.1, 7.2, 7.3:快速排序及其随机化版本,必会的概念。
额外推荐 7.4 (某次面试我曾经被要求深入分析一个随机化算法),不过面试时问到这部分内容的概率挺低的,我猜。

第八章 线性时间排序

8.1 排序算法的下界:嗯,基础知识,可能在面试 Google 时候被问到,虽然不是一定,不过我知道一个案例。
8.2 计数排序:必须掌握到细节,面试中会以各种变体出现。
8.3 基数排序:嗯,这么简单的算法……
8.4 桶排序:可跳过。

第九章 中位数和顺序统计量

9.1 短,推荐。
9.2 期望为线性时间的选择算法:很重要,虽然不是像快排一样的基础知识,但是面试里经常出现,某次面试我完整写了一个算法。
9.3 最坏为线性时间的选择算法:可跳过,只需要记住最坏时间为线性是可能的,有时候有用

第十章 基本数据结构

10.1 栈和队列:基本常识,肥肠重要。
10.2 链表:同上
10.3 指针和对象的实现:如果你用C++或者Java,可以跳过这一部分,其它情况我不确定。
10.4 有根树的表示:短,速读。

第十一章 散列表

关于散列,我觉得它的具体实现的理解,不如像对其它东西比如链表之类的具体实现的理解更重要,但是你还是确定一定以及肯定地需要理解它,尤其是重要的(期望以及最坏情况下)的搜索/插入/删除的时间复杂度。还需要知道,实践上它们是肥肠重要的数据结构,而且,实践上期望时间复杂度很重要。
11.1 直接寻址:知道就行了。
11.2 散列表:很重要。
11.3 散列函数:需要对其有概念,不过我不打算过于深入,只需要知道一些好散列函数和不好的散列函数的例子——以及为什么好或不好。
11.4 开放寻址法:值得了解,不过估计面试不会问。
11.5 完全散列:跳过。

第十二章 二叉搜索树

12.1 什么是二叉搜索树:看。
12.2 查询二叉搜索树:看,全部。
12.3 插入/删除:同上。
12.4 随机构建二叉搜索树:只需要知道定理12.4 (随机二叉搜索树的期望高度是O(lgn)),以及理解它为什么是对的。

第十三章 红黑树

这章简单,知道红黑树是什么,以及最坏情况下的高度/插入/删除/查找。阅读 13.1 13.2,剩下的跳过。面试官不会提问红黑树的插入/删除,除非他乱搞,或者试图让你从头构建整个算法,不过这种情况下知道这些也没什么卵用(我还是觉得面试官根本就不会问)。因为红黑树非常节省空间,所以很多C++ 的STL容器使用了它,比如map/set。

第十四章 数据结构的扩张

可以浏览一下 14.2 以了解扩张数据结构的方法,以及其作用,然后做一两道习题。我倾向于跳过 14.1 和 14.3

第十五章 动态规划

动态规划!必会。
15.1 切钢条:标准动态规划问题,必会。
15.2 矩阵链乘法:同上,虽然我不喜欢这部分的写作方式(关于这本书我很少说这种话)。
15.3 动态规划原理:值得阅读,以便更准确理解动态规划,不过我还是要说这部分不如动态规划是什么以及动手做练习(比如这本书和面试习题集的习题)更重要。
15.4 最长公共子串:同 15.1。
15.5 最优二叉搜索树:我从没看过这部分,所以我不敢说重不重要,不过没有它地球也照样转。

第十六章 贪心算法

你需要完全彻底地了解贪心算法是什么,所以要读一下这章的简介。
16.1 活动选择问题:没看过,不过我建议了解一下,如果不打算深入的话。
16.2 贪心算法的原理:同上。
16.3 霍夫曼编码:建议通读其问题和算法,不过仅此而已。我曾见过面试问题其答案是霍夫曼编码(不过问题是以变体出现的,所以思路并不明显。)
16.4 拟阵和贪心算法:没看过,不过我做过很多贪心算法的面试题,从没见到过这个,所以我敢说这一节对面试没什么用。
16.5 用拟阵求解任务调度问题:同上。

第十七章 摊还分析

好吧,你应该非常清楚摊还分析是什么意思,不过我没看过这一章,我觉得这个概念非常简单,Google一下然后找几个例子看一下就应该明白了,或者读一下 17.1,那么:
17.1 聚合分析:读一下,这一节解释了比较重要的东西。
17.2, 17.3, 17.4:略略略

第十八章 B 树

你应该也知道B-树(以及B+树)大概是个啥,我也听说有面试者被问到一般意义上的问题(高级问题比如它们是什么以及它们为什么很酷)。不过除此之外我建议跳过。

第十九章 斐波那契堆

Nope

第二十章 van Emde Boas树

加倍,再加倍,再加倍的 Nope

第二十一章 不相交集合

更新:我本来推荐跳过这一章,不过考虑了一下,我感觉这章比我原来认为的要重要。所以我推荐阅读 21.1 和 21.2,其余的跳过。联合查找算法感觉比较重要,我看过有相关的面试题,虽然这道题也可以用深度优先搜索和连通空间来解决。也就是说,我仍然相信这个算法不是必需,因为只为了应对面试的话,完全可以用一个简单的结构去解决这类问题,不需要掌握这一章。但是,我觉得这一章还是值得一读,对于一个考点为联合查找算法的题目,你在面试时解决得干净利落,轻车熟路,肯定是个加分点。我仍然把这部分内容划为这个清单里的低重点,甚至低于一些不在CLRS这本书里的内容比如字典树。

OK,下面是图算法。首先看一下引言,好吧,内容很多,然后继续。

第二十二章 基本的图算法

22.1 图的表示:勾上。
22.2 广度优先搜索:勾上。看过了这一章,解决一下这个问题:ACM-ICPC Live Archive - Kermit the Frog。整个“状态空间广度优先搜索”是一个重要概念,可以用来解决很多面试问题。
22.3 深度优先搜索:勾上。
22.4 拓扑排序:勾上。
22.5 强连通分量:出现概率不如前四节高,不过还是有可能的,所以勾上。

第二十三章 最小生成树

八成是图算法里最不重要的,低于最大流(当然我是出于面试角度考虑),我建议你读读的原因是这个算法很有名,不过肯定阅读优先级不高。
23.1 构建最小生成树:差不多勾上吧。
23.2 Prim and Kruskal 算法:差不多,勾上。

第二十四章 单源最短路径

最短路径算法很重要,虽然不如广度优先搜索/深度优先搜索。读一下引言,基本上来说,引言都是要读的,不过这一篇很重要(而且比较长),所以有必要强调一下。
24.1 Bellman—Ford算法:了解其算法以及正确性的证明。
24.2 有向无环图中的单源最短路径问题:必须值得一读,面试可能会问到,甚至我敢说比 Bellman—Ford 还重要。
24.3 Dijkstra算法:当然,必须,我看过N多这类问题了(还有轻微的变体),我还见过A*问题。
24.4 差分约束和最短路径:跳过。

第二十五章 所有结点对的最短路径问题

同样读一下引言。
25.1 最短路径和矩阵乘法:我建议跳过。面试时问到这里的问题的也有(有非常非常小的几率),不过几率低到我觉得不值一读,如果你时间很充裕,那就看看。
25.2 Floyd—Warshall算法:恩,值得了解一下算法及其时间复杂度,以及什么情况下起作用(对所有加权图,除了负权有环图)。算法代码只有5行所以基本没理由不了解它,不过算法分析部分大概有一点超纲。
25.3 用于稀疏图的Johnson算法:跳过。

第二十六章 最大流

我从没在面试里遇到过此类问题,我也想象不到有什么理由问这类问题,所以跳过。

第二十七章及以后

这部分的问题大部分都不会出现,所以我告诉你要看什么比不看什么更简单,所以下面是一些从书里的精选话题精选出来的话题:

第三十一章 数论算法

这一章的大部分都可以通过做《Elements of Programming Interviews》中的面试题来学习,而且还更省时间,所以我建议跳过,除了31.2节的欧几里德求最大公约数算法。

第三十二章 字符串匹配

32.1 朴素字符串匹配算法:速读。
32.2 Rabin—Karp算法:我觉得应该了解,这里的 rolling hash 的概念非常重要,可以用于很多字符串或者搜索相关的面试问题。

附录

A 求和:了解重要的时间复杂度求和。
C 计数与概率:如果你不了解的话,读一下C.4,伯努利试验可能会被问到(不是很确定,不过你可能会用到,尤其是跟概率/扔硬币相关的分析问题)