1666 lines
123 KiB
Markdown
1666 lines
123 KiB
Markdown
# Google Interview University - 一套完整的学习手册帮助自己准备 Google 的面试
|
||
|
||
## 这是?
|
||
|
||
这是我为了从 web 开发者(自学、非计算机科学学位)蜕变至 Google 软件工程师所制定的计划,其内容历时数月。
|
||
|
||

|
||
|
||
这一长列表是从 **Google 的指导笔记** 中萃取出来并进行扩展。因此,有些事情你必须去了解一下。我在列表的底部添加了一些额外项,用于解决面试中可能会出现的问题。这些额外项大部分是来自于 Steve Yegge 的“[得到在 Google 工作的机会](http://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html)”。而在 Google 指导笔记的逐字间,它们有时也会被反映出来。
|
||
|
||
---
|
||
|
||
## 目录
|
||
|
||
- [这是?](#这是)
|
||
- [为何要用到它?](#为何要用到它)
|
||
- [如何使用它](#如何使用它)
|
||
- [拥有一名 Googler 的心态](#拥有一名-googler-的心态)
|
||
- [我得到了工作吗?](#我得到了工作吗)
|
||
- [跟随着我](#跟随着我)
|
||
- [不要自以为自己足够聪明](#不要自以为自己足够聪明)
|
||
- [关于 Google](#[关于-Google)
|
||
- [相关视频资源](#相关视频资源)
|
||
- [面试过程 & 通用的面试准备](#面试过程--通用的面试准备)
|
||
- [为你的面试选择一种语言](#为你的面试选择一种语言)
|
||
- [在你开始之前](#在你开始之前)
|
||
- [你所看不到的](#你所看不到的)
|
||
- [日常计划](#日常计划)
|
||
- [必备知识](#必备知识)
|
||
- [算法复杂度 / Big-O / 渐进分析法](#算法复杂度--big-o--渐进分析法)
|
||
- [数据结构](#数据结构)
|
||
- [数组](#数组)
|
||
- [链表](#链表)
|
||
- [堆栈](#堆栈)
|
||
- [队列](#队列)
|
||
- [哈希表](#哈希表)
|
||
- [更多的知识](#更多的知识)
|
||
- [二分查找](#二分查找)
|
||
- [按位运算](#按位运算)
|
||
- [树](#树)
|
||
- [树 —— 笔记 & 背景](#树--笔记--背景)
|
||
- [二叉查找树:BSTs](#二叉查找树-bstss)
|
||
- [堆 / 优先级队列 / 二叉堆](#堆--优先级队列--二叉堆)
|
||
- [字典树(Tries)](#字典树tries)
|
||
- [平衡查找树](#平衡查找树)
|
||
- [N 叉树(K 叉树、M 叉树)](#n-叉树k-叉树m-叉树)
|
||
- [Sorting](#sorting)
|
||
- [Graphs](#graphs)
|
||
- [Even More Knowledge](#even-more-knowledge)
|
||
- [Recursion](#recursion)
|
||
- [Dynamic Programming](#dynamic-programming)
|
||
- [Combinatorics (n choose k) & Probability](#combinatorics-n-choose-k--probability)
|
||
- [NP, NP-Complete and Approximation Algorithms](#np-np-complete-and-approximation-algorithms)
|
||
- [Caches](#caches)
|
||
- [Processes and Threads](#processes-and-threads)
|
||
- [System Design, Scalability, Data Handling](#system-design-scalability-data-handling)
|
||
- [Papers](#papers)
|
||
- [Testing](#testing)
|
||
- [Scheduling](#scheduling)
|
||
- [Implement system routines](#implement-system-routines)
|
||
- [String searching & manipulations](#string-searching--manipulations)
|
||
- [Final Review](#final-review)
|
||
- [Books](#books)
|
||
- [Coding exercises/challenges](#coding-exerciseschallenges)
|
||
- [Once you're closer to the interview](#once-youre-closer-to-the-interview)
|
||
- [Your Resume](#your-resume)
|
||
- [Be thinking of for when the interview comes](#be-thinking-of-for-when-the-interview-comes)
|
||
- [Have questions for the interviewer](#have-questions-for-the-interviewer)
|
||
- [Once You've Got The Job](#once-youve-got-the-job)
|
||
|
||
---------------- Everything below this point is optional ----------------
|
||
|
||
- [Additional Learning](#additional-learning)
|
||
- [Unicode](#unicode)
|
||
- [Endianness](#endianness)
|
||
- [Emacs and vi(m)](#emacs-and-vim)
|
||
- [Unix command line tools](#unix-command-line-tools)
|
||
- [Information theory](#information-theory)
|
||
- [Parity & Hamming Code](#parity--hamming-code)
|
||
- [Entropy](#entropy)
|
||
- [Cryptography](#cryptography)
|
||
- [Compression](#compression)
|
||
- [Networking](#networking)
|
||
- [Computer Security](#computer-security)
|
||
- [Garbage collection](#garbage-collection)
|
||
- [Parallel Programming](#parallel-programming)
|
||
- [Design patterns](#design-patterns)
|
||
- [Messaging, Serialization, and Queueing Systems](#messaging-serialization-and-queueing-systems)
|
||
- [Fast Fourier Transform](#fast-fourier-transform)
|
||
- [Bloom Filter](#bloom-filter)
|
||
- [van Emde Boas Trees](#van-emde-boas-trees)
|
||
- [Augmented Data Structures](#augmented-data-structures)
|
||
- [Skip lists](#skip-lists)
|
||
- [Network Flows](#network-flows)
|
||
- [Disjoint Sets & Union Find](#disjoint-sets--union-find)
|
||
- [Math for Fast Processing](#math-for-fast-processing)
|
||
- [Treap](#treap)
|
||
- [Linear Programming](#linear-programming)
|
||
- [Geometry, Convex hull](#geometry-convex-hull)
|
||
- [Discrete math](#discrete-math)
|
||
- [Machine Learning](#machine-learning)
|
||
- [Go](#go)
|
||
- [Additional Detail on Some Subjects](#additional-detail-on-some-subjects)
|
||
- [Video Series](#video-series)
|
||
- [Computer Science Courses](#computer-science-courses)
|
||
|
||
---
|
||
|
||
## 为何要用到它?
|
||
|
||
我一直都是遵循该计划去准备 Google 的面试。自 1997 年以来,我一直从事于 web 程序的构建、服务器的构建及创业型公司的创办。对于只有着一个经济学学位,而不是计算机科学学位(CS degree)的我来说,在职业生涯中所取得的都非常成功。然而,我想在 Google 工作,并进入大型系统中,真正地去理解计算机系统、算法效率、数据结构性能、低级别编程语言及其工作原理。可一项都不了解的我,怎么会被 Google 所应聘呢?
|
||
|
||
当我创建该项目时,我从一个栈到一个堆都并不了解。不懂得 Big-O 的任何东西、关于树的一切,或如何去遍历一个图。如果非要我去编写一个排序算法的话,我只能说我所写的并非十分巧妙。一直以来,任何我所用的数据结构都是内建于编程语言当中。至于它们在背后如何运作,我都一概不了解。此外,我并不需要管理内存。最多就是在一个正在执行的进程给出了“内存不足”的错误后,采取一些权变措施。在我的生活中,我甚少使用到多维的数组,可关联数组却成千上万。而且,从开始到现在,我都还未曾创建过数据结构。
|
||
|
||
然而,经过该学习计划,我已有足够的信心认为我能被 Google 所雇佣。这是一个花费了我数月的计划,若您已对大部分知识都熟悉的话,或许能节省大量的时间。
|
||
|
||
## 如何使用它
|
||
|
||
下面所有的东西都是一个概述,而你需要根据从上到下的顺序逐一处理。
|
||
|
||
在学习过程中,我是使用 GitHub 特殊的 markdown flavor 语法去检查计划的进展,包括使用任务列表。
|
||
|
||
- [x] 创建一个新的分支,以使得你可以像这样去检查每项。直接往方括号中填写一个字符 x:[x]
|
||
|
||
[关于 Github-flavored markdown 更多的详情](https://guides.github.com/features/mastering-markdown/#GitHub-flavored-markdown)
|
||
|
||
## 拥有一名 Googler 的心态
|
||
|
||
把一个(或两个)印有“[future Googler](https://github.com/jwasham/google-interview-university/blob/master/extras/future-googler.pdf)”的图案打印出来,并用你誓要成功的眼神盯着它。
|
||
|
||
[](https://github.com/jwasham/google-interview-university/blob/master/extras/future-googler.pdf)
|
||
|
||
## 我得到了工作吗?
|
||
|
||
我还没去应聘。
|
||
|
||
因为我离完成学习(完成该疯狂的计划列表)还需要数天的时间,并打算在下周开始用一整天的时间,以编程的方式去解决问题,而这将持续数周时间。然后,我才通过二月时得到的一个介绍资格去正式应聘(没错,是二月时得到的)。
|
||
|
||
感谢 JP 的这次介绍。
|
||
|
||
## 跟随着我
|
||
|
||
目前我仍在该计划的执行过程中,如果,你想跟随我的脚步去学习,你可以登进我在 [GoogleyAsHeck.com](https://googleyasheck.com/) 上所写的博客。
|
||
|
||
下面是我的联系方式:
|
||
|
||
- Twitter: [@googleyasheck](https://twitter.com/googleyasheck)
|
||
- Twitter: [@StartupNextDoor](https://twitter.com/StartupNextDoor)
|
||
- Google+: [+Googleyasheck](https://plus.google.com/+Googleyasheck)
|
||
- LinkedIn: [johnawasham](https://www.linkedin.com/in/johnawasham)
|
||
|
||

|
||
|
||
## 不要自以为自己足够聪明
|
||
|
||
- Google 的工程师都是才智过人的。但是,就算是工作在 Google 的他们,仍然会因为自己不够聪明而感到一种不安全感。
|
||
- [天才程序员的神话](https://www.youtube.com/watch?v=0SARbwvhupQ)
|
||
|
||
## 关于 Google
|
||
|
||
- [ ] 面向学生 —— [Google 的职业生涯:技术开发指导](https://www.google.com/about/careers/students/guide-to-technical-development.html)
|
||
- [ ] Google 检索的原理:
|
||
- [ ] [Google 检索的发展史(视频)](https://www.youtube.com/watch?v=mTBShTwCnD4)
|
||
- [ ] [Google 检索的原理 —— 故事篇](https://www.google.com/insidesearch/howsearchworks/thestory/)
|
||
- [ ] [Google 检索的原理](https://www.google.com/insidesearch/howsearchworks/)
|
||
- [ ] [Google 检索的原理 —— Matt Cutts(视频)](https://www.youtube.com/watch?v=BNHR6IQJGZs)
|
||
- [ ] [Google 是如何改善其检索算法(视频)](https://www.youtube.com/watch?v=J5RZOU6vK4Q)
|
||
- [ ] 连载小说:
|
||
- [ ] [Google 检索是如何处理移动设备](https://backchannel.com/how-google-search-dealt-with-mobile-33bc09852dc9)
|
||
- [ ] [Google 用于寻找需求的秘密研究](https://backchannel.com/googles-secret-study-to-find-out-our-needs-eba8700263bf)
|
||
- [ ] [Google 检索将成为你的下一个大脑](https://backchannel.com/google-search-will-be-your-next-brain-5207c26e4523)
|
||
- [ ] [Demis Hassabis 的心灵深处](https://backchannel.com/the-deep-mind-of-demis-hassabis-156112890d8a)
|
||
- [ ] [书籍:Google 公司是如何运作的](https://www.amazon.com/How-Google-Works-Eric-Schmidt/dp/1455582344)
|
||
- [ ] [由 Google 通告所制作 —— 2016年10月(视频)](https://www.youtube.com/watch?v=q4y0KOeXViI)
|
||
|
||
## 相关视频资源
|
||
|
||
部分视频只能通过在 Coursera、Edx 或 Lynda.com class 上注册登录才能观看。这些视频被称为网络公开课程(MOOC)。虽然,它们是免费观看。但是,部分课程可能不在该期间。因此,你需要多等待几个月。
|
||
|
||
我很感谢您能帮我把网络公开课程的视频链接转换成公开的视频源,以代替那些在线课程的视频。此外,一些大学的讲座视频也是我所青睐的。
|
||
|
||
## 面试过程 & 通用的面试准备
|
||
|
||
- [ ] 视频:
|
||
- [ ] [如何在 Google 工作 —— 考生指导课程(视频)](https://www.youtube.com/watch?v=oWbUtlUhwa8&feature=youtu.be)
|
||
- [ ] [Google 招聘者所分享的技术面试小窍门(视频)](https://www.youtube.com/watch?v=qc1owf2-220&feature=youtu.be)
|
||
- [ ] [如何在 Google 工作:技术型简历的准备(视频)](https://www.youtube.com/watch?v=8npJLXkcmu8)
|
||
|
||
- [ ] 文章:
|
||
- [ ] [三步成为 Googler](http://www.google.com/about/careers/lifeatgoogle/hiringprocess/)
|
||
- [ ] [得到在 Google 的工作机会](http://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html)
|
||
- 所有他所提及的事情都列在了下面
|
||
- [ ] _(早已过期)_ [如何得到 Google 的一份工作,面试题,应聘过程](http://dondodge.typepad.com/the_next_big_thing/2010/09/how-to-get-a-job-at-google-interview-questions-hiring-process.html)
|
||
- [ ] [手机设备屏幕的问题](http://sites.google.com/site/steveyegge2/five-essential-phone-screen-questions)
|
||
|
||
- [ ] 附加的(虽然 Google 不建议,但我添加上来):
|
||
- [ ] [ABC:总处于编程状态(Always Be Coding)](https://medium.com/always-be-coding/abc-always-be-coding-d5f8051afce2#.4heg8zvm4)
|
||
- [ ] [四步成为 Google 一名没有学位的员工](https://medium.com/always-be-coding/four-steps-to-google-without-a-degree-8f381aa6bd5e#.asalo1vfx)
|
||
- [ ] [共享白板(Whiteboarding)](https://medium.com/@dpup/whiteboarding-4df873dbba2e#.hf6jn45g1)
|
||
- [ ] [Google 是如何看待应聘、管理和公司文化](http://www.kpcb.com/blog/lessons-learned-how-google-thinks-about-hiring-management-and-culture)
|
||
- [ ] [程序开发面试中有效的白板(Whiteboarding)](http://www.coderust.com/blog/2014/04/10/effective-whiteboarding-during-programming-interviews/)
|
||
- [ ] 震撼程序开发的面试第一集:
|
||
- [ ] [Gayle L McDowell —— 震撼程序开发的面试(视频)](https://www.youtube.com/watch?v=rEJzOhC5ZtQ)
|
||
- [ ] [震撼程序开发的面试 —— 作者 Gayle Laakmann McDowell(视频)](https://www.youtube.com/watch?v=aClxtDcdpsQ)
|
||
- [ ] 如何在世界四强企业中获得一份工作:
|
||
- [ ] [“如何在世界四强企业中获得一份工作 —— Amazon、Facebook、Google和Microsoft”(视频)](https://www.youtube.com/watch?v=YJZCUhxNCv8)
|
||
- [ ] [面试 Google 失败](http://alexbowe.com/failing-at-google-interviews/)
|
||
|
||
## 为你的面试选择一种语言
|
||
|
||
在这,我就以下话题写一篇短文 —— [重点:为在 Google 的面试选择一种语言](https://googleyasheck.com/important-pick-one-language-for-the-google-interview/)
|
||
|
||
在大多数公司面试中的编程环节,你可以使用一种用起来较为舒适的语言。但在 Google,只有三种固定的选择:
|
||
|
||
- C++
|
||
- Java
|
||
- Python
|
||
|
||
有时你也可以使用下面两种,但需要事先查阅说明。因为,说明中会有警告:
|
||
|
||
- JavaScript
|
||
- Ruby
|
||
|
||
你需要对你所选择的语言感到非常舒适且足够了解。
|
||
|
||
关于选择的更多阅读:
|
||
|
||
- http://www.byte-by-byte.com/choose-the-right-language-for-your-coding-interview/
|
||
- http://blog.codingforinterviews.com/best-programming-language-jobs/
|
||
- https://www.quora.com/What-is-the-best-language-to-program-in-for-an-in-person-Google-interview
|
||
|
||
[在此查看相关语言的资源](programming-language-resources.md)
|
||
|
||
由于,我正在学习C、C++ 和 Python,因此,在下面你会看到部分关于它们的学习资料。相关书籍请看文章的底部。
|
||
|
||
## 在你开始之前
|
||
|
||
该列表已经持续更新了很长时间,所以没错,它的确容易会失去控制。
|
||
|
||
这里列出一些我所犯过的错误,希望您不要重滔覆辙。
|
||
|
||
### 1. 你不可能把所有的东西都记住
|
||
|
||
我查看了数小时的视频,并记录了大量的笔记。可几个月后,我都忘却了其中的大部分东西。所以,我翻阅我的笔记,并将可回顾的东西制作成抽认卡(flashcard)(请往下看)
|
||
|
||
### 2. 使用抽认卡
|
||
|
||
为了解决善忘的问题,我制作了一些抽认卡页面,用于添加两种抽认卡:正常的及带代码的。每种卡都会有不同的格式设计。
|
||
|
||
而且,我还以移动设备优先去设计网页,以使得在任何地方,我都可以在我的手机及平板上回顾知识。
|
||
|
||
你也可以免费制作数以你自己的网站:
|
||
|
||
- [抽认卡页面的代码仓库](https://github.com/jwasham/computer-science-flash-cards)
|
||
- [我的抽认卡数据库](https://github.com/jwasham/computer-science-flash-cards/blob/master/cards-jwasham.db):有一点需要记住的是,我做事有点过头,以至于把卡片覆盖到所有的东西上。从汇编语言和 Python 的细枝末节,到机器学习和统计。这种性格对于 Google 的要求来说,是的确有点多余。
|
||
|
||
**在抽认卡上做笔记:** 若你第一次发现你知道问题的答案时,不要急着把其标注成“已懂”。你需要做的是去查看是否有同样的抽认卡,并在你真正懂得如何解决问题之前,多问自己几次。重复地问答可帮助您深刻记住该知识点。
|
||
|
||
### 3. 回顾,回顾,回顾
|
||
|
||
我留有一组 ASCII 码表、OSI 堆栈、Big-O 记号及更多的小抄纸,以便在空余的时候可以学习。
|
||
|
||
每编程半个小时就要休息一下,并去回顾一下你的抽认卡。
|
||
|
||
### 4. 专注
|
||
|
||
在学习的过程中,往往会有许多令人分心的事情占据着我们宝贵的时间。因此,专注和集中注意力是非常的苦难的。
|
||
|
||
## 你所看不到的
|
||
|
||
由于,这个巨大的列表是始于一个从 Google 面试指导笔记所形成的的个人事件处理列表。因此,有一些我熟悉且普遍的技术都未被谈及到:
|
||
|
||
- SQL
|
||
- Javascript
|
||
- HTML, CSS, and other front-end technologies
|
||
|
||
## 日常计划
|
||
|
||
部分问题可能会花费一天去学习,而部分则会花费都天。有些学习,则不需要使用代码去实现。
|
||
|
||
因此,每一天我都会在下面所列出的列表中选择一个问题,并查看相关的视频。然后,使用以下的一种语言去实现:
|
||
|
||
C —— 使用结构体和函数,该函数会接受一个结构体指针 * 及其他数据作为参数。
|
||
C++ —— 不适用内建的数据类型。
|
||
C++ —— 使用内建的数据类型,如使用 STL 的 std::list 来充当一个链表。
|
||
Python —— 使用内建的数据类型(为了持续连续 Python),并编写一些测试去保证自己代码的正确性。有时,只需要使用断言函数 assert() 即可。
|
||
此外,你也可以使用 Java 或其他语言,这只是我的偏好而已。
|
||
|
||
为何要在这些语言上都编程一次?
|
||
|
||
因为可以练习,练习,练习,直至我已厌倦它,并毫无问题地完成它。(若有部分边缘条件没想到时,则用书写的形式记录下来并去记忆)
|
||
因为可以在纯原生的条件下工作(不需垃圾回收机制的帮助下,分配/释放内存(除了 Python))
|
||
因为可以利用上内建的数据类型,以使得我拥有在现实世界中使用内建工具的经验(在生产环境中,不会去编码实现自己的链表)
|
||
|
||
就算我没有时间去每一项都这么做,我也会尽我所能的。
|
||
|
||
在这里,你可以查看到我的代码:
|
||
- [C] (https://github.com/jwasham/practice-c)
|
||
- [C++] (https://github.com/jwasham/practice-cpp)
|
||
- [Python] (https://github.com/jwasham/practice-python)
|
||
|
||
你不需要记住每一个算法的内部原理。
|
||
|
||
在一个白板上写代码,而不要在一台计算机上编写。在测试完部分简单输入后,到计算机上再测试一下。
|
||
|
||
## 必备知识
|
||
|
||
- [ ] **计算机是如何处理一段程序:**
|
||
- [ ] [CPU 是如何执行代码(视频)](https://www.youtube.com/watch?v=42KTvGYQYnA)
|
||
- [ ] [机器码指令(视频)](https://www.youtube.com/watch?v=Mv2XQgpbTNE)
|
||
|
||
- [ ] **编译器**
|
||
- [ ] [编译器是如何在 ~1 分钟内工作(视频)](https://www.youtube.com/watch?v=IhC7sdYe-Jg)
|
||
- [ ] [Hardvard CS50 —— 编译器(视频)](https://www.youtube.com/watch?v=CSZLNYF4Klo)
|
||
- [ ] [C++(视频)](https://www.youtube.com/watch?v=twodd1KFfGk)
|
||
- [ ] [掌握编译器的优化(C++)(视频)](https://www.youtube.com/watch?v=FnGCDLhaxKU)
|
||
|
||
- [ ] **浮点数是如何存储的:**
|
||
- [ ] 简单的 8-bit:[浮点数的表达形式 —— 1(视频 —— 在计算上有一个错误 —— 详情请查看视频的介绍)](https://www.youtube.com/watch?v=ji3SfClm8TU)
|
||
- [ ] 32 bit:[IEEE754 32-bit 浮点二进制(视频)](https://www.youtube.com/watch?v=50ZYcZebIec)
|
||
|
||
## 算法复杂度 / Big-O / 渐进分析法
|
||
- 并不需要实现
|
||
- [ ] [Harvard CS50 —— 渐进表示(视频)](https://www.youtube.com/watch?v=iOq5kSKqeR4)
|
||
- [ ] [Big O 记号(通用快速教程)(视频)](https://www.youtube.com/watch?v=V6mKVRU1evU)
|
||
- [ ] [Big O 记号(以及 Omega 和 Theta)—— 最佳数学解释(视频)](https://www.youtube.com/watch?v=ei-A_wy5Yxw&index=2&list=PL1BaGV1cIH4UhkL8a9bJGG356covJ76qN)
|
||
- [ ] Skiena 算法:
|
||
- [视频](https://www.youtube.com/watch?v=gSyDMtdPNpU&index=2&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b)
|
||
- [幻灯片](http://www3.cs.stonybrook.edu/~algorith/video-lectures/2007/lecture2.pdf)
|
||
- [ ] [对于算法复杂度分析的一次详细介绍](http://discrete.gr/complexity/)
|
||
- [ ] [增长阶数(Orders of Growth)(视频)](https://class.coursera.org/algorithmicthink1-004/lecture/59)
|
||
- [ ] [渐进性(Asymptotics)(视频)](https://class.coursera.org/algorithmicthink1-004/lecture/61)
|
||
- [ ] [UC Berkeley Big O(视频)](https://youtu.be/VIS4YDpuP98)
|
||
- [ ] [UC Berkeley Big Omega(视频)](https://youtu.be/ca3e7UVmeUc)
|
||
- [ ] [摊提法分析(Amortized Analysis)(视频)](https://www.youtube.com/watch?v=B3SpQZaAZP4&index=10&list=PL1BaGV1cIH4UhkL8a9bJGG356covJ76qN)
|
||
- [ ] [举证“Big O”(视频)](https://class.coursera.org/algorithmicthink1-004/lecture/63)
|
||
- [ ] TopCoder (includes recurrence relations and master theorem):
|
||
- [计算性复杂度:第一部](https://www.topcoder.com/community/data-science/data-science-tutorials/computational-complexity-section-1/)
|
||
- [计算性复杂度:第二部](https://www.topcoder.com/community/data-science/data-science-tutorials/computational-complexity-section-2/)
|
||
- [ ] [速查表(Cheat sheet)](http://bigocheatsheet.com/)
|
||
|
||
如果部分课程过于学术性,你可直接跳到文章底部,去查看离散数学的视频以获取相关背景知识。
|
||
|
||
## 数据结构
|
||
|
||
- ### 数组
|
||
- 实现一个自动调整大小的动态数组。
|
||
- [ ] 介绍:
|
||
- [数组(视频)](https://www.coursera.org/learn/data-structures/lecture/OsBSF/arrays)
|
||
- [基础数组(视频)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Basic-arrays/149042/177104-4.html)
|
||
- [多维数组(视频)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Multidimensional-arrays/149042/177105-4.html)
|
||
- [动态数组(视频)](https://www.coursera.org/learn/data-structures/lecture/EwbnV/dynamic-arrays)
|
||
- [不规则数组(视频)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Jagged-arrays/149042/177106-4.html)
|
||
- [调整数组的大小(视频)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Resizable-arrays/149042/177108-4.html)
|
||
- [ ] 实现一个动态数组(可自动调整大小的可变数组):
|
||
- [ ] 练习使用数组和指针去编码,并且指针是通过计算去跳转而不是使用索引
|
||
- [ ] 通过分配内存来新建一个原生数据型数组
|
||
- 可以使用 int 类型的数组,但不能使用其语法特性
|
||
- 从大小为16或更大的数(使用2的倍数 —— 16、32、64、128)开始编写
|
||
- [ ] size() —— 数组元素的个数
|
||
- [ ] capacity() —— 可容纳元素的个数
|
||
- [ ] is_empty()
|
||
- [ ] at(index) —— 返回对应索引的元素,且若索引越界则愤然报错
|
||
- [ ] push(item)
|
||
- [ ] insert(index, item) —— 在指定索引中插入元素,并把后面的元素依次后移
|
||
- [ ] prepend(item) —— 可以使用上面的 insert 函数,传参 index 为 0
|
||
- [ ] pop() —— 删除在数组末端元素,并返回其值
|
||
- [ ] delete(index) —— 删除指定索引的元素,并把后面的元素依次前移
|
||
- [ ] remove(item) —— 删除指定值的元素,并返回其索引(即使有多个元素)
|
||
- [ ] find(item) —— 寻找指定值的元素并返回其中第一个出现的元素其索引,若未找到则
|
||
- [ ] resize(new_capacity) // 私有函数
|
||
- 若数组到达其容积,则变大一倍
|
||
- 当获取元素后,数组大小为其容积的1/4,则缩小一半
|
||
- [ ] 时间复杂度
|
||
- 在数组末端增加/删除、定位、更新元素,只允许占 O(1) 的时间复杂度(平摊(amortized)去分配内存以获取更多空间)
|
||
- 在数组任何地方插入/移除元素,只允许 O(n) 的时间复杂度
|
||
- [ ] 空间复杂度
|
||
- 因为在内存中分配的空间邻近,所以有助于提高性能
|
||
- 空间需求 = (大于或等于 n 的数组容积)* 元素的大小。即便空间需求为 2n,其空间复杂度仍然是 O(n)
|
||
|
||
- ### 链表
|
||
- [ ] 介绍:
|
||
- [ ] [单向链表(视频)](https://www.coursera.org/learn/data-structures/lecture/kHhgK/singly-linked-lists)
|
||
- [ ] [CS 61B —— 链表(视频)](https://www.youtube.com/watch?v=sJtJOtXCW_M&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd&index=5)
|
||
- [ ] [C 代码(视频)](https://www.youtube.com/watch?v=QN6FPiD0Gzo)
|
||
- 并非看整个视频,而只是关于节点结果和内存分配那一部分
|
||
- [ ] 链表 vs 数组:
|
||
- [核心链表 Vs 数组(视频)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/rjBs9/core-linked-lists-vs-arrays)
|
||
- [在现实世界中,链表 Vs 数组(视频)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/QUaUd/in-the-real-world-lists-vs-arrays)
|
||
- [ ] [为什么你需要避免使用链表(视频)](https://www.youtube.com/watch?v=YQs6IC-vgmo)
|
||
- [ ] Gotcha:你需要关于“指向指针的指针”的相关知识:
|
||
(因为当你传递一个指针到一个函数时,该函数可能会改变指针所指向的地址)
|
||
该页只是为了让你了解“指向指针的指针”这一概念。但我并不推荐这种链式遍历的风格,因为,代码的可读性和可维护性太低。
|
||
- [指向指针的指针](https://www.eskimo.com/~scs/cclass/int/sx8.html)
|
||
- [ ] 实现(我实现了使用尾指针以及没有使用这两种情况):
|
||
- [ ] size() —— 返回链表中数据元素的个数
|
||
- [ ] empty() —— 若链表为空则返回一个布尔值 true
|
||
- [ ] value_at(index) —— 返回第 n 个元素的值(从0开始计算)
|
||
- [ ] push_front(value) —— 添加元素到链表的首部
|
||
- [ ] pop_front() —— 删除首部元素并返回其值
|
||
- [ ] push_back(value) —— 添加元素到链表的尾部
|
||
- [ ] pop_back() —— 删除尾部元素并返回其值
|
||
- [ ] front() —— 返回首部元素的值
|
||
- [ ] back() —— 返回尾部元素的值
|
||
- [ ] insert(index, value) —— 插入值到指定的索引,并且当前索引的元素指向到新的元素 index
|
||
- [ ] erase(index) —— 删除指定索引的节点
|
||
- [ ] value_n_from_end(n) —— 返回倒数第 n 个节点的值
|
||
- [ ] reverse() —— 逆序链表
|
||
- [ ] remove_value(value) —— 删除链表中指定值的第一个元素
|
||
- [ ] 双向链表
|
||
- [介绍(视频)](https://www.coursera.org/learn/data-structures/lecture/jpGKD/doubly-linked-lists)
|
||
- 并不需要实现
|
||
|
||
- ### 堆栈
|
||
- [ ] [堆栈(视频)](https://www.coursera.org/learn/data-structures/lecture/UdKzQ/stacks)
|
||
- [ ] [使用堆栈 —— 后进先出(视频)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Using-stacks-last-first-out/149042/177120-4.html)
|
||
- [ ] 可以不实现,因为使用数组实现并不重要
|
||
|
||
- ### 队列
|
||
- [ ] [使用队列 —— 先进先出(视频)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Using-queues-first-first-out/149042/177122-4.html)
|
||
- [ ] [队列(视频)](https://www.coursera.org/learn/data-structures/lecture/EShpq/queue)
|
||
- [ ] [原型队列/先进先出(FIFO)](https://en.wikipedia.org/wiki/Circular_buffer)
|
||
- [ ] [优先级队列(视频)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Priority-queues-deques/149042/177123-4.html)
|
||
- [ ] 使用含有尾部指针链表实现:
|
||
- enqueue(value) —— 在尾部添加值
|
||
- dequeue() —— 删除最早添加的元素并返回其值(首部元素)
|
||
- empty()
|
||
- [ ] 使用固定大小的数组实现:
|
||
- enqueue(value) —— 在可容的情况下添加元素到尾部
|
||
- dequeue() —— 删除最早添加的元素并返回其值
|
||
- empty()
|
||
- full()
|
||
- [ ] 花销:
|
||
- 在使用链表的一个糟糕实现中,入列和出列的时间复杂度将会是 O(n)
|
||
因为你需要找到下一个元素,以致循环整个队列
|
||
- enqueue:O(1)(平摊(amortized)、链表和数组 [探测(probing)])
|
||
- dequeue:O(1)(链表和数组)
|
||
- empty:O(1)(链表和数组)
|
||
|
||
- ### 哈希表
|
||
- [ ] 视频:
|
||
- [ ] [链式哈希表(视频)](https://www.youtube.com/watch?v=0M_kIqhwbFo&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=8)
|
||
- [ ] [Table Doubling 和 Karp-Rabin(视频)](https://www.youtube.com/watch?v=BRO7mVIFt08&index=9&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
|
||
- [ ] [Open Addressing 和 密码型哈希(Cryptographic Hashing)(视频)](https://www.youtube.com/watch?v=rvdJDijO2Ro&index=10&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
|
||
- [ ] [PyCon 2010:The Mighty Dictionary(视频)](https://www.youtube.com/watch?v=C4Kc8xzcA68)
|
||
- [ ] [(进阶)随机取样(Randomization):全域散列(Universal)& 完美散列(Perfect Hashing)(视频)](https://www.youtube.com/watch?v=z0lJ2k0sl1g&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=11)
|
||
- [ ] [(进阶)完美散列(Perfect hashing)(视频)](https://www.youtube.com/watch?v=N0COwN14gt0&list=PL2B4EEwhKD-NbwZ4ezj7gyc_3yNrojKM9&index=4)
|
||
|
||
- [ ] 在线课程:
|
||
- [ ] [哈希函数的掌握(视频)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Understanding-hash-functions/149042/177126-4.html)
|
||
- [ ] [使用哈希表(视频)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Using-hash-tables/149042/177127-4.html)
|
||
- [ ] [Supporting Hashing(视频)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Supporting-hashing/149042/177128-4.html)
|
||
- [ ] [哈希表的语言支持(视频)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Language-support-hash-tables/149042/177129-4.html)
|
||
- [ ] [核心哈希表(视频)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/m7UuP/core-hash-tables)
|
||
- [ ] [数据结构(视频)](https://www.coursera.org/learn/data-structures/home/week/3)
|
||
- [ ] [电话薄问题(Phone Book Problem)(视频)](https://www.coursera.org/learn/data-structures/lecture/NYZZP/phone-book-problem)
|
||
- [ ] 分布式哈希表:
|
||
- [Dropbox 中的瞬时上传及存储优化(视频)](https://www.coursera.org/learn/data-structures/lecture/DvaIb/instant-uploads-and-storage-optimization-in-dropbox)
|
||
- [分布式哈希表(视频)](https://www.coursera.org/learn/data-structures/lecture/tvH8H/distributed-hash-tables)
|
||
|
||
- [ ] 使用线性探测的数组去实现
|
||
- hash(k, m) —— m 是哈希表的大小
|
||
- add(key, value) —— 如果 key 已存在则更新值
|
||
- exists(key)
|
||
- get(key)
|
||
- remove(key)
|
||
|
||
## 更多的知识
|
||
|
||
- ### 二分查找
|
||
- [ ] [二分查找(视频)](https://www.youtube.com/watch?v=D5SrAga1pno)
|
||
- [ ] [二分查找(视频)](https://www.khanacademy.org/computing/computer-science/algorithms/binary-search/a/binary-search)
|
||
- [ ] [详情](https://www.topcoder.com/community/data-science/data-science-tutorials/binary-search/)
|
||
- [ ] 实现:
|
||
- 二分查找(在一个已排序好的整型数组中查找)
|
||
- 迭代式二分查找
|
||
|
||
- ### 按位运算
|
||
- [ ] [Bits 速查表](https://github.com/jwasham/google-interview-university/blob/master/extras/cheat%20sheets/bits-cheat-cheet.pdf)
|
||
- 你需要知道大量2的倍数其值(从2^1 到 2^16 及 2^32)
|
||
- [ ] 好好理解位运操作符的含义:&、|、^、~、>>、<<
|
||
- [ ] [字码(words)](https://en.wikipedia.org/wiki/Word_(computer_architecture))
|
||
- [ ] 好的介绍:
|
||
[位操作(视频)](https://www.youtube.com/watch?v=7jkIUgLC29I)
|
||
- [ ] [C 语言编程教程 2-10:按位运算(视频)](https://www.youtube.com/watch?v=d0AwjSpNXR0)
|
||
- [ ] [位操作](https://en.wikipedia.org/wiki/Bit_manipulation)
|
||
- [ ] [按位运算](https://en.wikipedia.org/wiki/Bitwise_operation)
|
||
- [ ] [Bithacks](https://graphics.stanford.edu/~seander/bithacks.html)
|
||
- [ ] [位元抚弄者(The Bit Twiddler)](http://bits.stephan-brumme.com/)
|
||
- [ ] [交互式位元抚弄者(The Bit Twiddler Interactive)](http://bits.stephan-brumme.com/interactive.html)
|
||
- [ ] 一补数和补码
|
||
- [二进制:利 & 弊(为什么我们要使用补码)(视频)](https://www.youtube.com/watch?v=lKTsv6iVxV4)
|
||
- [一补数(1s Complement)](https://en.wikipedia.org/wiki/Ones%27_complement)
|
||
- [补码(2s Complement)](https://en.wikipedia.org/wiki/Two%27s_complement)
|
||
- [ ] 计算置位(Set Bits)
|
||
- [计算一个字节中置位(Set Bits)的四种方式(视频)](https://youtu.be/Hzuzo9NJrlc)
|
||
- [Count Bits](https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan)
|
||
- [如何在一个 32 位的整型中计算置位(Set Bits)的数量](http://stackoverflow.com/questions/109023/how-to-count-the-number-of-set-bits-in-a-32-bit-integer)
|
||
- [ ] 四舍五入2的幂数:
|
||
- [四舍五入到2的下一幂数](http://bits.stephan-brumme.com/roundUpToNextPowerOfTwo.html)
|
||
- [ ] 交换值:
|
||
- [交换(Swap)](http://bits.stephan-brumme.com/swap.html)
|
||
- [ ] 绝对值:
|
||
- [绝对整型(Absolute Integer)](http://bits.stephan-brumme.com/absInteger.html)
|
||
|
||
## 树
|
||
|
||
- ### 树 —— 笔记 & 背景
|
||
- [ ] [系列:树结构的核心(视频)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/ovovP/core-trees)
|
||
- [ ] [系列:树(视频)](https://www.coursera.org/learn/data-structures/lecture/95qda/trees)
|
||
- 基本的树形结构
|
||
- 遍历
|
||
- 操作算法
|
||
- BFS(广度优先检索,breadth-first search)
|
||
- [MIT(视频)](https://www.youtube.com/watch?v=s-CYnVz-uh4&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=13)
|
||
- 层序遍历(使用队列的 BFS 算法)
|
||
时间复杂度: O(n)
|
||
空间复杂度:最好情况: O(1),最坏情况:O(n/2)=O(n)
|
||
- DFS(深度优先检索,depth-first search)
|
||
- [MIT(视频)](https://www.youtube.com/watch?v=AfSk24UTFS8&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=14)
|
||
- 笔记:
|
||
时间复杂度:O(n)
|
||
空间复杂度:
|
||
最好情况:O(log n) - 树的平均高度
|
||
最坏情况:O(n)
|
||
- 中序遍历(DFS:左、自己、右)
|
||
- 后序遍历(DFS:左、右、自己)
|
||
- 先序遍历(DFS:自己、左、右)
|
||
|
||
- ### 二叉查找树: BSTs
|
||
- [ ] [二叉查找树概览(视频)](https://www.youtube.com/watch?v=x6At0nzX92o&index=1&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6)
|
||
- [ ] [系列(视频)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/p82sw/core-introduction-to-binary-search-trees)
|
||
- 从符号表开始讲到 BST 程序
|
||
- [ ] [介绍(视频)](https://www.coursera.org/learn/data-structures/lecture/E7cXP/introduction)
|
||
- [ ] [MIT(视频)](https://www.youtube.com/watch?v=9Jry5-82I68)
|
||
- C/C++:
|
||
- [ ] [二叉查找树 —— 在 C/C++ 中实现(视频)](https://www.youtube.com/watch?v=COZK7NATh4k&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=28)
|
||
- [ ] [BST 实现 —— 在堆栈和堆中的内存分配(视频)](https://www.youtube.com/watch?v=hWokyBoo0aI&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=29)
|
||
- [ ] [在二叉查找树中找到最小和最大的元素(视频)](https://www.youtube.com/watch?v=Ut90klNN264&index=30&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P)
|
||
- [ ] [寻找二叉树的高度(视频)](https://www.youtube.com/watch?v=_pnqMz5nrRs&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=31)
|
||
- [ ] [二叉树的遍历 —— 广度优先和深度优先策略(视频)](https://www.youtube.com/watch?v=9RHO6jU--GU&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=32)
|
||
- [ ] [二叉树:层序遍历(视频)](https://www.youtube.com/watch?v=86g8jAQug04&index=33&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P)
|
||
- [ ] [二叉树的遍历:先序、中序、后续(视频)](https://www.youtube.com/watch?v=gm8DUJJhmY4&index=34&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P)
|
||
- [ ] [判断一棵二叉树是否是二叉查找树(视频)](https://www.youtube.com/watch?v=yEwSGhSsT0U&index=35&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P)
|
||
- [ ] [从二叉查找树中删除一个节点(视频)](https://www.youtube.com/watch?v=gcULXE7ViZw&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=36)
|
||
- [ ] [二叉查找树中序遍历的后继者(视频)](https://www.youtube.com/watch?v=5cPbNCrdotA&index=37&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P)
|
||
- [ ] 实现:
|
||
- [ ] insert // 往树上插值
|
||
- [ ] get_node_count // 查找树上的节点数
|
||
- [ ] print_values // 从小到大打印树中节点的值
|
||
- [ ] delete_tree
|
||
- [ ] is_in_tree // 如果值存在于树中则返回 true
|
||
- [ ] get_height // 返回节点所在的高度(如果只有一个节点,那么高度则为1)
|
||
- [ ] get_min // 返回树上的最小值
|
||
- [ ] get_max // 返回树上的最大值
|
||
- [ ] is_binary_search_tree
|
||
- [ ] delete_value
|
||
- [ ] get_successor // 返回给定值的后继者,若没有则返回-1
|
||
|
||
- ### 堆 / 优先级队列 / 二叉堆
|
||
- 可视化是一棵树,但通常是以线性的形式存储(数组、链表)
|
||
- [ ] [堆](https://en.wikipedia.org/wiki/Heap_(data_structure))
|
||
- [ ] [介绍(视频)](https://www.coursera.org/learn/data-structures/lecture/2OpTs/introduction)
|
||
- [ ] [无知的实现(视频)](https://www.coursera.org/learn/data-structures/lecture/z3l9N/naive-implementations)
|
||
- [ ] [二叉树(视频)](https://www.coursera.org/learn/data-structures/lecture/GRV2q/binary-trees)
|
||
- [ ] [关于树高的讨论(视频)](https://www.coursera.org/learn/data-structures/supplement/S5xxz/tree-height-remark)
|
||
- [ ] [基本操作(视频)](https://www.coursera.org/learn/data-structures/lecture/0g1dl/basic-operations)
|
||
- [ ] [完全二叉树(视频)](https://www.coursera.org/learn/data-structures/lecture/gl5Ni/complete-binary-trees)
|
||
- [ ] [伪代码(视频)](https://www.coursera.org/learn/data-structures/lecture/HxQo9/pseudocode)
|
||
- [ ] [堆排序 —— 跳到起点(视频)](https://youtu.be/odNJmw5TOEE?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=3291)
|
||
- [ ] [堆排序(视频)](https://www.coursera.org/learn/data-structures/lecture/hSzMO/heap-sort)
|
||
- [ ] [构建一个堆(视频)](https://www.coursera.org/learn/data-structures/lecture/dwrOS/building-a-heap)
|
||
- [ ] [MIT:堆与堆排序(视频)](https://www.youtube.com/watch?v=B7hVxCmfPtM&index=4&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
|
||
- [ ] [CS 61B Lecture 24:优先级队列(视频)](https://www.youtube.com/watch?v=yIUFT6AKBGE&index=24&list=PL4BBB74C7D2A1049C)
|
||
- [ ] [线性时间复杂度的堆构建(大顶堆)](https://www.youtube.com/watch?v=MiyLo8adrWw)
|
||
- [ ] 实现一个大顶堆:
|
||
- [ ] insert
|
||
- [ ] sift_up —— 用于插入元素
|
||
- [ ] get_max —— 返回最大值但不移除
|
||
- [ ] get_size() —— 返回存储的元素数量
|
||
- [ ] is_empty() —— 若堆为空则返回 true
|
||
- [ ] extract_max —— 返回最大值并移除它
|
||
- [ ] sift_down —— 用于获取最大值元素
|
||
- [ ] remove(i) —— 删除指定索引的元素
|
||
- [ ] heapify —— 构件堆,用于堆排序
|
||
- [ ] heap_sort() —— 拿到一个未排序的数组,然后使用大顶堆进行就地排序
|
||
- 注意:若用小顶堆可节省操作,但导致空间复杂度加倍。(无法做到就地)
|
||
|
||
- ### 字典树(Tries)
|
||
- 需要注意的是,字典树各式各样。有些有前缀,而有些则没有。有些使用字符串而不使用比特位来追踪路径。
|
||
- 阅读代码,但不实现。
|
||
- [ ] [数据结构笔记及编程技术](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#Tries)
|
||
- [ ] 短课程视频:
|
||
- [ ] [对字典树(Tries)的介绍(视频)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/08Xyf/core-introduction-to-tries)
|
||
- [ ] [字典树(Tries)的性能(视频)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/PvlZW/core-performance-of-tries)
|
||
- [ ] [实现一棵字典树(Tries)(视频)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/DFvd3/core-implementing-a-trie)
|
||
- [ ] [字典树(Tries):一个被忽略的数据结构](https://www.toptal.com/java/the-trie-a-neglected-data-structure)
|
||
- [ ] [高级编程人员 —— 使用字典树(Tries)](https://www.topcoder.com/community/data-science/data-science-tutorials/using-tries/)
|
||
- [ ] [标准教程(现实中的用例)(视频)](https://www.youtube.com/watch?v=TJ8SkcUSdbU)
|
||
- [ ] [MIT,高阶数据结构,字符串(可事半功倍)](https://www.youtube.com/watch?v=NinWEPPrkDQ&index=16&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf)
|
||
|
||
- ### 平衡查找树
|
||
- 掌握至少一种平衡查找树(并懂得如何实现):
|
||
- “在各种平衡查找树当中,AVL 和2-3树已经成为了过去,而红黑树(red-black trees)看似变得越来越受人青睐。
|
||
这种特别令人感兴趣的数据结构,叫伸展树(splay tree)。该数据结构可自我管理,且会使用轮换来移除任何访问过根节点的 key。
|
||
” —— Skiena
|
||
- 因此,在各种各样的平衡查找树当中,我选择了伸展树来实现。通过我的阅读,我发现你并不会在你的面试中被要求实现一棵
|
||
平衡搜索树。但是,我希望胜人一筹,因此让我们来面对该类树的实现吧。伸展树的确是更高质量的一种实现,因为我的确阅读了
|
||
大量关于红黑树的代码。
|
||
- 伸展树:插入、查找、删除函数的实现
|
||
,而如果你最终实现了红黑树,那么请尝试一下:
|
||
- 跳过删除函数,直接实现搜索和插入功能
|
||
- 我希望能阅读到更多关于 B 树的资料,因为它被广泛地应用到大型的数据集中。
|
||
- [ ] [自我平衡二叉寻找树](https://en.wikipedia.org/wiki/Self-balancing_binary_search_tree)
|
||
|
||
- [ ] **AVL 树**
|
||
- 实际中:
|
||
我能告诉你的事,该种树在实际中并无太多的用途,但我能看到有用的地方在哪里:
|
||
AVL 树是另一种结构,可支持时间复杂度为 O(log n) 的查询、插入及删除。它比红黑树严格意义上更要平衡,从而导致更慢的插入和删除,但遍历快。正因如此,才彰显其结构的魅力。只需要构建一次,就可以在不重新构造的情况下读取,例如语言字典(或程序字典,如一个汇编程序或解释程序的操作码)。
|
||
- [ ] [MIT AVL 树 / AVL 树的排序(视频)](https://www.youtube.com/watch?v=FNeL18KsWPc&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=6)
|
||
- [ ] [AVL 树(视频)](https://www.coursera.org/learn/data-structures/lecture/Qq5E0/avl-trees)
|
||
- [ ] [AVL 树的实现(视频)](https://www.coursera.org/learn/data-structures/lecture/PKEBC/avl-tree-implementation)
|
||
- [ ] [分离与合并](https://www.coursera.org/learn/data-structures/lecture/22BgE/split-and-merge)
|
||
|
||
- [ ] **伸展树**
|
||
- 实际中:
|
||
伸展树一般用于缓存、内存分配者、路由器、垃圾回收者、数据压缩、ropes(字符串的一种替代品,用于存储长串的文本字符)、Windows NT(虚拟内存、网络及文件系统)等的实现。
|
||
- [ ] [CS 61B:伸展树(Splay trees)(视频)](https://www.youtube.com/watch?v=Najzh1rYQTo&index=23&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd)
|
||
- [ ] MIT 教程:伸展树(Splay trees):
|
||
- 该教程会过于学术,但请观看到最后的10分钟以确保掌握。
|
||
- [视频](https://www.youtube.com/watch?v=QnPl_Y6EqMo)
|
||
|
||
- [ ] **2-3查找树**
|
||
- 实际中:
|
||
2-3树有着快速的插入,但却有着查询慢的代价(因为相比较 AVL 树来说,其高度更高)。
|
||
- 你会很少用到2-3树。这是因为其实现涉及到不同类型的节点。因此,人们会选择红黑树。
|
||
- [ ] [2-3树的直感与定义(视频)](https://www.youtube.com/watch?v=C3SsdUqasD4&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6&index=2)
|
||
- [ ] [2-3树的二元观点](https://www.youtube.com/watch?v=iYvBtGKsqSg&index=3&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6)
|
||
- [ ] [2-3树(学生叙述)(视频)](https://www.youtube.com/watch?v=TOb1tuEZ2X4&index=5&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)
|
||
|
||
- [ ] **2-3-4树 (亦称2-4树)**
|
||
- 实际中:
|
||
对于每一棵2-4树,都有着对应的红黑树来存储同样顺序的数据元素。在2-4树上进行插入及删除操作等同于在红黑树上进行颜色翻转及轮换。这使得2-4树成为一种用于掌握红黑树背后逻辑的重要工具。这就是为什么许多算法引导文章都会在介绍红黑树之前,先介绍2-4树,尽管**2-4树在实际中并不经常使用**。
|
||
- [ ] [CS 61B Lecture 26:平衡查找树(视频)](https://www.youtube.com/watch?v=zqrqYXkth6Q&index=26&list=PL4BBB74C7D2A1049C)
|
||
- [ ] [自底向上的2-4树(视频)](https://www.youtube.com/watch?v=DQdMYevEyE4&index=4&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6)
|
||
- [ ] [自顶向下的2-4树(视频)](https://www.youtube.com/watch?v=2679VQ26Fp4&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6&index=5)
|
||
|
||
- [ ] **B 树**
|
||
- 有趣的是:为啥叫 B 仍然是一个神秘,因为 B 可代表波音(Boeing)、平衡(Balanced)或 Bayer(联合创造者)
|
||
- 实际中:
|
||
B 树会被广泛适用于数据库中,而现代大多数的文件系统都会使用到这种树(或变种)。除了运用在数据库中,B 树也会被用于文件系统以快速访问一个文件的任意块。但存在着一个基本的问题,那就是如何将文件块 i 转换成一个硬盘块(或一个柱面-磁头-扇区)上的地址。
|
||
- [ ] [B 树](https://en.wikipedia.org/wiki/B-tree)
|
||
- [ ] [B 树的介绍(视频)](https://www.youtube.com/watch?v=I22wEC1tTGo&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6&index=6)
|
||
- [ ] [B 树的定义及其插入操作(视频)](https://www.youtube.com/watch?v=s3bCdZGrgpA&index=7&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6)
|
||
- [ ] [B 树的删除操作(视频)](https://www.youtube.com/watch?v=svfnVhJOfMc&index=8&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6)
|
||
- [ ] [MIT 6.851 —— 内存层次模块(Memory Hierarchy Models)(视频)](https://www.youtube.com/watch?v=V3omVLzI0WE&index=7&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf)
|
||
- 覆盖有高速缓存参数无关型(cache-oblivious) B 树和非常有趣的数据结构
|
||
- 头37分钟讲述的很专业,或许可以跳过(B 指块的大小、即缓存行的大小)
|
||
|
||
- [ ] **红黑树**
|
||
- 实际中:
|
||
红黑树提供了在最坏情况下插入操作、删除操作和查找操作的时间保证。这些时间值的保障不仅对时间敏感型应用有用,例如实时应用。而且,还对在其他数据结构中构建块非常有用,而这些数据结构都提供了最坏情况下的保障;例如,许多用于计算几何学的数据结构都可以基于红黑树,而目前 Linux 系统所采用的完全公平调度器(the Completely Fair Scheduler)也使用到了该种树。在 Java 的版本8中,红黑树也被用于存储哈希列表集合中相同的数据,而不是使用链表及哈希码。
|
||
- [ ] [Aduni —— 算法 —— 课程4(该链接直接跳到开始部分)(视频)](https://youtu.be/1W3x0f_RmUo?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=3871)
|
||
- [ ] [Aduni —— 算法 —— 课程5(视频)](https://www.youtube.com/watch?v=hm2GHwyKF1o&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=5)
|
||
- [ ] [黑树(Black Tree)](https://en.wikipedia.org/wiki/Red%E2%80%93black_tree)
|
||
- [ ] [二分查找及红黑树的介绍](https://www.topcoder.com/community/data-science/data-science-tutorials/an-introduction-to-binary-search-and-red-black-trees/)
|
||
|
||
- ### N 叉树(K 叉树、M 叉树)
|
||
- 注意:N 或 K 指的是分支系数(即树的最大分支数):
|
||
- 二叉树是一种分支系数为2的树
|
||
- 2-3树是一种分支系数为3的树
|
||
- [ ] [K 叉树](https://en.wikipedia.org/wiki/K-ary_tree)
|
||
|
||
## Sorting
|
||
|
||
- [ ] Notes:
|
||
- Implement sorts & know best case/worst case, average complexity of each:
|
||
- no bubble sort - it's terrible - O(n^2), except when n <= 16
|
||
- [ ] stability in sorting algorithms ("Is Quicksort stable?")
|
||
- [Sorting Algorithm Stability](https://en.wikipedia.org/wiki/Sorting_algorithm#Stability)
|
||
- [Stability In Sorting Algorithms](http://stackoverflow.com/questions/1517793/stability-in-sorting-algorithms)
|
||
- [Stability In Sorting Algorithms](http://www.geeksforgeeks.org/stability-in-sorting-algorithms/)
|
||
- [Sorting Algorithms - Stability](http://homepages.math.uic.edu/~leon/cs-mcs401-s08/handouts/stability.pdf)
|
||
- [ ] Which algorithms can be used on linked lists? Which on arrays? Which on both?
|
||
- I wouldn't recommend sorting a linked list, but merge sort is doable.
|
||
- [Merge Sort For Linked List](http://www.geeksforgeeks.org/merge-sort-for-linked-list/)
|
||
|
||
- For heapsort, see Heap data structure above. Heap sort is great, but not stable.
|
||
|
||
- [ ] [Bubble Sort (video)](https://www.youtube.com/watch?v=P00xJgWzz2c&index=1&list=PL89B61F78B552C1AB)
|
||
- [ ] [Analyzing Bubble Sort (video)](https://www.youtube.com/watch?v=ni_zk257Nqo&index=7&list=PL89B61F78B552C1AB)
|
||
- [ ] [Insertion Sort, Merge Sort (video)](https://www.youtube.com/watch?v=Kg4bqzAqRBM&index=3&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
|
||
- [ ] [Insertion Sort (video)](https://www.youtube.com/watch?v=c4BRHC7kTaQ&index=2&list=PL89B61F78B552C1AB)
|
||
- [ ] [Merge Sort (video)](https://www.youtube.com/watch?v=GCae1WNvnZM&index=3&list=PL89B61F78B552C1AB)
|
||
- [ ] [Quicksort (video)](https://www.youtube.com/watch?v=y_G9BkAm6B8&index=4&list=PL89B61F78B552C1AB)
|
||
- [ ] [Selection Sort (video)](https://www.youtube.com/watch?v=6nDMgr0-Yyo&index=8&list=PL89B61F78B552C1AB)
|
||
|
||
- [ ] Stanford lectures on sorting:
|
||
- [ ] [Lecture 15 | Programming Abstractions (video)](https://www.youtube.com/watch?v=ENp00xylP7c&index=15&list=PLFE6E58F856038C69)
|
||
- [ ] [Lecture 16 | Programming Abstractions (video)](https://www.youtube.com/watch?v=y4M9IVgrVKo&index=16&list=PLFE6E58F856038C69)
|
||
|
||
- [ ] Shai Simonson, [Aduni.org](http://www.aduni.org/):
|
||
- [ ] [Algorithms - Sorting - Lecture 2 (video)](https://www.youtube.com/watch?v=odNJmw5TOEE&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=2)
|
||
- [ ] [Algorithms - Sorting II - Lecture 3 (video)](https://www.youtube.com/watch?v=hj8YKFTFKEE&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=3)
|
||
|
||
- [ ] Steven Skiena lectures on sorting:
|
||
- [ ] [lecture begins at 26:46 (video)](https://youtu.be/ute-pmMkyuk?list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&t=1600)
|
||
- [ ] [lecture begins at 27:40 (video)](https://www.youtube.com/watch?v=yLvp-pB8mak&index=8&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b)
|
||
- [ ] [lecture begins at 35:00 (video)](https://www.youtube.com/watch?v=q7K9otnzlfE&index=9&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b)
|
||
- [ ] [lecture begins at 23:50 (video)](https://www.youtube.com/watch?v=TvqIGu9Iupw&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=10)
|
||
|
||
- [ ] UC Berkeley:
|
||
- [ ] [CS 61B Lecture 29: Sorting I (video)](https://www.youtube.com/watch?v=EiUvYS2DT6I&list=PL4BBB74C7D2A1049C&index=29)
|
||
- [ ] [CS 61B Lecture 30: Sorting II (video)](https://www.youtube.com/watch?v=2hTY3t80Qsk&list=PL4BBB74C7D2A1049C&index=30)
|
||
- [ ] [CS 61B Lecture 32: Sorting III (video)](https://www.youtube.com/watch?v=Y6LOLpxg6Dc&index=32&list=PL4BBB74C7D2A1049C)
|
||
- [ ] [CS 61B Lecture 33: Sorting V (video)](https://www.youtube.com/watch?v=qNMQ4ly43p4&index=33&list=PL4BBB74C7D2A1049C)
|
||
|
||
- [ ] - Merge sort code:
|
||
- [ ] [Using output array](http://www.cs.yale.edu/homes/aspnes/classes/223/examples/sorting/mergesort.c)
|
||
- [ ] [In-place](https://github.com/jwasham/practice-cpp/blob/master/merge_sort/merge_sort.cc)
|
||
- [ ] - Quick sort code:
|
||
- [ ] [Implementation](http://www.cs.yale.edu/homes/aspnes/classes/223/examples/randomization/quick.c)
|
||
- [ ] [Implementation](https://github.com/jwasham/practice-c/blob/master/quick_sort/quick_sort.c)
|
||
|
||
- [ ] Implement:
|
||
- [ ] Mergesort: O(n log n) average and worst case
|
||
- [ ] Quicksort O(n log n) average case
|
||
- Selection sort and insertion sort are both O(n^2) average and worst case
|
||
- For heapsort, see Heap data structure above.
|
||
|
||
- [ ] For curiosity - not required:
|
||
- [ ] [Radix Sort](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#radixSort)
|
||
- [ ] [Radix Sort (video)](https://www.youtube.com/watch?v=xhr26ia4k38)
|
||
- [ ] [Radix Sort, Counting Sort (linear time given constraints) (video)](https://www.youtube.com/watch?v=Nz1KZXbghj8&index=7&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
|
||
- [ ] [Randomization: Matrix Multiply, Quicksort, Freivalds' algorithm (video)](https://www.youtube.com/watch?v=cNB2lADK3_s&index=8&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)
|
||
- [ ] [Sorting in Linear Time (video)](https://www.youtube.com/watch?v=pOKy3RZbSws&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf&index=14)
|
||
|
||
## Graphs
|
||
|
||
Graphs can be used to represent many problems in computer science, so this section is long, like trees and sorting were.
|
||
|
||
- Notes from Yegge:
|
||
- There are three basic ways to represent a graph in memory:
|
||
- objects and pointers
|
||
- matrix
|
||
- adjacency list
|
||
- Familiarize yourself with each representation and its pros & cons
|
||
- BFS and DFS - know their computational complexity, their tradeoffs, and how to implement them in real code
|
||
- When asked a question, look for a graph-based solution first, then move on if none.
|
||
|
||
- [ ] Skiena Lectures - great intro:
|
||
- [ ] [CSE373 2012 - Lecture 11 - Graph Data Structures (video)](https://www.youtube.com/watch?v=OiXxhDrFruw&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=11)
|
||
- [ ] [CSE373 2012 - Lecture 12 - Breadth-First Search (video)](https://www.youtube.com/watch?v=g5vF8jscteo&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=12)
|
||
- [ ] [CSE373 2012 - Lecture 13 - Graph Algorithms (video)](https://www.youtube.com/watch?v=S23W6eTcqdY&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=13)
|
||
- [ ] [CSE373 2012 - Lecture 14 - Graph Algorithms (con't) (video)](https://www.youtube.com/watch?v=WitPBKGV0HY&index=14&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b)
|
||
- [ ] [CSE373 2012 - Lecture 15 - Graph Algorithms (con't 2) (video)](https://www.youtube.com/watch?v=ia1L30l7OIg&index=15&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b)
|
||
- [ ] [CSE373 2012 - Lecture 16 - Graph Algorithms (con't 3) (video)](https://www.youtube.com/watch?v=jgDOQq6iWy8&index=16&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b)
|
||
|
||
- [ ] Graphs (review and more):
|
||
|
||
- [ ] [6.006 Single-Source Shortest Paths Problem (video)](https://www.youtube.com/watch?v=Aa2sqUhIn-E&index=15&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
|
||
- [ ] [6.006 Dijkstra (video)](https://www.youtube.com/watch?v=2E7MmKv0Y24&index=16&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
|
||
- [ ] [6.006 Bellman-Ford (video)](https://www.youtube.com/watch?v=ozsuci5pIso&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=17)
|
||
- [ ] [6.006 Speeding Up Dijkstra (video)](https://www.youtube.com/watch?v=CHvQ3q_gJ7E&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=18)
|
||
- [ ] [Aduni: Graph Algorithms I - Topological Sorting, Minimum Spanning Trees, Prim's Algorithm - Lecture 6 (video)]( https://www.youtube.com/watch?v=i_AQT_XfvD8&index=6&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
|
||
- [ ] [Aduni: Graph Algorithms II - DFS, BFS, Kruskal's Algorithm, Union Find Data Structure - Lecture 7 (video)]( https://www.youtube.com/watch?v=ufj5_bppBsA&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=7)
|
||
- [ ] [Aduni: Graph Algorithms III: Shortest Path - Lecture 8 (video)](https://www.youtube.com/watch?v=DiedsPsMKXc&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=8)
|
||
- [ ] [Aduni: Graph Alg. IV: Intro to geometric algorithms - Lecture 9 (video)](https://www.youtube.com/watch?v=XIAQRlNkJAw&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=9)
|
||
- [ ] [CS 61B 2014 (starting at 58:09) (video)](https://youtu.be/dgjX4HdMI-Q?list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd&t=3489)
|
||
- [ ] [CS 61B 2014: Weighted graphs (video)](https://www.youtube.com/watch?v=aJjlQCFwylA&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd&index=19)
|
||
- [ ] [Greedy Algorithms: Minimum Spanning Tree (video)](https://www.youtube.com/watch?v=tKwnms5iRBU&index=16&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)
|
||
- [ ] [Strongly Connected Components Kosaraju's Algorithm Graph Algorithm (video)](https://www.youtube.com/watch?v=RpgcYiky7uw)
|
||
|
||
- Full Coursera Course:
|
||
- [ ] [Algorithms on Graphs (video)](https://www.coursera.org/learn/algorithms-on-graphs/home/welcome)
|
||
|
||
- Yegge: If you get a chance, try to study up on fancier algorithms:
|
||
- [ ] Dijkstra's algorithm - see above - 6.006
|
||
- [ ] A*
|
||
- [ ] [A Search Algorithm](https://en.wikipedia.org/wiki/A*_search_algorithm)
|
||
- [ ] [A* Pathfinding Tutorial (video)](https://www.youtube.com/watch?v=KNXfSOx4eEE)
|
||
- [ ] [A* Pathfinding (E01: algorithm explanation) (video)](https://www.youtube.com/watch?v=-L-WgKMFuhE)
|
||
|
||
- I'll implement:
|
||
- [ ] DFS with adjacency list (recursive)
|
||
- [ ] DFS with adjacency list (iterative with stack)
|
||
- [ ] DFS with adjacency matrix (recursive)
|
||
- [ ] DFS with adjacency matrix (iterative with stack)
|
||
- [ ] BFS with adjacency list
|
||
- [ ] BFS with adjacency matrix
|
||
- [ ] single-source shortest path (Dijkstra)
|
||
- [ ] minimum spanning tree
|
||
- DFS-based algorithms (see Aduni videos above):
|
||
- [ ] check for cycle (needed for topological sort, since we'll check for cycle before starting)
|
||
- [ ] topological sort
|
||
- [ ] count connected components in a graph
|
||
- [ ] list strongly connected components
|
||
- [ ] check for bipartite graph
|
||
|
||
You'll get more graph practice in Skiena's book (see Books section below) and the interview books
|
||
|
||
## Even More Knowledge
|
||
|
||
- ### Recursion
|
||
- [ ] Stanford lectures on recursion & backtracking:
|
||
- [ ] [Lecture 8 | Programming Abstractions (video)](https://www.youtube.com/watch?v=gl3emqCuueQ&list=PLFE6E58F856038C69&index=8)
|
||
- [ ] [Lecture 9 | Programming Abstractions (video)](https://www.youtube.com/watch?v=uFJhEPrbycQ&list=PLFE6E58F856038C69&index=9)
|
||
- [ ] [Lecture 10 | Programming Abstractions (video)](https://www.youtube.com/watch?v=NdF1QDTRkck&index=10&list=PLFE6E58F856038C69)
|
||
- [ ] [Lecture 11 | Programming Abstractions (video)](https://www.youtube.com/watch?v=p-gpaIGRCQI&list=PLFE6E58F856038C69&index=11)
|
||
- when it is appropriate to use it
|
||
- how is tail recursion better than not?
|
||
- [ ] [What Is Tail Recursion Why Is It So Bad?](https://www.quora.com/What-is-tail-recursion-Why-is-it-so-bad)
|
||
- [ ] [Tail Recursion (video)](https://www.youtube.com/watch?v=L1jjXGfxozc)
|
||
|
||
- ### Dynamic Programming
|
||
- This subject can be pretty difficult, as each DP soluble problem must be defined as a recursion relation, and coming up with it can be tricky.
|
||
- I suggest looking at many examples of DP problems until you have a solid understanding of the pattern involved.
|
||
- [ ] Videos:
|
||
- the Skiena videos can be hard to follow since he sometimes uses the whiteboard, which is too small to see
|
||
- [ ] [Skiena: CSE373 2012 - Lecture 19 - Introduction to Dynamic Programming (video)](https://youtu.be/Qc2ieXRgR0k?list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&t=1718)
|
||
- [ ] [Skiena: CSE373 2012 - Lecture 20 - Edit Distance (video)](https://youtu.be/IsmMhMdyeGY?list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&t=2749)
|
||
- [ ] [Skiena: CSE373 2012 - Lecture 21 - Dynamic Programming Examples (video)](https://youtu.be/o0V9eYF4UI8?list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&t=406)
|
||
- [ ] [Skiena: CSE373 2012 - Lecture 22 - Applications of Dynamic Programming (video)](https://www.youtube.com/watch?v=dRbMC1Ltl3A&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=22)
|
||
- [ ] [Simonson: Dynamic Programming 0 (starts at 59:18) (video)](https://youtu.be/J5aJEcOr6Eo?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=3558)
|
||
- [ ] [Simonson: Dynamic Programming I - Lecture 11 (video)](https://www.youtube.com/watch?v=0EzHjQ_SOeU&index=11&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
|
||
- [ ] [Simonson: Dynamic programming II - Lecture 12 (video)](https://www.youtube.com/watch?v=v1qiRwuJU7g&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=12)
|
||
- [ ] List of individual DP problems (each is short):
|
||
[Dynamic Programming (video)](https://www.youtube.com/playlist?list=PLrmLmBdmIlpsHaNTPP_jHHDx_os9ItYXr)
|
||
- [ ] Yale Lecture notes:
|
||
- [ ] [Dynamic Programming](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#dynamicProgramming)
|
||
- [ ] Coursera:
|
||
- [ ] [The RNA secondary structure problem (video)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/80RrW/the-rna-secondary-structure-problem)
|
||
- [ ] [A dynamic programming algorithm (video)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/PSonq/a-dynamic-programming-algorithm)
|
||
- [ ] [Illustrating the DP algorithm (video)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/oUEK2/illustrating-the-dp-algorithm)
|
||
- [ ] [Running time of the DP algorithm (video)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/nfK2r/running-time-of-the-dp-algorithm)
|
||
- [ ] [DP vs. recursive implementation (video)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/M999a/dp-vs-recursive-implementation)
|
||
- [ ] [Global pairwise sequence alignment (video)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/UZ7o6/global-pairwise-sequence-alignment)
|
||
- [ ] [Local pairwise sequence alignment (video)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/WnNau/local-pairwise-sequence-alignment)
|
||
|
||
- ### Combinatorics (n choose k) & Probability
|
||
- [ ] [Math Skills: How to find Factorial, Permutation and Combination (Choose) (video)](https://www.youtube.com/watch?v=8RRo6Ti9d0U)
|
||
- [ ] [Make School: Probability (video)](https://www.youtube.com/watch?v=sZkAAk9Wwa4)
|
||
- [ ] [Make School: More Probability and Markov Chains (video)](https://www.youtube.com/watch?v=dNaJg-mLobQ)
|
||
- [ ] Khan Academy:
|
||
- Course layout:
|
||
- [ ] [Basic Theoretical Probability](https://www.khanacademy.org/math/probability/probability-and-combinatorics-topic)
|
||
- Just the videos - 41 (each are simple and each are short):
|
||
- [ ] [Probability Explained (video)](https://www.youtube.com/watch?v=uzkc-qNVoOk&list=PLC58778F28211FA19)
|
||
|
||
- ### NP, NP-Complete and Approximation Algorithms
|
||
- Know about the most famous classes of NP-complete problems, such as traveling salesman and the knapsack problem,
|
||
and be able to recognize them when an interviewer asks you them in disguise.
|
||
- Know what NP-complete means.
|
||
- [ ] [Computational Complexity (video)](https://www.youtube.com/watch?v=moPtwq_cVH8&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=23)
|
||
- [ ] Simonson:
|
||
- [ ] [Greedy Algs. II & Intro to NP Completeness (video)](https://youtu.be/qcGnJ47Smlo?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=2939)
|
||
- [ ] [NP Completeness II & Reductions (video)](https://www.youtube.com/watch?v=e0tGC6ZQdQE&index=16&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
|
||
- [ ] [NP Completeness III (Video)](https://www.youtube.com/watch?v=fCX1BGT3wjE&index=17&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
|
||
- [ ] [NP Completeness IV (video)](https://www.youtube.com/watch?v=NKLDp3Rch3M&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=18)
|
||
- [ ] Skiena:
|
||
- [ ] [CSE373 2012 - Lecture 23 - Introduction to NP-CompletenessNP Completeness IV (video)](https://youtu.be/KiK5TVgXbFg?list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&t=1508)
|
||
- [ ] [CSE373 2012 - Lecture 24 - NP-Completeness Proofs (video)](https://www.youtube.com/watch?v=27Al52X3hd4&index=24&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b)
|
||
- [ ] [CSE373 2012 - Lecture 25 - NP-Completeness Challenge (video)](https://www.youtube.com/watch?v=xCPH4gwIIXM&index=25&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b)
|
||
- [ ] [Complexity: P, NP, NP-completeness, Reductions (video)](https://www.youtube.com/watch?v=eHZifpgyH_4&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=22)
|
||
- [ ] [Complexity: Approximation Algorithms (video)](https://www.youtube.com/watch?v=MEz1J9wY2iM&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=24)
|
||
- [ ] [Complexity: Fixed-Parameter Algorithms (video)](https://www.youtube.com/watch?v=4q-jmGrmxKs&index=25&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)
|
||
- Peter Norvik discusses near-optimal solutions to traveling salesman problem:
|
||
- [Jupyter Notebook](http://nbviewer.jupyter.org/url/norvig.com/ipython/TSP.ipynb)
|
||
- Pages 1048 - 1140 in CLRS if you have it.
|
||
|
||
- ### Caches
|
||
- [ ] LRU cache:
|
||
- [ ] [The Magic of LRU Cache (100 Days of Google Dev) (video)](https://www.youtube.com/watch?v=R5ON3iwx78M)
|
||
- [ ] [Implementing LRU (video)](https://www.youtube.com/watch?v=bq6N7Ym81iI)
|
||
- [ ] [LeetCode - 146 LRU Cache (C++) (video)](https://www.youtube.com/watch?v=8-FZRAjR7qU)
|
||
- [ ] CPU cache:
|
||
- [ ] [MIT 6.004 L15: The Memory Hierarchy (video)](https://www.youtube.com/watch?v=vjYF_fAZI5E&list=PLrRW1w6CGAcXbMtDFj205vALOGmiRc82-&index=24)
|
||
- [ ] [MIT 6.004 L16: Cache Issues (video)](https://www.youtube.com/watch?v=ajgC3-pyGlk&index=25&list=PLrRW1w6CGAcXbMtDFj205vALOGmiRc82-)
|
||
|
||
- ### Processes and Threads
|
||
- [ ] Computer Science 162 - Operating Systems (25 videos):
|
||
- for precesses and threads see videos 1-11
|
||
- [Operating Systems and System Programming (video)](https://www.youtube.com/playlist?list=PL-XXv-cvA_iBDyz-ba4yDskqMDY6A1w_c)
|
||
- [What Is The Difference Between A Process And A Thread?](https://www.quora.com/What-is-the-difference-between-a-process-and-a-thread)
|
||
- Covers:
|
||
- Processes, Threads, Concurrency issues
|
||
- difference between processes and threads
|
||
- processes
|
||
- threads
|
||
- locks
|
||
- mutexes
|
||
- semaphores
|
||
- monitors
|
||
- how they work
|
||
- deadlock
|
||
- livelock
|
||
- CPU activity, interrupts, context switching
|
||
- Modern concurrency constructs with multicore processors
|
||
- Process resource needs (memory: code, static storage, stack, heap, and also file descriptors, i/o)
|
||
- Thread resource needs (shares above (minus stack) with other threads in same process but each has its own pc, stack counter, registers and stack)
|
||
- Forking is really copy on write (read-only) until the new process writes to memory, then it does a full copy.
|
||
- Context switching
|
||
- How context switching is initiated by the operating system and underlying hardware
|
||
- [ ] [threads in C++ (series - 10 videos)](https://www.youtube.com/playlist?list=PL5jc9xFGsL8E12so1wlMS0r0hTQoJL74M)
|
||
- [ ] concurrency in Python (videos):
|
||
- [ ] [Short series on threads](https://www.youtube.com/playlist?list=PL1H1sBF1VAKVMONJWJkmUh6_p8g4F2oy1)
|
||
- [ ] [Python Threads](https://www.youtube.com/watch?v=Bs7vPNbB9JM)
|
||
- [ ] [Understanding the Python GIL (2010)](https://www.youtube.com/watch?v=Obt-vMVdM8s)
|
||
- [reference](http://www.dabeaz.com/GIL)
|
||
- [ ] [David Beazley - Python Concurrency From the Ground Up: LIVE! - PyCon 2015](https://www.youtube.com/watch?v=MCs5OvhV9S4)
|
||
- [ ] [Keynote David Beazley - Topics of Interest (Python Asyncio)](https://www.youtube.com/watch?v=ZzfHjytDceU)
|
||
- [ ] [Mutex in Python](https://www.youtube.com/watch?v=0zaPs8OtyKY)
|
||
|
||
|
||
Scalability and System Design are very large topics with many topics and resources, since there is a lot to consider
|
||
when designing a software/hardware system that can scale. Expect to spend quite a bit of time on this.
|
||
|
||
- ### System Design, Scalability, Data Handling
|
||
- Considerations from Yegge:
|
||
- scalability
|
||
- Distill large data sets to single values
|
||
- Transform one data set to another
|
||
- Handling obscenely large amounts of data
|
||
- system design
|
||
- features sets
|
||
- interfaces
|
||
- class hierarchies
|
||
- designing a system under certain constraints
|
||
- simplicity and robustness
|
||
- tradeoffs
|
||
- performance analysis and optimization
|
||
- [ ] **START HERE**: [System Design from HiredInTech](http://www.hiredintech.com/system-design/)
|
||
- [ ] [How Do I Prepare To Answer Design Questions In A Technical Inverview?](https://www.quora.com/How-do-I-prepare-to-answer-design-questions-in-a-technical-interview?redirected_qid=1500023)
|
||
- [ ] [8 Things You Need to Know Before a System Design Interview](http://blog.gainlo.co/index.php/2015/10/22/8-things-you-need-to-know-before-system-design-interviews/)
|
||
- [ ] [Algorithm design](http://www.hiredintech.com/algorithm-design/)
|
||
- [ ] [Database Normalization - 1NF, 2NF, 3NF and 4NF (video)](https://www.youtube.com/watch?v=UrYLYV7WSHM)
|
||
- [ ] [System Design Interview](https://github.com/checkcheckzz/system-design-interview) - There are a lot of resources in this one. Look through the articles and examples. I put some of them below.
|
||
- [ ] [How to ace a systems design interview](http://www.palantir.com/2011/10/how-to-rock-a-systems-design-interview/)
|
||
- [ ] [Numbers Everyone Should Know](http://everythingisdata.wordpress.com/2009/10/17/numbers-everyone-should-know/)
|
||
- [ ] [How long does it take to make a context switch?](http://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html)
|
||
- [ ] [Transactions Across Datacenters (video)](https://www.youtube.com/watch?v=srOgpXECblk)
|
||
- [ ] [A plain english introduction to CAP Theorem](http://ksat.me/a-plain-english-introduction-to-cap-theorem/)
|
||
- [ ] Paxos Consensus algorithm:
|
||
- [short video](https://www.youtube.com/watch?v=s8JqcZtvnsM)
|
||
- [extended video with use case and multi-paxos](https://www.youtube.com/watch?v=JEpsBg0AO6o)
|
||
- [paper](http://research.microsoft.com/en-us/um/people/lamport/pubs/paxos-simple.pdf)
|
||
- [ ] [Consistent Hashing](http://www.tom-e-white.com/2007/11/consistent-hashing.html)
|
||
- [ ] [NoSQL Patterns](http://horicky.blogspot.com/2009/11/nosql-patterns.html)
|
||
- [ ] [Optional: UML 2.0 Series (vido)](https://www.youtube.com/watch?v=OkC7HKtiZC0&list=PLGLfVvz_LVvQ5G-LdJ8RLqe-ndo7QITYc)
|
||
- [ ] OOSE: Software Dev Using UML and Java (21 videos):
|
||
- Can skip this if you have a great grasp of OO and OO design practices.
|
||
- [OOSE: Software Dev Using UML and Java](https://www.youtube.com/playlist?list=PLJ9pm_Rc9HesnkwKlal_buSIHA-jTZMpO)
|
||
- [ ] SOLID OOP Principles:
|
||
- [ ] [Bob Martin SOLID Principles of Object Oriented and Agile Design (video)](https://www.youtube.com/watch?v=TMuno5RZNeE)
|
||
- [ ] [SOLID Design Patterns in C# (video)](https://www.youtube.com/playlist?list=PL8m4NUhTQU48oiGCSgCP1FiJEcg_xJzyQ)
|
||
- [ ] [SOLID Principles (video)](https://www.youtube.com/playlist?list=PL4CE9F710017EA77A)
|
||
- [ ] S - [Single Responsibility Principle](http://www.oodesign.com/single-responsibility-principle.html) | [Single responsibility to each Object](http://www.javacodegeeks.com/2011/11/solid-single-responsibility-principle.html)
|
||
- [more flavor](https://docs.google.com/open?id=0ByOwmqah_nuGNHEtcU5OekdDMkk)
|
||
- [ ] O - [Open/Closed Principal](http://www.oodesign.com/open-close-principle.html) | [On production level Objects are ready for extension for not for modification](https://en.wikipedia.org/wiki/Open/closed_principle)
|
||
- [more flavor](http://docs.google.com/a/cleancoder.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BwhCYaYDn8EgN2M5MTkwM2EtNWFkZC00ZTI3LWFjZTUtNTFhZGZiYmUzODc1&hl=en)
|
||
- [ ] L - [Liskov Substitution Principal](http://www.oodesign.com/liskov-s-substitution-principle.html) | [Base Class and Derived class follow ‘IS A’ principal](http://stackoverflow.com/questions/56860/what-is-the-liskov-substitution-principle)
|
||
- [more flavor](http://docs.google.com/a/cleancoder.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BwhCYaYDn8EgNzAzZjA5ZmItNjU3NS00MzQ5LTkwYjMtMDJhNDU5ZTM0MTlh&hl=en)
|
||
- [ ] I - [Interface segregation principle](http://www.oodesign.com/interface-segregation-principle.html) | clients should not be forced to implement interfaces they don't use
|
||
- [Interface Segregation Principle in 5 minutes (video)](https://www.youtube.com/watch?v=3CtAfl7aXAQ)
|
||
- [more flavor](http://docs.google.com/a/cleancoder.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BwhCYaYDn8EgOTViYjJhYzMtMzYxMC00MzFjLWJjMzYtOGJiMDc5N2JkYmJi&hl=en)
|
||
- [ ] D -[Dependency Inversion principle](http://www.oodesign.com/dependency-inversion-principle.html) | Reduce the dependency In composition of objects.
|
||
- [Why Is The Dependency Inversion Principle And Why Is It Important](http://stackoverflow.com/questions/62539/what-is-the-dependency-inversion-principle-and-why-is-it-important)
|
||
- [more flavor](http://docs.google.com/a/cleancoder.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BwhCYaYDn8EgMjdlMWIzNGUtZTQ0NC00ZjQ5LTkwYzQtZjRhMDRlNTQ3ZGMz&hl=en)
|
||
- [ ] Scalability:
|
||
- [ ] [Great overview (video)](https://www.youtube.com/watch?v=-W9F__D3oY4)
|
||
- [ ] Short series:
|
||
- [Clones](http://www.lecloud.net/post/7295452622/scalability-for-dummies-part-1-clones)
|
||
- [Database](http://www.lecloud.net/post/7994751381/scalability-for-dummies-part-2-database)
|
||
- [Cache](http://www.lecloud.net/post/9246290032/scalability-for-dummies-part-3-cache)
|
||
- [Asynchronism](http://www.lecloud.net/post/9699762917/scalability-for-dummies-part-4-asynchronism)
|
||
- [ ] [Scalable Web Architecture and Distributed Systems](http://www.aosabook.org/en/distsys.html)
|
||
- [ ] [Fallacies of Distributed Computing Explained](https://pages.cs.wisc.edu/~zuyu/files/fallacies.pdf)
|
||
- [ ] [Pragmatic Programming Techniques](http://horicky.blogspot.com/2010/10/scalable-system-design-patterns.html)
|
||
- [extra: Google Pregel Graph Processing](http://horicky.blogspot.com/2010/07/google-pregel-graph-processing.html)
|
||
- [ ] [Jeff Dean - Building Software Systems At Google and Lessons Learned (video)](https://www.youtube.com/watch?v=modXC5IWTJI)
|
||
- [ ] [Introduction to Architecting Systems for Scale](http://lethain.com/introduction-to-architecting-systems-for-scale/)
|
||
- [ ] [Scaling mobile games to a global audience using App Engine and Cloud Datastore (video)](https://www.youtube.com/watch?v=9nWyWwY2Onc)
|
||
- [ ] [How Google Does Planet-Scale Engineering for Planet-Scale Infra (video)](https://www.youtube.com/watch?v=H4vMcD7zKM0)
|
||
- [ ] [The Importance of Algorithms](https://www.topcoder.com/community/data-science/data-science-tutorials/the-importance-of-algorithms/)
|
||
- [ ] [Sharding](http://highscalability.com/blog/2009/8/6/an-unorthodox-approach-to-database-design-the-coming-of-the.html)
|
||
- [ ] [Scale at Facebook (2009)](https://www.infoq.com/presentations/Scale-at-Facebook)
|
||
- [ ] [Scale at Facebook (2012), "Building for a Billion Users" (video)](https://www.youtube.com/watch?v=oodS71YtkGU)
|
||
- [ ] [Engineering for the Long Game - Astrid Atkinson Keynote(video)](https://www.youtube.com/watch?v=p0jGmgIrf_M&list=PLRXxvay_m8gqVlExPC5DG3TGWJTaBgqSA&index=4)
|
||
- [ ] [7 Years Of YouTube Scalability Lessons In 30 Minutes](http://highscalability.com/blog/2012/3/26/7-years-of-youtube-scalability-lessons-in-30-minutes.html)
|
||
- [video](https://www.youtube.com/watch?v=G-lGCC4KKok)
|
||
- [ ] [How PayPal Scaled To Billions Of Transactions Daily Using Just 8VMs](http://highscalability.com/blog/2016/8/15/how-paypal-scaled-to-billions-of-transactions-daily-using-ju.html)
|
||
- [ ] [How to Remove Duplicates in Large Datasets](https://blog.clevertap.com/how-to-remove-duplicates-in-large-datasets/)
|
||
- [ ] [A look inside Etsy's scale and engineering culture with Jon Cowie (video)](https://www.youtube.com/watch?v=3vV4YiqKm1o)
|
||
- [ ] [What Led Amazon to its Own Microservices Architecture](http://thenewstack.io/led-amazon-microservices-architecture/)
|
||
- [ ] [To Compress Or Not To Compress, That Was Uber's Question](https://eng.uber.com/trip-data-squeeze/)
|
||
- [ ] [Asyncio Tarantool Queue, Get In The Queue](http://highscalability.com/blog/2016/3/3/asyncio-tarantool-queue-get-in-the-queue.html)
|
||
- [ ] [When Should Approximate Query Processing Be Used?](http://highscalability.com/blog/2016/2/25/when-should-approximate-query-processing-be-used.html)
|
||
- [ ] [Google's Transition From Single Datacenter, To Failover, To A Native Multihomed Architecture]( http://highscalability.com/blog/2016/2/23/googles-transition-from-single-datacenter-to-failover-to-a-n.html)
|
||
- [ ] [Spanner](http://highscalability.com/blog/2012/9/24/google-spanners-most-surprising-revelation-nosql-is-out-and.html)
|
||
- [ ] [Egnyte Architecture: Lessons Learned In Building And Scaling A Multi Petabyte Distributed System](http://highscalability.com/blog/2016/2/15/egnyte-architecture-lessons-learned-in-building-and-scaling.html)
|
||
- [ ] [Machine Learning Driven Programming: A New Programming For A New World](http://highscalability.com/blog/2016/7/6/machine-learning-driven-programming-a-new-programming-for-a.html)
|
||
- [ ] [The Image Optimization Technology That Serves Millions Of Requests Per Day](http://highscalability.com/blog/2016/6/15/the-image-optimization-technology-that-serves-millions-of-re.html)
|
||
- [ ] [A Patreon Architecture Short](http://highscalability.com/blog/2016/2/1/a-patreon-architecture-short.html)
|
||
- [ ] [Tinder: How Does One Of The Largest Recommendation Engines Decide Who You'll See Next?](http://highscalability.com/blog/2016/1/27/tinder-how-does-one-of-the-largest-recommendation-engines-de.html)
|
||
- [ ] [Design Of A Modern Cache](http://highscalability.com/blog/2016/1/25/design-of-a-modern-cache.html)
|
||
- [ ] [Live Video Streaming At Facebook Scale](http://highscalability.com/blog/2016/1/13/live-video-streaming-at-facebook-scale.html)
|
||
- [ ] [A Beginner's Guide To Scaling To 11 Million+ Users On Amazon's AWS](http://highscalability.com/blog/2016/1/11/a-beginners-guide-to-scaling-to-11-million-users-on-amazons.html)
|
||
- [ ] [How Does The Use Of Docker Effect Latency?](http://highscalability.com/blog/2015/12/16/how-does-the-use-of-docker-effect-latency.html)
|
||
- [ ] [Does AMP Counter An Existential Threat To Google?](http://highscalability.com/blog/2015/12/14/does-amp-counter-an-existential-threat-to-google.html)
|
||
- [ ] [A 360 Degree View Of The Entire Netflix Stack](http://highscalability.com/blog/2015/11/9/a-360-degree-view-of-the-entire-netflix-stack.html)
|
||
- [ ] [Latency Is Everywhere And It Costs You Sales - How To Crush It](http://highscalability.com/latency-everywhere-and-it-costs-you-sales-how-crush-it)
|
||
- [ ] [Serverless (very long, just need the gist)](http://martinfowler.com/articles/serverless.html)
|
||
- [ ] [What Powers Instagram: Hundreds of Instances, Dozens of Technologies](http://instagram-engineering.tumblr.com/post/13649370142/what-powers-instagram-hundreds-of-instances)
|
||
- [ ] [Cinchcast Architecture - Producing 1,500 Hours Of Audio Every Day](http://highscalability.com/blog/2012/7/16/cinchcast-architecture-producing-1500-hours-of-audio-every-d.html)
|
||
- [ ] [Justin.Tv's Live Video Broadcasting Architecture](http://highscalability.com/blog/2010/3/16/justintvs-live-video-broadcasting-architecture.html)
|
||
- [ ] [Playfish's Social Gaming Architecture - 50 Million Monthly Users And Growing](http://highscalability.com/blog/2010/9/21/playfishs-social-gaming-architecture-50-million-monthly-user.html)
|
||
- [ ] [TripAdvisor Architecture - 40M Visitors, 200M Dynamic Page Views, 30TB Data](http://highscalability.com/blog/2011/6/27/tripadvisor-architecture-40m-visitors-200m-dynamic-page-view.html)
|
||
- [ ] [PlentyOfFish Architecture](http://highscalability.com/plentyoffish-architecture)
|
||
- [ ] [Salesforce Architecture - How They Handle 1.3 Billion Transactions A Day](http://highscalability.com/blog/2013/9/23/salesforce-architecture-how-they-handle-13-billion-transacti.html)
|
||
- [ ] [ESPN's Architecture At Scale - Operating At 100,000 Duh Nuh Nuhs Per Second](http://highscalability.com/blog/2013/11/4/espns-architecture-at-scale-operating-at-100000-duh-nuh-nuhs.html)
|
||
- [ ] See "Messaging, Serialization, and Queueing Systems" way below for info on some of the technologies that can glue services together
|
||
- [ ] Twitter:
|
||
- [O'Reilly MySQL CE 2011: Jeremy Cole, "Big and Small Data at @Twitter" (video)](https://www.youtube.com/watch?v=5cKTP36HVgI)
|
||
- [Timelines at Scale](https://www.infoq.com/presentations/Twitter-Timeline-Scalability)
|
||
- For even more, see "Mining Massive Datasets" video series in the Video Series section.
|
||
- [ ] Practicing the system design process: Here are some ideas to try working through on paper, each with some documentation on how it was handled in the real world:
|
||
- review: [System Design from HiredInTech](http://www.hiredintech.com/system-design/)
|
||
- [cheat sheet](https://github.com/jwasham/google-interview-university/blob/master/extras/cheat%20sheets/system-design.pdf)
|
||
- flow:
|
||
1. Understand the problem and scope:
|
||
- define the use cases, with interviewer's help
|
||
- suggest additional features
|
||
- remove items that interviewer deems out of scope
|
||
- assume high availability is required, add as a use case
|
||
2. Think about constraints:
|
||
- ask how many requests per month
|
||
- ask how many requests per second (they may volunteer it or make you do the math)
|
||
- estimate reads vs. writes percentage
|
||
- keep 80/20 rule in mind when estimating
|
||
- how much data written per second
|
||
- total storage required over 5 years
|
||
- how much data read per second
|
||
3. Abstract design:
|
||
- layers (service, data, caching)
|
||
- infrastructure: load balancing, messaging
|
||
- rough overview of any key algorithm that drives the service
|
||
- consider bottlenecks and determine solutions
|
||
- Exercises:
|
||
- [Design a CDN network: old article](http://repository.cmu.edu/cgi/viewcontent.cgi?article=2112&context=compsci)
|
||
- [Design a random unique ID generation system](https://blog.twitter.com/2010/announcing-snowflake)
|
||
- [Design an online multiplayer card game](http://www.indieflashblog.com/how-to-create-an-asynchronous-multiplayer-game.html)
|
||
- [Design a key-value database](http://www.slideshare.net/dvirsky/introduction-to-redis)
|
||
- [Design a function to return the top k requests during past time interval]( https://icmi.cs.ucsb.edu/research/tech_reports/reports/2005-23.pdf)
|
||
- [Design a picture sharing system](http://highscalability.com/blog/2011/12/6/instagram-architecture-14-million-users-terabytes-of-photos.html)
|
||
- [Design a recommendation system](http://ijcai13.org/files/tutorial_slides/td3.pdf)
|
||
- [Design a URL-shortener system: copied from above](http://www.hiredintech.com/system-design/the-system-design-process/)
|
||
- [Design a cache system](https://www.adayinthelifeof.nl/2011/02/06/memcache-internals/)
|
||
|
||
- ### Papers
|
||
- These are Google papers and well-known papers.
|
||
- Reading all from end to end with full comprehension will likely take more time than you have. I recommend being selective on papers and their sections.
|
||
- [ ] [1978: Communicating Sequential Processes](http://spinroot.com/courses/summer/Papers/hoare_1978.pdf)
|
||
- [implemented in Go](https://godoc.org/github.com/thomas11/csp)
|
||
- [Love classic papers?](https://www.cs.cmu.edu/~crary/819-f09/)
|
||
- [ ] [2003: The Google File System](http://static.googleusercontent.com/media/research.google.com/en//archive/gfs-sosp2003.pdf)
|
||
- replaced by Colossus in 2012
|
||
- [ ] [2004: MapReduce: Simplified Data Processing on Large Clusters]( http://static.googleusercontent.com/media/research.google.com/en//archive/mapreduce-osdi04.pdf)
|
||
- mostly replaced by Cloud Dataflow?
|
||
- [ ] [2007: What Every Programmer Should Know About Memory (very long, and the author encourages skipping of some sections)](https://www.akkadia.org/drepper/cpumemory.pdf)
|
||
- [ ] [2012: Google's Colossus](https://www.wired.com/2012/07/google-colossus/)
|
||
- paper not available
|
||
- [ ] 2012: AddressSanitizer: A Fast Address Sanity Checker:
|
||
- [paper](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/37752.pdf)
|
||
- [video](https://www.usenix.org/conference/atc12/technical-sessions/presentation/serebryany)
|
||
- [ ] 2013: Spanner: Google’s Globally-Distributed Database:
|
||
- [paper](http://static.googleusercontent.com/media/research.google.com/en//archive/spanner-osdi2012.pdf)
|
||
- [video](https://www.usenix.org/node/170855)
|
||
- [ ] [2014: Machine Learning: The High-Interest Credit Card of Technical Debt](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43146.pdf)
|
||
- [ ] [2015: Continuous Pipelines at Google](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43790.pdf)
|
||
- [ ] [2015: High-Availability at Massive Scale: Building Google’s Data Infrastructure for Ads](https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/44686.pdf)
|
||
- [ ] [2015: TensorFlow: Large-Scale Machine Learning on Heterogeneous Distributed Systems](http://download.tensorflow.org/paper/whitepaper2015.pdf )
|
||
- [ ] [2015: How Developers Search for Code: A Case Study](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43835.pdf)
|
||
- [ ] [2016: Borg, Omega, and Kubernetes](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/44843.pdf)
|
||
|
||
- ### Testing
|
||
- To cover:
|
||
- how unit testing works
|
||
- what are mock objects
|
||
- what is integration testing
|
||
- what is dependency injection
|
||
- [ ] [Agile Software Testing with James Bach (video)](https://www.youtube.com/watch?v=SAhJf36_u5U)
|
||
- [ ] [Open Lecture by James Bach on Software Testing (video)](https://www.youtube.com/watch?v=ILkT_HV9DVU)
|
||
- [ ] [Steve Freeman - Test-Driven Development (that’s not what we meant) (video)](https://vimeo.com/83960706)
|
||
- [slides](http://gotocon.com/dl/goto-berlin-2013/slides/SteveFreeman_TestDrivenDevelopmentThatsNotWhatWeMeant.pdf)
|
||
- [ ] [TDD is dead. Long live testing.](http://david.heinemeierhansson.com/2014/tdd-is-dead-long-live-testing.html)
|
||
- [ ] [Is TDD dead? (video)](https://www.youtube.com/watch?v=z9quxZsLcfo)
|
||
- [ ] [Video series (152 videos) - not all are needed (video)](https://www.youtube.com/watch?v=nzJapzxH_rE&list=PLAwxTw4SYaPkWVHeC_8aSIbSxE_NXI76g)
|
||
- [ ] [Test-Driven Web Development with Python](http://www.obeythetestinggoat.com/pages/book.html#toc)
|
||
- [ ] Dependency injection:
|
||
- [ ] [video](https://www.youtube.com/watch?v=IKD2-MAkXyQ)
|
||
- [ ] [Tao Of Testing](http://jasonpolites.github.io/tao-of-testing/ch3-1.1.html)
|
||
- [ ] [How to write tests](http://jasonpolites.github.io/tao-of-testing/ch4-1.1.html)
|
||
|
||
- ### Scheduling
|
||
- in an OS, how it works
|
||
- can be gleaned from Operating System videos
|
||
|
||
- ### Implement system routines
|
||
- understand what lies beneath the programming APIs you use
|
||
- can you implement them?
|
||
|
||
- ### String searching & manipulations
|
||
- [ ] [Search pattern in text (video)](https://www.coursera.org/learn/data-structures/lecture/tAfHI/search-pattern-in-text)
|
||
- [ ] Rabin-Karp (videos):
|
||
- [Rabin Karps Algorithm](https://www.coursera.org/learn/data-structures/lecture/c0Qkw/rabin-karps-algorithm)
|
||
- [Precomputing](https://www.coursera.org/learn/data-structures/lecture/nYrc8/optimization-precomputation)
|
||
- [Optimization: Implementation and Analysis](https://www.coursera.org/learn/data-structures/lecture/h4ZLc/optimization-implementation-and-analysis)
|
||
- [Table Doubling, Karp-Rabin](https://www.youtube.com/watch?v=BRO7mVIFt08&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=9)
|
||
- [Rolling Hashes, Amortized Analysis](https://www.youtube.com/watch?v=w6nuXg0BISo&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=32)
|
||
- [ ] Knuth-Morris-Pratt (KMP):
|
||
- [Pratt Algorithm](https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm)
|
||
- [Tutorial: The Knuth-Morris-Pratt (KMP) String Matching Algorithm](https://www.youtube.com/watch?v=2ogqPWJSftE)
|
||
- [ ] Boyer–Moore string search algorithm
|
||
- [Boyer-Moore String Search Algorithm](https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm)
|
||
- [Advanced String Searching Boyer-Moore-Horspool Algorithms (video)](https://www.youtube.com/watch?v=QDZpzctPf10)
|
||
- [ ] [Coursera: Algorithms on Strings](https://www.coursera.org/learn/algorithms-on-strings/home/week/1)
|
||
|
||
---
|
||
|
||
## Final Review
|
||
|
||
This section will have shorter videos that can you watch pretty quickly to review most of the important concepts.
|
||
It's nice if you want a refresher often.
|
||
(More items will be added here)
|
||
|
||
#### General:
|
||
|
||
- [ ] Series of 2-3 minutes short subject videos (23 videos)
|
||
- [Videos](https://www.youtube.com/watch?v=r4r1DZcx1cM&list=PLmVb1OknmNJuC5POdcDv5oCS7_OUkDgpj&index=22)
|
||
- [ ] Series of 2-5 minutes short subject videos - Michael Sambol (18 videos):
|
||
- [Videos](https://www.youtube.com/channel/UCzDJwLWoYCUQowF_nG3m5OQ)
|
||
|
||
#### Sorts:
|
||
|
||
- [ ] Merge Sort: https://www.youtube.com/watch?v=GCae1WNvnZM
|
||
|
||
|
||
## Books
|
||
|
||
### Mentioned in Google Coaching
|
||
|
||
**Read and do exercises:**
|
||
|
||
- [ ] The Algorithm Design Manual (Skiena)
|
||
- Book (can rent on kindle):
|
||
- [Algorithm Design Manual](http://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/dp/1849967202)
|
||
- Half.com is a great resource for textbooks at good prices.
|
||
- Answers:
|
||
- [Solutions](http://www.algorithm.cs.sunysb.edu/algowiki/index.php/The_Algorithms_Design_Manual_(Second_Edition))
|
||
- [Solutions](http://blog.panictank.net/category/algorithmndesignmanualsolutions/page/2/)
|
||
- [Errata](http://www3.cs.stonybrook.edu/~skiena/algorist/book/errata)
|
||
|
||
Once you've understood everything in the daily plan, and read and done exercises from the the books above,
|
||
read and do exercises from the books below. Then move to coding challenges (further down below)
|
||
|
||
**Read first:**
|
||
- [ ] [Programming Interviews Exposed: Secrets to Landing Your Next Job, 2nd Edition](http://www.wiley.com/WileyCDA/WileyTitle/productCd-047012167X.html)
|
||
|
||
**Read second (recommended by many, but not in Google coaching docs):**
|
||
- [ ] [Cracking the Coding Interview, 6th Edition](http://www.amazon.com/Cracking-Coding-Interview-6th-Programming/dp/0984782850/)
|
||
- If you see people reference "The Google Resume", it was a book replaced by "Cracking the Coding Interview".
|
||
|
||
### Additional books
|
||
|
||
These were not suggested by Google but I added because I needed the background knowledge
|
||
|
||
- [ ] C Programming Language, Vol 2
|
||
- [answers to questions](https://github.com/lekkas/c-algorithms)
|
||
|
||
- [ ] C++ Primer Plus, 6th Edition
|
||
|
||
- [ ] [The Unix Programming Environment](http://product.half.ebay.com/The-UNIX-Programming-Environment-by-Brian-W-Kernighan-and-Rob-Pike-1983-Other/54385&tg=info)
|
||
|
||
- [ ] [Programming Pearls](http://www.amazon.com/Programming-Pearls-2nd-Jon-Bentley/dp/0201657880)
|
||
|
||
- [ ] [Algorithms and Programming: Problems and Solutions](http://www.amazon.com/Algorithms-Programming-Solutions-Alexander-Shen/dp/0817638474)
|
||
|
||
### If you have time
|
||
|
||
- [ ] [Introduction to Algorithms](https://www.amazon.com/Introduction-Algorithms-3rd-MIT-Press/dp/0262033844)
|
||
- Half.com is a great resource for textbooks at good prices.
|
||
|
||
- [ ] [Elements of Programming Interviews](https://www.amazon.com/Elements-Programming-Interviews-Insiders-Guide/dp/1479274836)
|
||
- all code is in C++, if you're looking to use C++ in your interview
|
||
- good book on problem solving in general.
|
||
|
||
## Coding exercises/challenges
|
||
|
||
Once you've learned your brains out, put those brains to work.
|
||
Take coding challenges every day, as many as you can.
|
||
|
||
Programming Question Prep:
|
||
|
||
- [ ] [Great intro (copied from System Design section): Algorithm design:](http://www.hiredintech.com/algorithm-design/)
|
||
- [ ] [How to Find a Solution](https://www.topcoder.com/community/data-science/data-science-tutorials/how-to-find-a-solution/)
|
||
- [ ] [How to Dissect a Topcoder Problem Statement](https://www.topcoder.com/community/data-science/data-science-tutorials/how-to-dissect-a-topcoder-problem-statement/)
|
||
- [ ] [Mathematics for Topcoders](https://www.topcoder.com/community/data-science/data-science-tutorials/mathematics-for-topcoders/)
|
||
- [ ] [Dynamic Programming – From Novice to Advanced](https://www.topcoder.com/community/data-science/data-science-tutorials/dynamic-programming-from-novice-to-advanced/)
|
||
|
||
- [MIT Interview Materials](https://courses.csail.mit.edu/iap/interview/materials.php)
|
||
|
||
- [Exercises for getting better at a given language](http://exercism.io/languages)
|
||
|
||
Programming:
|
||
|
||
- [LeetCode](https://leetcode.com/)
|
||
- [TopCoder](https://www.topcoder.com/)
|
||
- [Project Euler (math-focused)](https://projecteuler.net/index.php?section=problems)
|
||
- [Codewars](http://www.codewars.com)
|
||
- [HackerRank](https://www.hackerrank.com/)
|
||
- [Codility](https://codility.com/programmers/)
|
||
- [InterviewCake](https://www.interviewcake.com/)
|
||
- [InterviewBit](https://www.interviewbit.com/invite/icjf)
|
||
|
||
- [Mock interviewers from big companies](http://www.gainlo.co/)
|
||
|
||
## Once you're closer to the interview
|
||
|
||
- [ ] Cracking The Coding Interview Set 2 (videos):
|
||
- [Cracking The Code Interview](https://www.youtube.com/watch?v=4NIb9l3imAo)
|
||
- [Cracking the Coding Interview - Fullstack Speaker Series](https://www.youtube.com/watch?v=Eg5-tdAwclo)
|
||
- [Ask Me Anything: Gayle Laakmann McDowell (author of Cracking the Coding Interview)](https://www.youtube.com/watch?v=1fqxMuPmGak)
|
||
|
||
## Your Resume
|
||
|
||
- [Ten Tips for a (Slightly) Less Awful Resume](http://steve-yegge.blogspot.co.uk/2007_09_01_archive.html)
|
||
- Great stuff at the back of Cracking The Coding Interview
|
||
|
||
|
||
## Be thinking of for when the interview comes
|
||
|
||
Think of about 20 interview questions you'll get, along the lines of the items below.
|
||
Have 2-3 answers for each
|
||
Have a story, not just data, about something you accomplished
|
||
|
||
- Why do you want this job?
|
||
- What's a tough problem you've solved?
|
||
- Biggest challenges faced?
|
||
- Best/worst designs seen?
|
||
- Ideas for improving an existing Google product.
|
||
- How do you work best, as an individual and as part of a team?
|
||
- Which of your skills or experiences would be assets in the role and why?
|
||
- What did you most enjoy at [job x / project y]?
|
||
- What was the biggest challenge you faced at [job x / project y]?
|
||
- What was the hardest bug you faced at [job x / project y]?
|
||
- What did you learn at [job x / project y]?
|
||
- What would you have done better at [job x / project y]?
|
||
|
||
## Have questions for the interviewer
|
||
|
||
Some of mine (I already may know answer to but want their opinion or team perspective):
|
||
|
||
- How large is your team?
|
||
- What is your dev cycle look like? Do you do waterfall/sprints/agile?
|
||
- Are rushes to deadlines common? Or is there flexibility?
|
||
- How are decisions made in your team?
|
||
- How many meetings do you have per week?
|
||
- Do you feel your work environment helps you concentrate?
|
||
- What are you working on?
|
||
- What do you like about it?
|
||
- What is the work life like?
|
||
|
||
## Once You've Got The Job
|
||
|
||
Congratulations!
|
||
|
||
- [10 things I wish I knew on my first day at Google](https://medium.com/@moonstorming/10-things-i-wish-i-knew-on-my-first-day-at-google-107581d87286#.livxn7clw)
|
||
|
||
Keep learning.
|
||
|
||
You're never really done.
|
||
|
||
---
|
||
|
||
*****************************************************************************************************
|
||
*****************************************************************************************************
|
||
|
||
Everything below this point is optional. These are my recommendations, not Google's.
|
||
By studying these, you'll get greater exposure to more CS concepts, and will be better prepared for
|
||
any software engineering job.
|
||
|
||
*****************************************************************************************************
|
||
*****************************************************************************************************
|
||
|
||
---
|
||
|
||
## Additional Learning
|
||
|
||
- ### Unicode
|
||
- [ ] [The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets]( http://www.joelonsoftware.com/articles/Unicode.html)
|
||
- [ ] [What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text](http://kunststube.net/encoding/)
|
||
|
||
- ### Endianness
|
||
- [ ] [Big And Little Endian](https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html)
|
||
- [ ] [Big Endian Vs Little Endian (video)](https://www.youtube.com/watch?v=JrNF0KRAlyo)
|
||
- [ ] [Big And Little Endian Inside/Out (video)](https://www.youtube.com/watch?v=oBSuXP-1Tc0)
|
||
- Very technical talk for kernel devs. Don't worry if most is over your head.
|
||
- The first half is enough.
|
||
|
||
- ### Emacs and vi(m)
|
||
- suggested by Yegge, from an old Amazon recruiting post: Familiarize yourself with a unix-based code editor
|
||
- vi(m):
|
||
- [Editing With vim 01 - Installation, Setup, and The Modes (video)](https://www.youtube.com/watch?v=5givLEMcINQ&index=1&list=PL13bz4SHGmRxlZVmWQ9DvXo1fEg4UdGkr)
|
||
- [VIM Adventures](http://vim-adventures.com/)
|
||
- set of 4 videos:
|
||
- [The vi/vim editor - Lesson 1](https://www.youtube.com/watch?v=SI8TeVMX8pk)
|
||
- [The vi/vim editor - Lesson 2](https://www.youtube.com/watch?v=F3OO7ZIOaJE)
|
||
- [The vi/vim editor - Lesson 3](https://www.youtube.com/watch?v=ZYEccA_nMaI)
|
||
- [The vi/vim editor - Lesson 4](https://www.youtube.com/watch?v=1lYD5gwgZIA)
|
||
- [Using Vi Instead of Emacs](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#Using_Vi_instead_of_Emacs)
|
||
- emacs:
|
||
- [Basics Emacs Tutorial (video)](https://www.youtube.com/watch?v=hbmV1bnQ-i0)
|
||
- set of 3 (videos):
|
||
- [Emacs Tutorial (Beginners) -Part 1- File commands, cut/copy/paste, cursor commands](https://www.youtube.com/watch?v=ujODL7MD04Q)
|
||
- [Emacs Tutorial (Beginners) -Part 2- Buffer management, search, M-x grep and rgrep modes](https://www.youtube.com/watch?v=XWpsRupJ4II)
|
||
- [Emacs Tutorial (Beginners) -Part 3- Expressions, Statements, ~/.emacs file and packages](https://www.youtube.com/watch?v=paSgzPso-yc)
|
||
- [Evil Mode: Or, How I Learned to Stop Worrying and Love Emacs (video)](https://www.youtube.com/watch?v=JWD1Fpdd4Pc)
|
||
- [Writing C Programs With Emacs](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#Writing_C_programs_with_Emacs)
|
||
- [(maybe) Org Mode In Depth: Managing Structure (video)](https://www.youtube.com/watch?v=nsGYet02bEk)
|
||
|
||
- ### Unix command line tools
|
||
- suggested by Yegge, from an old Amazon recruiting post. I filled in the list below from good tools.
|
||
- [ ] bash
|
||
- [ ] cat
|
||
- [ ] grep
|
||
- [ ] sed
|
||
- [ ] awk
|
||
- [ ] curl or wget
|
||
- [ ] sort
|
||
- [ ] tr
|
||
- [ ] uniq
|
||
- [ ] [strace](https://en.wikipedia.org/wiki/Strace)
|
||
- [ ] [tcpdump](https://danielmiessler.com/study/tcpdump/)
|
||
|
||
- ### Information theory (videos)
|
||
- [ ] [Khan Academy](https://www.khanacademy.org/computing/computer-science/informationtheory)
|
||
- [ ] more about Markov processes:
|
||
- [ ] [Core Markov Text Generation](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/waxgx/core-markov-text-generation)
|
||
- [ ] [Core Implementing Markov Text Generation](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/gZhiC/core-implementing-markov-text-generation)
|
||
- [ ] [Project = Markov Text Generation Walk Through](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/EUjrq/project-markov-text-generation-walk-through)
|
||
- See more in MIT 6.050J Information and Entropy series below.
|
||
|
||
- ### Parity & Hamming Code (videos)
|
||
- [ ] [Intro](https://www.youtube.com/watch?v=q-3BctoUpHE)
|
||
- [ ] [Parity](https://www.youtube.com/watch?v=DdMcAUlxh1M)
|
||
- [ ] Hamming Code:
|
||
- [Error detection](https://www.youtube.com/watch?v=1A_NcXxdoCc)
|
||
- [Error correction](https://www.youtube.com/watch?v=JAMLuxdHH8o)
|
||
- [ ] [Error Checking](https://www.youtube.com/watch?v=wbH2VxzmoZk)
|
||
|
||
- ### Entropy
|
||
- also see videos below
|
||
- make sure to watch information theory videos first
|
||
- [ ] [Information Theory, Claude Shannon, Entropy, Redundancy, Data Compression & Bits (video)](https://youtu.be/JnJq3Py0dyM?t=176)
|
||
|
||
- ### Cryptography
|
||
- also see videos below
|
||
- make sure to watch information theory videos first
|
||
- [ ] [Khan Academy Series](https://www.khanacademy.org/computing/computer-science/cryptography)
|
||
- [ ] [Cryptography: Hash Functions](https://www.youtube.com/watch?v=KqqOXndnvic&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=30)
|
||
- [ ] [Cryptography: Encryption](https://www.youtube.com/watch?v=9TNI2wHmaeI&index=31&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)
|
||
|
||
- ### Compression
|
||
- make sure to watch information theory videos first
|
||
- [ ] Computerphile (videos):
|
||
- [ ] [Compression](https://www.youtube.com/watch?v=Lto-ajuqW3w)
|
||
- [ ] [Entropy in Compression](https://www.youtube.com/watch?v=M5c_RFKVkko)
|
||
- [ ] [Upside Down Trees (Huffman Trees)](https://www.youtube.com/watch?v=umTbivyJoiI)
|
||
- [ ] [EXTRA BITS/TRITS - Huffman Trees](https://www.youtube.com/watch?v=DV8efuB3h2g)
|
||
- [ ] [Elegant Compression in Text (The LZ 77 Method)](https://www.youtube.com/watch?v=goOa3DGezUA)
|
||
- [ ] [Text Compression Meets Probabilities](https://www.youtube.com/watch?v=cCDCfoHTsaU)
|
||
- [ ] [Compressor Head videos](https://www.youtube.com/playlist?list=PLOU2XLYxmsIJGErt5rrCqaSGTMyyqNt2H)
|
||
- [ ] [(optional) Google Developers Live: GZIP is not enough!](https://www.youtube.com/watch?v=whGwm0Lky2s)
|
||
|
||
- ### Networking (videos)
|
||
- [ ] [Khan Academy](https://www.khanacademy.org/computing/computer-science/internet-intro)
|
||
- [ ] [UDP and TCP: Comparison of Transport Protocols](https://www.youtube.com/watch?v=Vdc8TCESIg8)
|
||
- [ ] [TCP/IP and the OSI Model Explained!](https://www.youtube.com/watch?v=e5DEVa9eSN0)
|
||
- [ ] [Packet Transmission across the Internet. Networking & TCP/IP tutorial.](https://www.youtube.com/watch?v=nomyRJehhnM)
|
||
- [ ] [HTTP](https://www.youtube.com/watch?v=WGJrLqtX7As)
|
||
- [ ] [SSL and HTTPS](https://www.youtube.com/watch?v=S2iBR2ZlZf0)
|
||
- [ ] [SSL/TLS](https://www.youtube.com/watch?v=Rp3iZUvXWlM)
|
||
- [ ] [HTTP 2.0](https://www.youtube.com/watch?v=E9FxNzv1Tr8)
|
||
- [ ] [Video Series (21 videos)](https://www.youtube.com/playlist?list=PLEbnTDJUr_IegfoqO4iPnPYQui46QqT0j)
|
||
- [ ] [Subnetting Demystified - Part 5 CIDR Notation](https://www.youtube.com/watch?v=t5xYI0jzOf4)
|
||
|
||
- ### Computer Security
|
||
- [MIT (23 videos)](https://www.youtube.com/playlist?list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
|
||
- [ ] [Introduction, Threat Models](https://www.youtube.com/watch?v=GqmQg-cszw4&index=1&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
|
||
- [ ] [Control Hijacking Attacks](https://www.youtube.com/watch?v=6bwzNg5qQ0o&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh&index=2)
|
||
- [ ] [Buffer Overflow Exploits and Defenses](https://www.youtube.com/watch?v=drQyrzRoRiA&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh&index=3)
|
||
- [ ] [Privilege Separation](https://www.youtube.com/watch?v=6SIJmoE9L9g&index=4&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
|
||
- [ ] [Capabilities](https://www.youtube.com/watch?v=8VqTSY-11F4&index=5&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
|
||
- [ ] [Sandboxing Native Code](https://www.youtube.com/watch?v=VEV74hwASeU&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh&index=6)
|
||
- [ ] [Web Security Model](https://www.youtube.com/watch?v=chkFBigodIw&index=7&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
|
||
- [ ] [Securing Web Applications](https://www.youtube.com/watch?v=EBQIGy1ROLY&index=8&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
|
||
- [ ] [Symbolic Execution](https://www.youtube.com/watch?v=yRVZPvHYHzw&index=9&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
|
||
- [ ] [Network Security](https://www.youtube.com/watch?v=SIEVvk3NVuk&index=11&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
|
||
- [ ] [Network Protocols](https://www.youtube.com/watch?v=QOtA76ga_fY&index=12&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
|
||
- [ ] [Side-Channel Attacks](https://www.youtube.com/watch?v=PuVMkSEcPiI&index=15&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
|
||
|
||
- ### Garbage collection
|
||
- [ ] [Garbage collection (Java); Augmenting data str (video)](https://www.youtube.com/watch?v=StdfeXaKGEc&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd&index=25)
|
||
- [ ] [Compilers (video)](https://www.youtube.com/playlist?list=PLO9y7hOkmmSGTy5z6HZ-W4k2y8WXF7Bff)
|
||
- [ ] [GC in Python (video)](https://www.youtube.com/watch?v=iHVs_HkjdmI)
|
||
- [ ] [Deep Dive Java: Garbage Collection is Good!](https://www.infoq.com/presentations/garbage-collection-benefits)
|
||
- [ ] [Deep Dive Python: Garbage Collection in CPython (video)](https://www.youtube.com/watch?v=P-8Z0-MhdQs&list=PLdzf4Clw0VbOEWOS_sLhT_9zaiQDrS5AR&index=3)
|
||
|
||
- ### Parallel Programming
|
||
- [ ] [Coursera (Scala)](https://www.coursera.org/learn/parprog1/home/week/1)
|
||
- [ ] [Efficient Python for High Performance Parallel Computing (video)](https://www.youtube.com/watch?v=uY85GkaYzBk)
|
||
|
||
- ### Design patterns
|
||
- [ ] [Quick UML review (video)](https://www.youtube.com/watch?v=3cmzqZzwNDM&list=PLGLfVvz_LVvQ5G-LdJ8RLqe-ndo7QITYc&index=3)
|
||
- [ ] Learn these patterns:
|
||
- [ ] strategy
|
||
- [ ] singleton
|
||
- [ ] adapter
|
||
- [ ] prototype
|
||
- [ ] decorator
|
||
- [ ] visitor
|
||
- [ ] factory, abstract factory
|
||
- [ ] facade
|
||
- [ ] observer
|
||
- [ ] proxy
|
||
- [ ] delegate
|
||
- [ ] command
|
||
- [ ] state
|
||
- [ ] memento
|
||
- [ ] iterator
|
||
- [ ] composite
|
||
- [ ] flyweight
|
||
- [ ] [Chapter 6 (Part 1) - Patterns (video)](https://youtu.be/LAP2A80Ajrg?list=PLJ9pm_Rc9HesnkwKlal_buSIHA-jTZMpO&t=3344)
|
||
- [ ] [Chapter 6 (Part 2) - Abstraction-Occurrence, General Hierarchy, Player-Role, Singleton, Observer, Delegation (video)](https://www.youtube.com/watch?v=U8-PGsjvZc4&index=12&list=PLJ9pm_Rc9HesnkwKlal_buSIHA-jTZMpO)
|
||
- [ ] [Chapter 6 (Part 3) - Adapter, Facade, Immutable, Read-Only Interface, Proxy (video)](https://www.youtube.com/watch?v=7sduBHuex4c&index=13&list=PLJ9pm_Rc9HesnkwKlal_buSIHA-jTZMpO)
|
||
- [ ] [Series of videos (27 videos)](https://www.youtube.com/playlist?list=PLF206E906175C7E07)
|
||
- [ ] [Head First Design Patterns](https://www.amazon.com/Head-First-Design-Patterns-Freeman/dp/0596007124)
|
||
- I know the canonical book is "Design Patterns: Elements of Reusable Object-Oriented Software", but Head First is great for beginners to OO.
|
||
- [ ] [Handy reference: 101 Design Patterns & Tips for Developers](https://sourcemaking.com/design-patterns-and-tips)
|
||
|
||
- ### Messaging, Serialization, and Queueing Systems
|
||
- [ ] [Thrift](https://thrift.apache.org/)
|
||
- [Tutorial](http://thrift-tutorial.readthedocs.io/en/latest/intro.html)
|
||
- [ ] [Protocol Buffers](https://developers.google.com/protocol-buffers/)
|
||
- [Tutorials](https://developers.google.com/protocol-buffers/docs/tutorials)
|
||
- [ ] [gRPC](http://www.grpc.io/)
|
||
- [gRPC 101 for Java Developers (video)](https://www.youtube.com/watch?v=5tmPvSe7xXQ&list=PLcTqM9n_dieN0k1nSeN36Z_ppKnvMJoly&index=1)
|
||
- [ ] [Redis](http://redis.io/)
|
||
- [Tutorial](http://try.redis.io/)
|
||
- [ ] [Amazon SQS (queue)](https://aws.amazon.com/sqs/)
|
||
- [ ] [Amazon SNS (pub-sub)](https://aws.amazon.com/sns/)
|
||
- [ ] [RabbitMQ](https://www.rabbitmq.com/)
|
||
- [Get Startet](https://www.rabbitmq.com/getstarted.html)
|
||
- [ ] [Celery](http://www.celeryproject.org/)
|
||
- [First Steps With Celery](http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html)
|
||
- [ ] [ZeroMQ](http://zeromq.org/)
|
||
- [Intro - Read The Manual](http://zeromq.org/intro:read-the-manual)
|
||
- [ ] [ActiveMQ](http://activemq.apache.org/)
|
||
- [ ] [Kafka](http://kafka.apache.org/documentation.html#introduction)
|
||
- [ ] [MessagePack](http://msgpack.org/index.html)
|
||
- [ ] [Avro](https://avro.apache.org/)
|
||
|
||
- ### Fast Fourier Transform
|
||
- [ ] [What is a Fourier transform? What is it used for?](http://www.askamathematician.com/2012/09/q-what-is-a-fourier-transform-what-is-it-used-for/)
|
||
- [ ] [What is the Fourier Transform? (video)](https://www.youtube.com/watch?v=Xxut2PN-V8Q)
|
||
- [ ] [Divide & Conquer: FFT (video)](https://www.youtube.com/watch?v=iTMn0Kt18tg&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=4)
|
||
- [ ] [Understanding The FFT](http://jakevdp.github.io/blog/2013/08/28/understanding-the-fft/)
|
||
|
||
- ### Bloom Filter
|
||
- Given a Bloom filter with m bits and k hashing functions, both insertion and membership testing are O(k)
|
||
- [Bloom Filters](https://www.youtube.com/watch?v=-SuTGoFYjZs)
|
||
- [Bloom Filters | Mining of Massive Datasets | Stanford University](https://www.youtube.com/watch?v=qBTdukbzc78)
|
||
- [Tutorial](http://billmill.org/bloomfilter-tutorial/)
|
||
- [How To Write A Bloom Filter App](http://blog.michaelschmatz.com/2016/04/11/how-to-write-a-bloom-filter-cpp/)
|
||
|
||
- ### van Emde Boas Trees
|
||
- [ ] [Divide & Conquer: van Emde Boas Trees (video)](https://www.youtube.com/watch?v=hmReJCupbNU&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=6)
|
||
- [ ] [MIT Lecture Notes](https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-046j-design-and-analysis-of-algorithms-spring-2012/lecture-notes/MIT6_046JS12_lec15.pdf)
|
||
|
||
- ### Augmented Data Structures
|
||
- [ ] [CS 61B Lecture 39: Augmenting Data Structures](https://youtu.be/zksIj9O8_jc?list=PL4BBB74C7D2A1049C&t=950)
|
||
|
||
- ### Skip lists
|
||
- "These are somewhat of a cult data structure" - Skiena
|
||
- [ ] [Randomization: Skip Lists (video)](https://www.youtube.com/watch?v=2g9OSRKJuzM&index=10&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)
|
||
- [ ] [For animations and a little more detail](https://en.wikipedia.org/wiki/Skip_list)
|
||
|
||
- ### Network Flows
|
||
- [ ] [Ford-Fulkerson in 5 minutes (video)](https://www.youtube.com/watch?v=v1VgJmkEJW0)
|
||
- [ ] [Ford-Fulkerson Algorithm (video)](https://www.youtube.com/watch?v=v1VgJmkEJW0)
|
||
- [ ] [Network Flows (video)](https://www.youtube.com/watch?v=2vhN4Ice5jI)
|
||
|
||
- ### Disjoint Sets & Union Find
|
||
- [ ] [Disjoint Set](https://en.wikipedia.org/wiki/Disjoint-set_data_structure)
|
||
- [ ] [UCB 61B - Disjoint Sets; Sorting & selection (video)](https://www.youtube.com/watch?v=MAEGXTwmUsI&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd&index=21)
|
||
- [ ] Coursera (not needed since the above video explains it great):
|
||
- [ ] [Overview](https://www.coursera.org/learn/data-structures/lecture/JssSY/overview)
|
||
- [ ] [Naive Implementation](https://www.coursera.org/learn/data-structures/lecture/EM5D0/naive-implementations)
|
||
- [ ] [Trees](https://www.coursera.org/learn/data-structures/lecture/Mxu0w/trees)
|
||
- [ ] [Union By Rank](https://www.coursera.org/learn/data-structures/lecture/qb4c2/union-by-rank)
|
||
- [ ] [Path Compression](https://www.coursera.org/learn/data-structures/lecture/Q9CVI/path-compression)
|
||
- [ ] [Analysis Options](https://www.coursera.org/learn/data-structures/lecture/GQQLN/analysis-optional)
|
||
|
||
- ### Math for Fast Processing
|
||
- [ ] [Integer Arithmetic, Karatsuba Multiplication (video)](https://www.youtube.com/watch?v=eCaXlAaN2uE&index=11&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
|
||
- [ ] [The Chinese Remainder Theorem (used in cryptography) (video)](https://www.youtube.com/watch?v=ru7mWZJlRQg)
|
||
|
||
- ### Treap
|
||
- Combination of a binary search tree and a heap
|
||
- [ ] [Treap](https://en.wikipedia.org/wiki/Treap)
|
||
- [ ] [Data Structures: Treaps explained (video)](https://www.youtube.com/watch?v=6podLUYinH8)
|
||
- [ ] [Applications in set operations](https://www.cs.cmu.edu/~scandal/papers/treaps-spaa98.pdf)
|
||
|
||
- ### Linear Programming (videos)
|
||
- [ ] [Linear Programming](https://www.youtube.com/watch?v=M4K6HYLHREQ)
|
||
- [ ] [Finding minimum cost](https://www.youtube.com/watch?v=2ACJ9ewUC6U)
|
||
- [ ] [Finding maximum value](https://www.youtube.com/watch?v=8AA_81xI3ik)
|
||
|
||
- ### Geometry, Convex hull (videos)
|
||
- [ ] [Graph Alg. IV: Intro to geometric algorithms - Lecture 9](https://youtu.be/XIAQRlNkJAw?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=3164)
|
||
- [ ] [Geometric Algorithms: Graham & Jarvis - Lecture 10](https://www.youtube.com/watch?v=J5aJEcOr6Eo&index=10&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
|
||
- [ ] [Divide & Conquer: Convex Hull, Median Finding](https://www.youtube.com/watch?v=EzeYI7p9MjU&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=2)
|
||
|
||
- ### Discrete math
|
||
- see videos below
|
||
|
||
- ### Machine Learning
|
||
- [ ] Why ML?
|
||
- [ ] [How Google Is Remaking Itself As A Machine Learning First Company](https://backchannel.com/how-google-is-remaking-itself-as-a-machine-learning-first-company-ada63defcb70)
|
||
- [ ] [Large-Scale Deep Learning for Intelligent Computer Systems (video)](https://www.youtube.com/watch?v=QSaZGT4-6EY)
|
||
- [ ] [Deep Learning and Understandability versus Software Engineering and Verification by Peter Norvig](https://www.youtube.com/watch?v=X769cyzBNVw)
|
||
- [ ] [Google's Cloud Machine learning tools (video)](https://www.youtube.com/watch?v=Ja2hxBAwG_0)
|
||
- [ ] [Google Developers' Machine Learning Recipes (Scikit Learn & Tensorflow) (video)](https://www.youtube.com/playlist?list=PLOU2XLYxmsIIuiBfYad6rFYQU_jL2ryal)
|
||
- [ ] [Tensorflow (video)](https://www.youtube.com/watch?v=oZikw5k_2FM)
|
||
- [ ] [Tensorflow Tutorials](https://www.tensorflow.org/versions/r0.11/tutorials/index.html)
|
||
- [ ] [Practical Guide to implementing Neural Networks in Python](using Theano)])http://www.analyticsvidhya.com/blog/2016/04/neural-networks-python-theano/)
|
||
- Courses:
|
||
- [ ] [Great starter course: Machine Learning](https://www.coursera.org/learn/machine-learning)
|
||
- [videos only](https://www.youtube.com/playlist?list=PLZ9qNFMHZ-A4rycgrgOYma6zxF4BZGGPW)
|
||
- see videos 12-18 for a review of linear algebra (14 and 15 are duplicates)
|
||
- [ ] [Neural Networks for Machine Learning](https://www.coursera.org/learn/neural-networks)
|
||
- [ ] [Google's Deep Learning Nanodegree](https://www.udacity.com/course/deep-learning--ud730)
|
||
- [ ] [Google/Kaggle Machine Learning Engineer Nanodegree](https://www.udacity.com/course/machine-learning-engineer-nanodegree-by-google--nd009)
|
||
- [ ] [Self-Driving Car Engineer Nanodegree](https://www.udacity.com/drive)
|
||
- [ ] [Metis Online Course ($99 for 2 months)](http://www.thisismetis.com/explore-data-science)
|
||
- Resources:
|
||
- Great book: Data Science from Scratch: First Principles with Python: https://www.amazon.com/Data-Science-Scratch-Principles-Python/dp/149190142X
|
||
- Data School: http://www.dataschool.io/
|
||
|
||
- ### Go
|
||
- [ ] Videos:
|
||
- [ ] [Why Learn Go?](https://www.youtube.com/watch?v=FTl0tl9BGdc)
|
||
- [ ] [Go Programming](https://www.youtube.com/watch?v=CF9S4QZuV30)
|
||
- [ ] [A Tour of Go](https://www.youtube.com/watch?v=ytEkHepK08c)
|
||
- [ ] Books:
|
||
- [ ] [An Introduction to Programming in Go (read free online)](https://www.golang-book.com/books/intro)
|
||
- [ ] [The Go Programming Language (Donovan & Kernighan)](https://www.amazon.com/Programming-Language-Addison-Wesley-Professional-Computing/dp/0134190440)
|
||
- [ ] [Bootcamp](https://www.golang-book.com/guides/bootcamp)
|
||
|
||
--
|
||
|
||
## Additional Detail on Some Subjects
|
||
|
||
I added these to reinforce some ideas already presented above, but didn't want to include them
|
||
above because it's just too much. It's easy to overdo it on a subject.
|
||
You want to get hired in this century, right?
|
||
|
||
- [ ] **More Dynamic Programming** (videos)
|
||
- [ ] [6.006: Dynamic Programming I: Fibonacci, Shortest Paths](https://www.youtube.com/watch?v=OQ5jsbhAv_M&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=19)
|
||
- [ ] [6.006: Dynamic Programming II: Text Justification, Blackjack](https://www.youtube.com/watch?v=ENyox7kNKeY&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=20)
|
||
- [ ] [6.006: DP III: Parenthesization, Edit Distance, Knapsack](https://www.youtube.com/watch?v=ocZMDMZwhCY&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=21)
|
||
- [ ] [6.006: DP IV: Guitar Fingering, Tetris, Super Mario Bros.](https://www.youtube.com/watch?v=tp4_UXaVyx8&index=22&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
|
||
- [ ] [6.046: Dynamic Programming & Advanced DP](https://www.youtube.com/watch?v=Tw1k46ywN6E&index=14&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)
|
||
- [ ] [6.046: Dynamic Programming: All-Pairs Shortest Paths](https://www.youtube.com/watch?v=NzgFUwOaoIw&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=15)
|
||
- [ ] [6.046: Dynamic Programming (student recitation)](https://www.youtube.com/watch?v=krZI60lKPek&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=12)
|
||
|
||
- [ ] **Advanced Graph Processing** (videos)
|
||
- [ ] [Synchronous Distributed Algorithms: Symmetry-Breaking. Shortest-Paths Spanning Trees](https://www.youtube.com/watch?v=mUBmcbbJNf4&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=27)
|
||
- [ ] [Asynchronous Distributed Algorithms: Shortest-Paths Spanning Trees](https://www.youtube.com/watch?v=kQ-UQAzcnzA&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=28)
|
||
|
||
- [ ] MIT **Probability** (mathy, and go slowly, which is good for mathy things) (videos):
|
||
- [ ] [MIT 6.042J - Probability Introduction](https://www.youtube.com/watch?v=SmFwFdESMHI&index=18&list=PLB7540DEDD482705B)
|
||
- [ ] [MIT 6.042J - Conditional Probability](https://www.youtube.com/watch?v=E6FbvM-FGZ8&index=19&list=PLB7540DEDD482705B)
|
||
- [ ] [MIT 6.042J - Independence](https://www.youtube.com/watch?v=l1BCv3qqW4A&index=20&list=PLB7540DEDD482705B)
|
||
- [ ] [MIT 6.042J - Random Variables](https://www.youtube.com/watch?v=MOfhhFaQdjw&list=PLB7540DEDD482705B&index=21)
|
||
- [ ] [MIT 6.042J - Expectation I](https://www.youtube.com/watch?v=gGlMSe7uEkA&index=22&list=PLB7540DEDD482705B)
|
||
- [ ] [MIT 6.042J - Expectation II](https://www.youtube.com/watch?v=oI9fMUqgfxY&index=23&list=PLB7540DEDD482705B)
|
||
- [ ] [MIT 6.042J - Large Deviations](https://www.youtube.com/watch?v=q4mwO2qS2z4&index=24&list=PLB7540DEDD482705B)
|
||
- [ ] [MIT 6.042J - Random Walks](https://www.youtube.com/watch?v=56iFMY8QW2k&list=PLB7540DEDD482705B&index=25)
|
||
|
||
- [ ] [Simonson: Approximation Algorithms (video)](https://www.youtube.com/watch?v=oDniZCmNmNw&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=19)
|
||
|
||
## Video Series
|
||
|
||
Sit back and enjoy. "netflix and skill" :P
|
||
|
||
- [ ] [List of individual Dynamic Programming problems (each is short)](https://www.youtube.com/playlist?list=PLrmLmBdmIlpsHaNTPP_jHHDx_os9ItYXr)
|
||
|
||
- [ ] [x86 Architecture, Assembly, Applications (11 videos)](https://www.youtube.com/playlist?list=PL038BE01D3BAEFDB0)
|
||
|
||
- [ ] [MIT 18.06 Linear Algebra, Spring 2005 (35 videos)](https://www.youtube.com/playlist?list=PLE7DDD91010BC51F8)
|
||
|
||
- [ ] [Excellent - MIT Calculus Revisited: Single Variable Calculus](https://www.youtube.com/playlist?list=PL3B08AE665AB9002A)
|
||
|
||
- [ ] [Computer Science 70, 001 - Spring 2015 - Discrete Mathematics and Probability Theory](https://www.youtube.com/playlist?list=PL-XXv-cvA_iD8wQm8U0gG_Z1uHjImKXFy)
|
||
|
||
- [ ] [Discrete Mathematics (19 videos)](https://www.youtube.com/playlist?list=PL3o9D4Dl2FJ9q0_gtFXPh_H4POI5dK0yG)
|
||
|
||
- [ ] CSE373 - Analysis of Algorithms (25 videos)
|
||
- [Skiena lectures from Algorithm Design Manual](https://www.youtube.com/watch?v=ZFjhkohHdAA&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=1)
|
||
|
||
- [ ] [UC Berkeley 61B (Spring 2014): Data Structures (25 videos)](https://www.youtube.com/watch?v=mFPmKGIrQs4&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd)
|
||
|
||
- [ ] [UC Berkeley 61B (Fall 2006): Data Structures (39 videos)]( https://www.youtube.com/playlist?list=PL4BBB74C7D2A1049C)
|
||
|
||
- [ ] [UC Berkeley 61C: Machine Structures (26 videos)](https://www.youtube.com/watch?v=gJJeUFyuvvg&list=PL-XXv-cvA_iCl2-D-FS5mk0jFF6cYSJs_)
|
||
|
||
- [ ] [OOSE: Software Dev Using UML and Java (21 videos)](https://www.youtube.com/playlist?list=PLJ9pm_Rc9HesnkwKlal_buSIHA-jTZMpO)
|
||
|
||
- [ ] [UC Berkeley CS 152: Computer Architecture and Engineering (20 videos)](https://www.youtube.com/watch?v=UH0QYvtP7Rk&index=20&list=PLkFD6_40KJIwEiwQx1dACXwh-2Fuo32qr)
|
||
|
||
- [ ] [MIT 6.004: Computation Structures (49 videos)](https://www.youtube.com/playlist?list=PLrRW1w6CGAcXbMtDFj205vALOGmiRc82-)
|
||
|
||
- [ ] [Carnegie Mellon - Computer Architecture Lectures (39 videos)](https://www.youtube.com/playlist?list=PL5PHm2jkkXmi5CxxI7b3JCL1TWybTDtKq)
|
||
|
||
- [ ] [MIT 6.006: Intro to Algorithms (47 videos)](https://www.youtube.com/watch?v=HtSuA80QTyo&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&nohtml5=False)
|
||
|
||
- [ ] [MIT 6.033: Computer System Engineering (22 videos)](https://www.youtube.com/watch?v=zm2VP0kHl1M&list=PL6535748F59DCA484)
|
||
|
||
- [ ] [MIT 6.034 Artificial Intelligence, Fall 2010 (30 videos)](https://www.youtube.com/playlist?list=PLUl4u3cNGP63gFHB6xb-kVBiQHYe_4hSi)
|
||
|
||
- [ ] [MIT 6.042J: Mathematics for Computer Science, Fall 2010 (25 videos)](https://www.youtube.com/watch?v=L3LMbpZIKhQ&list=PLB7540DEDD482705B)
|
||
|
||
- [ ] [MIT 6.046: Design and Analysis of Algorithms (34 videos)](https://www.youtube.com/watch?v=2P-yW7LQr08&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)
|
||
|
||
- [ ] [MIT 6.050J: Information and Entropy, Spring 2008 (19 videos)](https://www.youtube.com/watch?v=phxsQrZQupo&list=PL_2Bwul6T-A7OldmhGODImZL8KEVE38X7)
|
||
|
||
- [ ] [MIT 6.851: Advanced Data Structures (22 videos)](https://www.youtube.com/watch?v=T0yzrZL1py0&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf&index=1)
|
||
|
||
- [ ] [MIT 6.854: Advanced Algorithms, Spring 2016 (24 videos)](https://www.youtube.com/playlist?list=PL6ogFv-ieghdoGKGg2Bik3Gl1glBTEu8c)
|
||
|
||
- [ ] [MIT 6.858 Computer Systems Security, Fall 2014](https://www.youtube.com/watch?v=GqmQg-cszw4&index=1&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
|
||
|
||
- [ ] Stanford: Programming Paradigms (17 videos)
|
||
- [Course on C and C++](https://www.youtube.com/watch?v=jTSvthW34GU&list=PLC0B8B318B7394B6F&nohtml5=False)
|
||
|
||
- [ ] [Introduction to Cryptography](https://www.youtube.com/watch?v=2aHkqB2-46k&feature=youtu.be)
|
||
- [more in series (not in order)](https://www.youtube.com/channel/UC1usFRN4LCMcfIV7UjHNuQg)
|
||
|
||
- [ ] [Mining Massive Datasets - Stanford University (94 videos)](https://www.youtube.com/playlist?list=PLLssT5z_DsK9JDLcT8T62VtzwyW9LNepV)
|
||
|
||
## Computer Science Courses
|
||
|
||
- [Directory of Online CS Courses](https://github.com/open-source-society/computer-science)
|
||
- [Directory of CS Courses (many with online lectures)](https://github.com/prakhar1989/awesome-courses)
|