---------------- 下面的内容是可选的 ----------------
计算机是如何处理一段程序:
编译器
浮点数是如何存储的:
并不需要实现
Skiena 算法:
高级编程(包括递归关系和主定理):
如果部分课程过于学术性,你可直接跳到文章底部,去查看离散数学的视频以获取相关背景知识。
视频:
在线课程:
使用线性探测的数组去实现
掌握至少一种平衡查找树(并懂得如何实现):
“在各种平衡查找树当中,AVL 树和2-3树已经成为了过去,而红黑树(red-black trees)看似变得越来越受人青睐。这种令人特别感兴趣的数据结构,亦称伸展树(splay tree)。它可以自我管理,且会使用轮换来移除任何访问过根节点的 key。” —— Skiena
因此,在各种各样的平衡查找树当中,我选择了伸展树来实现。虽然,通过我的阅读,我发现在 Google 的面试中并不会被要求实现一棵平衡查找树。但是,为了胜人一筹,我们还是应该看看如何去实现。在阅读了大量关于红黑树的代码后,我才发现伸展树的实现确实会使得各方面更为高效。
我希望能阅读到更多关于 B 树的资料,因为它也被广泛地应用到大型的数据库当中。
AVL 树
伸展树
2-3查找树
2-3-4树 (亦称2-4树)
B 树
红黑树
笔记:
关于堆排序,请查看前文堆的数据结构部分。堆排序很强大,不过是非稳定排序。
斯坦福大学关于排序算法的视频:
Shai Simonson 视频, Aduni.org:
Steven Skiena 关于排序的视频:
加州大学伯克利分校(UC Berkeley) 大学课程:
- 归并排序:
- 快速排序:
实现:
有兴趣的话,还有一些补充 - 但并不是必须的:
图论能解决计算机科学里的很多问题,所以这一节会比较长,像树和排序的部分一样。
Yegge 的笔记:
Skiena 教授的课程 - 很不错的介绍:
图 (复习和其他):
完整的 Coursera 课程:
Yegge: 如果有机会,可以试试研究更酷炫的算法:
我会实现:
可以从 Skiena 的书(参考下面的书推荐小节)和面试书籍中学习更多关于图的实践。
注意 :动态规划是门极为重要的技术,尽管其并未被 Google 提供的准备手册提及,但你可能会对寻求最佳解的方式有点疑问,所以我将其列入这份表单。
这一部分会有点困难,每个可以用动态规划解决的问题都必须先定义出递推关系,要推导出来可能会有点棘手。
我建议先阅读和学习足够多的动态规划的例子,以便对解决 DP 问题的一般模式有个扎实的理解。
视频:
Yale 课程笔记:
Coursera 课程:
系统设计以及可伸缩性,要把软硬件的伸缩性设计的足够好有很多的东西要考虑,所以这是个包含非常多内容和资源的大主题。需要花费相当多的时间在这个主题上。
这一部分有一些短视频,你可以快速的观看和复习大多数重要概念。
这对经常性的巩固很有帮助。
阅读并做练习:
算法设计手册 (Skiena)
read and do exercises from the books below. Then move to coding challenges (further down below)
一旦你理解了每日计划里的所有内容,就去读上面所列的书并完成练习,然后开始读下面所列的书并做练习,之后就可以开始实战写代码了(本文再往后的部分)
首先阅读:
然后阅读 (这本获得了很多推荐, 但是不在 Google coaching 的文档里):
这些没有被 Google 推荐阅读,不过我因为需要这些背景知识所以也把它们列在了这里。
C Programming Language, Vol 2
C++ Primer Plus, 6th Edition
Elements of Programming Interviews
一旦你学会了理论基础,就应该把它们拿出来练练。
尽量坚持每天做编码练习,越多越好。
编程问题预备:
编码练习平台:
随着下面列举的问题思考下你可能会遇到的 20 个面试问题
每个问题准备 2-3 种回答
准备点故事,不要只是摆一些你完成的事情的数据,相信我,人人都喜欢听故事
我会问的一些:(可能我已经知道了答案但我想听听面试官的看法或者了解团队的前景):
我还能说些什么呢,恭喜你!
坚持继续学习。
得到这份工作只是一个开始。
*****************************************************************************************************
*****************************************************************************************************
下面的内容都是可选的。这些是我的推荐,不是 Google 的。
通过学习这些内容,你将会得到更多的有关 CS 的概念,并将为所有的软件工程工作做更好的准备。
*****************************************************************************************************
*****************************************************************************************************