jwasham/coding-interview-university
GitHub: jwasham/coding-interview-university
一份完整的计算机科学学习计划,帮助自学者掌握通过大型科技公司软件工程师面试所需的全部知识。
Stars: 340029 | Forks: 81820
# 编程面试大学
## 这是什么?

这是我为了成为大厂软件工程师而制定的多月学习计划。
**必要条件:**
* 少量的编程经验(变量、循环、方法/函数等)
* 耐心
* 时间
请注意,这是一个针对**软件工程**的学习计划,而不是前端工程或全栈开发。在其他地方有很多针对这些职业路径的极佳路线图和课程(详见 https://roadmap.sh/)。
大学的计算机科学课程有很多需要学习的内容,但在面试中只要掌握其中的 75% 左右就足够了,这也是我在这里所涵盖的内容。
对于一个完整的自学计算机科学课程,我学习计划中的资源已经被包含在 Kamran Ahmed 的计算机科学路线图中:https://roadmap.sh/computer-science
## 目录
### 学习计划
- [这是什么?](#what-is-it)
- [为什么使用它?](#why-use-it)
- [如何使用它](#how-to-use-it)
- [不要觉得自己不够聪明](#dont-feel-you-arent-smart-enough)
- [关于视频资源的说明](#a-note-about-video-resources)
- [选择编程语言](#choose-a-programming-language)
- [数据结构与算法书籍](#books-for-data-structures-and-algorithms)
- [面试准备书籍](#interview-prep-books)
- [不要犯我的错误](#dont-make-my-mistakes)
- [你不会看到的内容](#what-you-wont-see-covered)
- [每日计划](#the-daily-plan)
- [编程题练习](#coding-question-practice)
- [编程问题](#coding-problems)
### 学习主题
- [算法复杂度 / Big-O / 渐进分析](#algorithmic-complexity--big-o--asymptotic-analysis)
- [数据结构](#data-structures)
- [数组](#arrays)
- [链表](#linked-lists)
- [栈](#stack)
- [队列](#queue)
- [哈希表](#hash-table)
- [更多知识](#more-knowledge)
- [二分查找](#binary-search)
- [位操作](#bitwise-operations)
- [树](#trees)
- [树 - 简介](#trees---intro)
- [二叉搜索树:BSTs](#binary-search-trees-bsts)
- [堆 / 优先队列 / 二叉堆](#heap--priority-queue--binary-heap)
- 平衡搜索树(总体概念,而非细节)
- 遍历:前序、中序、后序、BFS、DFS
- [排序](#sorting)
- 选择排序
- 插入排序
- 堆排序
- 快速排序
- 归并排序
- [图](#graphs)
- 有向图
- 无向图
- 邻接矩阵
- 邻接表
- 遍历:BFS、DFS
- [更多知识](#even-more-knowledge)
- [递归](#recursion)
- [动态规划](#dynamic-programming)
- [设计模式](#design-patterns)
- [组合数学 (n 选 k) 与 概率](#combinatorics-n-choose-k--probability)
- [NP、NP-完全问题与近似算法](#np-np-complete-and-approximation-algorithms)
- [计算机如何处理程序](#how-computers-process-a-program)
- [缓存](#caches)
- [进程与线程](#processes-and-threads)
- [测试](#testing)
- [字符串搜索与操作](#string-searching--manipulations)
- [字典树](#tries)
- [浮点数](#floating-point-numbers)
- [Unicode](#unicode)
- [字节序](#endianness)
- [网络](#networking)
- [最终复习](#final-review)
### 获得工作
- [更新你的简历](#update-your-resume)
- [寻找工作](#find-a-job)
- [面试流程与常规面试准备](#interview-process--general-interview-prep)
- [面试时需要思考的事情](#be-thinking-of-for-when-the-interview-comes)
- [向面试官提问](#have-questions-for-the-interviewer)
- [一旦你获得了工作](#once-youve-got-the-job)
**---------------- 以下所有内容均为可选 ----------------**
### 可选的额外主题与资源
- [附加书籍](#additional-books)
- [系统设计、可扩展性、数据处理](#system-design-scalability-data-handling)(如果你有 4 年以上经验)
- [附加学习](#additional-learning)
- [编译器](#compilers)
- [Emacs 和 vi(m)](#emacs-and-vim)
- [Unix 命令行工具](#unix-command-line-tools)
- [信息论](#information-theory-videos)
- [奇偶校验与汉明码](#parity--hamming-code-videos)
- [熵](#entropy)
- [密码学](#cryptography)
- [压缩](#compression)
- [计算机安全](#computer-security)
- [垃圾回收](#garbage-collection)
- [并行编程](#parallel-programming)
- [消息传递、序列化与队列系统](#messaging-serialization-and-queueing-systems)
- [A*](#a)
- [快速傅里叶变换](#fast-fourier-transform)
- [布隆过滤器](#bloom-filter)
- [HyperLogLog](#hyperloglog)
- [局部敏感哈希](#locality-sensitive-hashing)
- [van Emde Boas 树](#van-emde-boas-trees)
- [增广数据结构](#augmented-data-structures)
- [平衡搜索树](#balanced-search-trees)
- AVL 树
- 伸展树
- 红/黑树
- 2-3 搜索树
- 2-3-4 树(亦称 2-4 树)
- N 叉树 (K-叉树, M-叉树)
- B 树
- [k-D 树](#k-d-trees)
- [跳表](#skip-lists)
- [网络流](#network-flows)
- [不相交集合 & 并查集](#disjoint-sets--union-find)
- [用于快速处理的数学](#math-for-fast-processing)
- [树堆](#treap)
- [线性规划](#linear-programming-videos)
- [几何,凸包](#geometry-convex-hull-videos)
- [离散数学](#discrete-math)
- [部分主题的补充细节](#additional-detail-on-some-subjects)
- [视频系列](#video-series)
- [计算机科学课程](#computer-science-courses)
- [论文](#papers)
## 为什么使用它?
如果你想成为大公司的软件工程师,这些是你必须了解的知识。
如果你像我一样错过了获得计算机科学学位的机会,这将帮你弥补遗憾,并为你节省四年的大学时间。
当我开始这个项目时,我分不清栈和堆,不知道什么是 Big-O,对树一无所知,也不知道如何遍历图。如果非要让我写一个排序算法,我可以肯定地说,那一定糟透了。
我曾经用过的所有数据结构都是语言内置的,我完全不知道它们底层是如何工作的。我从来不需要管理内存,除非我运行的进程出现“内存不足”的错误,然后我得想办法解决。我这辈子用过几次多维数组和成千上万的关联数组,但我从未从头开始创建过数据结构。
这是一个很长的计划,可能需要数月时间。如果你已经对其中很多内容很熟悉,所花的时间就会少得多。
**[⬆ 返回顶部](#table-of-contents)**
## 如何使用它
以下所有内容都是一个大纲,你应该按从上到下的顺序依次处理这些项目。
我使用了 GitHub 特殊的 Markdown 风格,包括任务列表来跟踪进度。
- [更多关于 GitHub 风格的 Markdown](https://guides.github.com/features/mastering-markdown/#GitHub-flavored-markdown)
### 如果你不想使用 git
在此页面上,点击靠近顶部的“Code”按钮,然后点击“Download ZIP”。解压该文件后,你就可以处理这些文本文件了。
如果你在使用支持 Markdown 的代码编辑器打开它,你会看到排版精美的所有内容。

### 如果你熟悉 git
创建一个新分支,这样你就可以像这样勾选项目,只需在括号中放入 x:[x]
1. ***Fork 这个 GitHub 仓库:*** `https://github.com/jwasham/coding-interview-university` ,点击 Fork 按钮。

2. 克隆到你的本地仓库:
git clone https://github.com//coding-interview-university.git
cd coding-interview-university
git remote add upstream https://github.com/jwasham/coding-interview-university.git
git remote set-url --push upstream DISABLE # 这样你就不会把个人的进度推回到原始仓库
3. 在完成更改后,用 X 标记所有方框:
git commit -am "Marked personal progress"
git pull upstream main # 使你的 fork 与原始仓库的更新保持同步
git push # 仅推送到你的 fork
**[⬆ 返回顶部](#table-of-contents)**
## 不要觉得自己不够聪明
- 成功的软件工程师都很聪明,但很多人都有一种自己不够聪明的危机感。
- 以下视频可能会帮你克服这种危机感:
- [天才程序员的神话](https://www.youtube.com/watch?v=0SARbwvhupQ)
- [独自上路是危险的:对抗科技界看不见的怪物](https://www.youtube.com/watch?v=1i8ylq4j_EY)
**[⬆ 返回顶部](#table-of-contents)**
## 关于视频资源的说明
有些视频只能通过注册 Coursera 或 EdX 课程来观看。这些被称为 MOOC(大型开放式网络课程)。
有时课程不在开课期间,所以你必须等上几个月,这样你就无法访问这些资源了。
如果能用免费且随时可用的公共资源(例如 YouTube 视频,最好是大学讲座)来替代这些在线课程资源,那就太好了,这样大家就可以随时学习这些内容,而不是只有在特定的在线课程开课时才能学。
**[⬆ 返回顶部](#table-of-contents)**
## 选择编程语言
你需要为你的编程面试选择一门编程语言,但你也需要找到一门可以用来学习计算机科学概念的语言。
最好这门语言是同一门,这样你只需要精通一门即可。
### 针对本学习计划
当我做这个学习计划时,我大部分时间使用了 2 种语言:C 和 Python
* C:非常底层。它允许你处理指针和内存分配/释放,因此你能深入骨髓地感受数据结构和算法。在 Python 或 Java 等高级语言中,这些东西对你来说是隐藏的。在日常工作中,这很棒,但当你学习这些底层的数据结构是如何构建时,贴近底层(接近金属)的感觉是非常好的。
- C 无处不在。在你学习期间,你会在书籍、讲座、视频中看到示例,*到处都是*。
- [C 程序设计语言(第 2 版)](https://www.amazon.com/Programming-Language-Brian-W-Kernighan/dp/0131103628)
- 这是一本很薄的书,但它能让你很好地掌握 C 语言,如果你稍微练习一下,很快就会熟练。理解 C 有助于你理解程序和内存是如何工作的。
- 你不需要在这本书里钻得太深(甚至不需要读完它)。只要达到你能轻松读写 C 的程度即可。
* Python:现代且非常具有表现力,我学习它是因为它超级有用,并且能让我在面试中写更代码。
这是我的偏好。当然,你可以按照你喜欢的来做。
你可能不需要它,但这里有一些学习新语言的网站:
- [Exercism](https://exercism.org/tracks)
- [Codewars](http://www.codewars.com)
- [HackerEarth](https://www.hackerearth.com/for-developers/)
- [Scaler Topics (Java, C++)](https://www.scaler.com/topics/)
- [Programiz PRO 社区挑战](https://programiz.pro/)
### 针对你的编程面试
你可以使用你觉得舒适的语言来进行面试的编码部分,但对于大型公司,以下是不错的选择:
- C++
- Java
- Python
你也可以使用这些,但请先四处了解一下。可能会有一些注意事项:
- JavaScript
- Ruby
这里是我写的一篇关于为面试选择语言的文章:
[为编程面试选择一门语言](https://startupnextdoor.com/important-pick-one-language-for-the-coding-interview/)。
这是我的帖子所基于的原始文章:[为面试选择编程语言](https://web.archive.org/web/20210516054124/http://blog.codingforinterviews.com/best-programming-language-jobs/)
你需要对所用的语言非常熟悉且知识渊博。
阅读更多关于选择的内容:
- [为你的编程面试选择正确的语言](http://www.byte-by-byte.com/choose-the-right-language-for-your-coding-interview/)
[在此处查看特定语言的资源](programming-language-resources.md)
**[⬆ 返回顶部](#table-of-contents)**
## 数据结构与算法书籍
这本书将成为你计算机科学的基础。
只需选择一本你用起来觉得 comfortable 的语言的书。你将会进行大量的阅读和编码。
### Python
- [编程面试模式:搞定你的下一次编程面试](https://geni.us/q7svoz) (**主要推荐**)
- 以内部人员的视角看待面试官真正在寻找什么以及为什么。
- 101 道真实的编程面试题,附带详细的解答。
- 直观的解释,引导你解决每一个问题,就像你在现场面试中一样。
- 1000 多张图表用于说明关键概念和模式。
### C
- [C 语言算法,第 1-5 部分(合集),第 3 版](https://www.amazon.com/Algorithms-Parts-1-5-Bundle-Fundamentals/dp/0201756080)
- 基础、数据结构、排序、搜索和图算法
### Java
你的选择:
- Goodrich, Tamassia, Goldwasser
- [Java 数据结构与算法](https://www.amazon.com/Data-Structures-Algorithms-Michael-Goodrich/dp/1118771338/)
- Sedgewick 和 Wayne:
- [算法](https://www.amazon.com/Algorithms-4th-Robert-Sedgewick/dp/032157351X/)
- 涵盖本书的免费 Coursera 课程(由作者亲自授课!):
- [算法 I](https://www.coursera.org/learn/algorithms-part1)
- [算法 II](https://www.coursera.org/learn/algorithms-part2)
### C++
你的选择:
- Goodrich, Tamassia, 和 Mount
- [C++ 数据结构与算法,第 2 版](https://www.amazon.com/Data-Structures-Algorithms-Michael-Goodrich/dp/0470383275)
- Sedgewick 和 Wayne
- [C++ 算法,第 1-4 部分:基础、数据结构、排序、搜索](https://www.amazon.com/Algorithms-Parts-1-4-Fundamentals-Structure/dp/0201350882/)
- [C++ 算法 第 5 部分:图算法](https://www.amazon.com/Algorithms-Part-Graph-3rd-Pt-5/dp/0201361183/)
**[⬆ 返回顶部](#table-of-contents)**
## 面试准备书籍
以下是一些补充你学习的推荐书籍。
- [编程面试模式:搞定你的下一次编程面试](https://geni.us/q7svoz)
- [编程面试曝光:在面试中编写代码,第 4 版](https://www.amazon.com/Programming-Interviews-Exposed-Through-Interview/dp/111941847X/)
- C++ 和 Java 的答案
- 这是为《编程面试金典》做的一个很好的热身
- 不太难。大多数问题可能比你在面试中看到的要容易(根据我的阅读)
- [编程面试金典,第 6 版](http://www.amazon.com/Cracking-Coding-Interview-6th-Programming/dp/0984782850/)
- Java 中的答案
### 如果你有大量额外时间:
选择一本:
- [编程面试要素(C++ 版)](https://www.amazon.com/Elements-Programming-Interviews-Insiders-Guide/dp/1479274836)
- [Python 编程面试要素](https://www.amazon.com/Elements-Programming-Interviews-Python-Insiders/dp/1537713949/)
- [编程面试要素(Java 版)](https://www.amazon.com/Elements-Programming-Interviews-Java-Insiders/dp/1517435803/)
- [配套项目 - 书中每个问题的方法存根和测试用例](https://github.com/gardncl/elements-of-programming-interviews)
**[⬆ 返回顶部](#table-of-contents)**
## 不要犯我的错误
这个列表历经几个月才成型,是的,它有些失控了。
这里是我犯的一些错误,这样你会有更好的体验,并且能节省几个月的时间。
### 1. 你无法记住所有内容
我看了几个小时的录像并记了大量的笔记,但几个月后有很多我都记不清了。我花了 3 天时间复习笔记并制作了闪卡,这样我就可以复习。我其实并不需要所有的知识。
请阅读以下内容以免重蹈我的覆辙:
[保留计算机科学知识](https://startupnextdoor.com/retaining-computer-science-knowledge/)。
### 2. 使用闪卡
为了解决这个问题,我建立了一个小闪卡网站,在那里我可以添加两种类型的闪卡:通用型和代码型。
每种卡片有不同的格式。我建立了一个移动优先的网站,这样无论我在哪里,都可以在手机或平板电脑上复习。
免费制作你自己的闪卡:
- [闪卡网站仓库](https://github.com/jwasham/computer-science-flash-cards)
**我不建议使用我的闪卡。** 闪卡太多了,而且大多数是你不需要的琐事。
但如果你不想听我的,给你:
- [我的闪卡数据库(1200 张卡)](https://github.com/jwasham/computer-science-flash-cards/blob/main/cards-jwasham.db):
- [我的闪卡数据库(极限版 - 1800 张卡)](https://github.com/jwasham/computer-science-flash-cards/blob/main/cards-jwasham-extreme.db):
请记住我做得有些过头了,我的卡片涵盖了从汇编语言和 Python 琐事到机器学习和统计学的所有内容。
这对于面试要求来说实在太多了。
**关于闪卡的说明:** 第一次你意识到自己知道答案时,不要将其标记为已知。你必须看到同一张卡片并正确回答几次,才能真正掌握它。重复可以将这些知识更深刻地印在你的大脑中。
使用我的闪卡网站的替代方案是 [Anki](http://ankisrs.net/),它已被向我推荐过多次。
它使用重复系统来帮助你记忆。它对用户友好,可在所有平台上使用,并具有云同步系统。
它在 iOS 上售价 25 美元,但在其他平台上免费。
我的 Anki 格式闪卡数据库:https://ankiweb.net/shared/info/25173560 (感谢 [@xiewenya](https://github.com/xiewenya))。
一些学生提到了空白的格式问题,可以通过执行以下操作来修复:打开牌组,编辑卡片,点击卡片,选择“styling”单选按钮,并将成员“white-space: pre;”添加到卡片类中。
### 3. 在学习的同时做编程面试题
这非常重要。
开始在学习数据结构和算法的同时做编程面试题。
你需要应用你正在学习的知识来解决问题,否则你会忘记的。我犯过这个错误。
一旦你学习了一个主题,并对此感到有些得心应手,例如,**链表**:
1. 打开一本[编程面试书籍](#interview-prep-books)(或者编程问题网站,如下所列)
2. 做 2 道或 3 道关于链表的问题。
3. 继续下一个学习主题。
4. 稍后,返回去做另外 2 或 3 道链表问题。
5. 对你学习的每个新主题都这样做。
**在学习所有这些内容的同时坚持做题,而不是学完之后。**
公司雇佣你不是因为你的知识,而是看你如何应用知识。
有很多这方面的资源,列在下面。继续前进。
### 4. 专注
有很多干扰会占用宝贵的时间。专注和集中注意力是很难的。放一些没有歌词的音乐,你就能很好地集中注意力了。
**[⬆ 返回顶部](#table-of-contents)**
## 你不会看到的内容
这些是流行技术,但不属于本学习计划的一部分:
- Javascript
- HTML、CSS 及其他前端技术
- SQL
**[⬆ 返回顶部](#table-of-contents)**
## 每日计划
本课程涵盖了很多主题。每个主题可能需要你花费几天,甚至一周或更长时间。这取决于你的时间安排。
每天,按照列表学习下一个主题,观看一些关于该主题的视频,然后用你为本课程选择的语言编写该数据结构或算法的实现。
你可以在这里看到我的代码:
- [C](https://github.com/jwasham/practice-c)
- [C++](https://github.com/jwasham/practice-cpp)
- [Python](https://github.com/jwasham/practice-python)
你不需要记住每一个算法。你只需要充分理解它,以便能够编写自己的实现。
**[⬆ 返回顶部](#table-of-contents)**
## 编程题练习
```
Why is this here? I'm not ready to interview.
```
[然后回过头来阅读这个。](#3-do-coding-interview-questions-while-youre-learning)
为什么你需要练习做编程问题:
- 问题识别,以及合适的数据结构和算法用在哪里
- 收集问题的需求
- 像在面试中那样边说边解决问题
- 在白板或纸上写代码,而不是在电脑上
- 为你的解决方案得出时间和空间复杂度(见下文的 Big-O)
- 测试你的解决方案
这里有一个很好的关于面试中有条理的、沟通式问题解决的介绍。你也会从编程面试书中得到这些,但我发现这个非常出色:
[算法设计画布](http://www.hiredintech.com/algorithm-design/)
在白板或纸上写代码,而不是电脑。用一些样本输入进行测试。然后将其打字输入并在电脑上进行测试。
如果你家里没有白板,去艺术品店买一个大的画板。你可以坐在沙发上练习。
这是我的“沙发白板”。我在照片中加入了钢笔只是为了显示比例。如果你使用钢笔,你会希望自己能够擦除。
很快就会变得一团糟。**我使用铅笔和橡皮。**

**编程题练习不是为了记住编程问题的答案。**
**[⬆ 返回顶部](#table-of-contents)**
## 编程问题
不要忘记[这里](#interview-prep-books)的关键编程面试书籍。
解决问题:
- [如何寻找解决方案](https://www.topcoder.com/thrive/articles/How%20To%20Find%20a%20Solution)
- [如何剖析 Topcoder 问题陈述](https://www.topcoder.com/thrive/articles/How%20To%20Dissect%20a%20Topcoder%20Problem%20Statement%20Content)
编程面试题视频:
- [IDeserve (88 个视频)](https://www.youtube.com/playlist?list=PLamzFoFxwoNjPfxzaWqs7cZGsPYy0x_gI)
- [Tushar Roy (5 个播放列表)](https://www.youtube.com/user/tusharroy2525/playlists?shelf_id=2&view=50&sort=dd)
- 非常适合问题解决方案的演练
- [Nick White - LeetCode 解决方案 (187 个视频)](https://www.youtube.com/playlist?list=PLU_sdQYzUj2keVENTP0a5rdykRSgg9Wp-)
- 对解决方案和代码有很好的解释
- 你可以在短时间内看几个
- [FisherCoder - LeetCode 解决方案](https://youtube.com/FisherCoder)
挑战/练习网站:
- [LeetCode](https://leetcode.com/)
- 我最喜欢的编程题网站。在你可能准备的 1-2 个月里,订阅费是值得的。
- 请参阅上面的 Nick White 和 FisherCoder 视频以获取代码演练。
- [HackerRank](https://www.hackerrank.com/)
- [TopCoder](https://www.topcoder.com/)
- [Codeforces](https://codeforces.com/)
- [Codility](https://codility.com/programmers/)
- [Geeks for Geeks](https://practice.geeksforgeeks.org/explore/?page=1)
- [AlgoExpert](https://www.algoexpert.io/product)
- 由 Google 工程师创建,这也是磨炼你技能的极佳资源。
- [Project Euler](https://projecteuler.net/)
- 非常侧重数学,并不真正适合编程面试
**[⬆ 返回顶部](#table-of-contents)**
## 让我们开始吧
好了,废话不多说,让我们开始学习吧!
但在学习的同时,不要忘记做上面的编程题!
## 算法复杂度 / Big-O / 渐进分析
- 这里没有什么需要实现的,你只需要观看视频并记笔记!好耶!
- 这里有大量的视频。只要看到你理解了为止。你随时可以回来复习。
- 如果你不懂背后的数学原理也不用担心。
- 你只需要理解如何用 Big-O 来表达一个算法的复杂度。
- [ ] [哈佛 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=z1mkCe3kVUA)
- [ ] [UC Berkeley Big O (视频)](https://archive.org/details/ucberkeley_webcast_VIS4YDpuP98)
- [ ] [摊还分析 (视频)](https://www.youtube.com/watch?v=B3SpQZaAZP4&index=10&list=PL1BaGV1cIH4UhkL8a9bJGG356covJ76qN)
- [ ] TopCoder (包括递推关系和主定理):
- [计算复杂度:第 1 节](https://www.topcoder.com/thrive/articles/Computational%20Complexity%20part%20one)
- [计算复杂度:第 2 节](https://www.topcoder.com/thrive/articles/Computational%20Complexity%20part%20two)
- [ ] [备忘单](http://bigocheatsheet.com/)
- [ ] [[复习] 18 分钟分析算法 (播放列表) (视频)](https://www.youtube.com/playlist?list=PL9xmBV_5YoZMxejjIyFHWa-4nKg6sdoIv)
好了,关于这个内容差不多了。
当你通读《编程面试金典》时,有一章是关于这个的,最后有一个小测验,看看你是否能识别不同算法的运行时间复杂度。这是一个极好的复习和测试。
**[⬆ 返回顶部](#table-of-contents)**
## 数据结构
- 数组
- [ ] 关于数组:
- [数组 CS50 哈佛大学](https://www.youtube.com/watch?v=tI_tIZFyKBw&t=3009s)
- [数组 (视频)](https://www.coursera.org/lecture/data-structures/arrays-OsBSF)
- [UC Berkeley CS61B - 线性与多维数组 (视频)](https://archive.org/details/ucberkeley_webcast_Wp8oiO_CZZE) (从 15 分 32 秒开始观看)
- [动态数组 (视频)](https://www.coursera.org/lecture/data-structures/dynamic-arrays-EwbnV)
- [交错数组 (视频)](https://www.youtube.com/watch?v=1jtrQqYpt7g)
- [ ] 实现一个向量(变数组,带有自动调整大小功能):
- [ ] 练习使用数组和指针进行编码,以及使用指针算术跳转到索引而不是使用索引。
- [ ] 分配了内存的新的原始数据数组
- 可以在底层分配 int 数组,只是不使用它的功能
- 从 16 开始,或者如果起始数字更大,则使用 2 的幂次方 - 16, 32, 64, 128
- [ ] size() - 项数
- [ ] capacity() - 它能容纳的项数
- [ ] is_empty()
- [ ] at(index) - 返回给定索引处的项,如果索引越界则报错
- [ ] push(item)
- [ ] insert(index, item) - 在索引处插入项,将该索引的值和尾随元素向右移动
- [ ] prepend(item) - 可以使用上面的 insert 在索引 0 处插入
- [ ] pop() - 从末尾移除,返回值
- [ ] delete(index) - 删除索引处的项,将所有尾随元素向左移动
- [ ] remove(item) - 查找值并删除包含它的索引(即使在多个位置)
- [ ] find(item) - 查找值并返回具有该值的第一个索引,如果未找到则为 -1
- [ ] resize(new_capacity) // 私有函数
- 当达到容量时,调整大小为原来的两倍
- 当弹出一个项时,如果大小为容量的 1/4,则调整大小为一半
- [ ] 时间
- 在末尾添加/删除(为分配更多空间而进行摊还)、索引或更新的时间复杂度为 O(1)
- 在其他地方插入/删除的时间复杂度为 O(n)
- [ ] 空间
- 在内存中连续,因此邻近性有助于提高性能
- 所需空间 = (数组容量,即 >= n) * 项的大小,但即使为 2n,仍然是 O(n)
- 链表
- [ ] 描述:
- [ ] [链表 CS50 哈佛大学](https://www.youtube.com/watch?v=2T-A_GFuoTo&t=650s) - 建立直觉。
- [ ] [单向链表 (视频)](https://www.coursera.org/lecture/data-structures/singly-linked-lists-kHhgK)
- [ ] [CS 61B - 链表 1 (视频)](https://archive.org/details/ucberkeley_webcast_htzJdKoEmO0)
- [ ] [CS 61B - 链表 2 (视频)](https://archive.org/details/ucberkeley_webcast_-c4I3gFYe3w)
- [ ] [[复习] 4 分钟看懂链表 (视频)](https://youtu.be/F8AbOfQwl1c)
- [ ] [C 代码 (视频)](https://www.youtube.com/watch?v=QN6FPiD0Gzo)
- 不是整个视频,只是关于 Node 结构体和内存分配的部分
- [ ] 链表与数组:
- [核心 链表与数组 (视频)](https://www.coursera.org/lecture/data-structures-optimizing-performance/core-linked-lists-vs-arrays-rjBs9)
- [现实世界中的 链表与数组 (视频)](https://www.coursera.org/lecture/data-structures-optimizing-performance/in-the-real-world-lists-vs-arrays-QUaUd)
- [ ] [为什么你应该避免使用链表 (视频)](https://www.youtube.com/watch?v=YQs6IC-vgmo)
- [ ] 陷阱:你需要指针的指针相关知识:
(当你将一个指针传递给一个函数时,该函数可能会更改该指针指向的地址)
这个页面只是为了让你掌握指针的指针。我不推荐这种列表遍历风格。由于过度“聪明”,可读性和可维护性会受损。
- [指向指针的指针](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) - 在索引处插入值,以便当前位于该索引的项由位于该索引的新项指向
- [ ] erase(index) - 移除给定索引处的节点
- [ ] value_n_from_end(n) - 返回列表中从末尾算起第 n 个位置的节点的值
- [ ] reverse() - 反转列表
- [ ] remove_value(value) - 移除列表中具有此值的第一个项
- [ ] 双向链表
- [描述 (视频)](https://www.coursera.org/lecture/data-structures/doubly-linked-lists-jpGKD)
- 无需实现
- 栈
- [ ] [栈 (视频)](https://www.coursera.org/lecture/data-structures/stacks-UdKzQ)
- [ ] [[复习] 3 分钟看懂栈 (视频)](https://youtu.be/KcT3aVgrrpU)
- [ ] 不会实现。用数组实现非常简单
- 队列
- [ ] [队列 (视频)](https://www.coursera.org/lecture/data-structures/queues-EShpq)
- [ ] [循环缓冲区/FIFO](https://en.wikipedia.org/wiki/Circular_buffer)
- [ ] [[复习] 3 分钟看懂队列 (视频)](https://youtu.be/D6gu-_tmEpQ)
- [ ] 使用链表实现,带有尾指针:
- enqueue(value) - 在尾部位置添加值
- dequeue() - 返回值并移除最近添加的元素(前端)
- empty()
- [ ] 使用固定大小的数组实现:
- enqueue(value) - 在可用存储空间的末尾添加项
- dequeue() - 返回值并移除最近添加的元素
- empty()
- full()
- [ ] 代价:
- 一个糟糕的实现是使用链表在头部入队并在尾部出队,这将是 O(n)
因为你需要倒数第二个元素,导致每次出队都要进行一次完整的遍历
- enqueue: O(1) (摊还,链表和数组 [探测])
- dequeue: O(1) (链表和数组)
- empty: O(1) (链表和数组)
- 哈希表
- [ ] 视频:
- [ ] [链式哈希 (视频)](https://www.youtube.com/watch?v=0M_kIqhwbFo&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=8)
- [ ] [表加倍,Karp-Rabin (视频)](https://www.youtube.com/watch?v=BRO7mVIFt08&index=9&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
- [ ] [开放寻址,密码学哈希 (视频)](https://www.youtube.com/watch?v=rvdJDijO2Ro&index=10&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
- [ ] [PyCon 2010:强大的字典 (视频)](https://www.youtube.com/watch?v=C4Kc8xzcA68)
- [ ] [PyCon 2017:更强大的字典 (视频)](https://www.youtube.com/watch?v=66P5FMkWoVU)
- [ ] [(高级) 随机化:全域与完美哈希 (视频)](https://www.youtube.com/watch?v=z0lJ2k0sl1g&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=11)
- [ ] [(高级) 完美哈希 (视频)](https://www.youtube.com/watch?v=N0COwN14gt0&list=PL2B4EEwhKD-NbwZ4ezj7gyc_3yNrojKM9&index=4)
- [ ] [[复习] 4 分钟看懂哈希表 (视频)](https://youtu.be/knV86FlSXJ8)
- [ ] 在线课程:
- [ ] [核心哈希表 (视频)](https://www.coursera.org/lecture/data-structures-optimizing-performance/core-hash-tables-m7UuP)
- [ ] [数据结构 (视频)](https://www.coursera.org/learn/data-structures/home/week/4)
- [ ] [电话簿问题 (视频)](https://www.coursera.org/lecture/data-structures/phone-book-problem-NYZZP)
- [ ] 分布式哈希表:
- [Dropbox 中的即时上传和存储优化 (视频)](https://www.coursera.org/lecture/data-structures/instant-uploads-and-storage-optimization-in-dropbox-DvaIb)
- [分布式哈希表 (视频)](https://www.coursera.org/lecture/data-structures/distributed-hash-tables-tvH8H)
- [ ] 使用线性探测数组实现
- hash(k, m) - m 是哈希表的大小
- add(key, value) - 如果键已存在,则更新值
- exists(key)
- get(key)
- remove(key)
**[⬆ 返回顶部](#table-of-contents)**
## 更多知识
- 二分查找
- [ ] [二分查找 (视频)](https://www.youtube.com/watch?v=D5SrAga1pno)
- [ ] [二分查找 (视频)](https://www.khanacademy.org/computing/computer-science/algorithms/binary-search/a/binary-search)
- [ ] [详情](https://www.topcoder.com/thrive/articles/Binary%20Search)
- [ ] [蓝图](https://leetcode.com/discuss/general-discussion/786126/python-powerful-ultimate-binary-search-template-solved-many-problems)
- [ ] [[复习] 4 分钟看懂二分查找 (视频)](https://youtu.be/fDKIpRe8GW4)
- [ ] 实现:
- 二分查找(在已排序的整数数组上)
- 使用递归的二分查找
- 位操作
- [ ] [位速查表](https://github.com/jwasham/coding-interview-university/blob/main/extras/cheat%20sheets/bits-cheat-sheet.pdf)
- 你应该知道从 (2^1 到 2^16 和 2^32) 的 2 的许多幂次方
- [ ] 真正深刻地理解使用:&、|、^、~、>>、<< 操作位
- [ ] [词汇](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)
- [ ] [位技巧](https://graphics.stanford.edu/~seander/bithacks.html)
- [ ] [位操作者](https://bits.stephan-brumme.com/)
- [ ] [位操作者交互版](https://bits.stephan-brumme.com/interactive.html)
- [ ] [位技巧 (视频)](https://www.youtube.com/watch?v=ZusiKXcz_ac)
- [ ] [练习操作](https://pconrad.github.io/old_pconrad_cs16/topics/bitOps/)
- [ ] 2 的补码和 1 的补码
- [二进制:优缺点(为什么我们使用 2 的补码)(视频)](https://www.youtube.com/watch?v=lKTsv6iVxV4)
- [1 的补码](https://en.wikipedia.org/wiki/Ones%27_complement)
- [2 的补码](https://en.wikipedia.org/wiki/Two%27s_complement)
- [ ] 计算设置位
- [计算一个字节中位的 4 种方法 (视频)](https://youtu.be/Hzuzo9NJrlc)
- [计算位](https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan)
- [如何计算 32 位整数中设置位的数量](http://stackoverflow.com/questions/109023/how-to-count-the-number-of-set-bits-in-a-32-bit-integer)
- [ ] 交换值:
- [交换](https://bits.stephan-brumme.com/swap.html)
- [ ] 绝对值:
- [整数绝对值](https://bits.stephan-brumme.com/absInteger.html)
**[⬆ 返回顶部](#table-of-contents)**
## 树
- 树 - 简介
- [ ] [树简介 (视频)](https://www.coursera.org/lecture/data-structures/trees-95qda)
- [ ] [树的遍历 (视频)](https://www.coursera.org/lecture/data-structures/tree-traversal-fr51b)
- [ ] [BFS(广度优先搜索) 和 DFS(深度优先搜索) (视频)](https://www.youtube.com/watch?v=uWL6FJhq5fM)
- BFS 笔记:
- 层序(BFS,使用队列)
- 时间复杂度:O(n)
- 空间复杂度:最好:O(1),最差:O(n/2)=O(n)
- DFS 笔记:
- 时间复杂度:O(n)
- 空间复杂度:
最好:O(log n) - 树的平均高度
最差:O(n)
- 中序(DFS:左,自己,右)
- 后序(DFS:左,右,自己)
- 前序(DFS:自己,左,右)
- [ ] [[复习] 4 分钟看懂广度优先搜索 (视频)](https://youtu.be/HZ5YTanv5QE)
- [ ] [[复习] 4 分钟看懂深度优先搜索 (视频)](https://youtu.be/Urx87-NMm6c)
- [ ] [[复习] 11 分钟看懂树的遍历 (播放列表) (视频)](https://www.youtube.com/playlist?list=PL9xmBV_5YoZO1JC2RgEi04nLy6D-rKk6b)
- 二叉搜索树:BSTs
- [ ] [二叉搜索树复习 (视频)](https://www.youtube.com/watch?v=x6At0nzX92o&index=1&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6)
- [ ] [简介 (视频)](https://www.coursera.org/learn/data-structures/lecture/E7cXP/introduction)
- [ ] [MIT (视频)](https://www.youtube.com/watch?v=76dhtgZt38A&ab_channel=MITOpenCourseWare)
- 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 // 将值插入树中](https://leetcode.com/problems/insert-into-a-binary-search-tree/submissions/987660183/)
- [ ] get_node_count // 获取存储值的计数
- [ ] print_values // 打印树中的值,从最小到最大- [ ] delete_tree
- [ ] is_in_tree // 如果给定值存在于树中,则返回 true
- [ ] [get_height // 返回以节点为单位的高度(单个节点的高度为 1)](https://www.geeksforgeeks.org/find-the-maximum-depth-or-height-of-a-tree/)
- [ ] get_min // 返回存储在树中的最小值
- [ ] get_max // 返回存储在树中的最大值
- [ ] [is_binary_search_tree](https://leetcode.com/problems/validate-binary-search-tree/)
- [ ] delete_value
- [ ] get_successor // 返回树中给定值之后的下一个最大值,如果没有则为 -1
- 堆 / 优先队列 / 二叉堆
- 可视化为树,但在存储中通常是线性的(数组,链表)
- [ ] [堆](https://en.wikipedia.org/wiki/Heap_(data_structure))
- [ ] [简介 (视频)](https://www.coursera.org/lecture/data-structures/introduction-2OpTs)
- [ ] [二叉树 (视频)](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/lecture/data-structures/heap-sort-hSzMO)
- [ ] [构建堆 (视频)](https://www.coursera.org/lecture/data-structures/building-a-heap-dwrOS)
- [ ] [MIT 6.006 算法导论:二叉堆](https://www.youtube.com/watch?v=Xnpo1atN-Iw&list=PLUl4u3cNGP63EdVPNLG3ToM6LaEUuStEY&index=12)
- [ ] [CS 61B 讲座 24:优先队列 (视频)](https://archive.org/details/ucberkeley_webcast_yIUFT6AKBGE)
- [ ] [线性时间 BuildHeap (最大堆)](https://www.youtube.com/watch?v=MiyLo8adrWw)
- [ ] [[复习] 13 分钟看懂堆 (播放列表) (视频)](https://www.youtube.com/playlist?list=PL9xmBV_5YoZNsyqgPW-DNwUeT8F8uhWc6)
- [ ] 实现一个最大堆:
- [ ] insert
- [ ] sift_up - 插入所需
- [ ] get_max - 返回最大项,不移除它
- [ ] get_size() - 返回存储的元素数量
- [ ] is_empty() - 如果堆不包含任何元素,则返回 true
- [ ] extract_max - 返回最大项,并移除它
- [ ] sift_down - extract_max 所需
- [ ] remove(x) - 移除索引 x 处的项
- [ ] heapify - 从元素数组创建堆,heap_sort 所需
- [ ] heap_sort() - 接收一个未排序的数组,并使用最大堆或最小堆将其原地转换为排序后的数组
**[⬆ 返回顶部](#table-of-contents)**
## 排序
- [ ] 笔记:
- 实现排序 & 了解每种排序的最佳/最坏情况和平均复杂度:
- 不要冒泡排序 - 它太糟了 - O(n^2),除非 n <= 16
- [ ] 排序算法的稳定性(“快速排序稳定吗?”)
- [排序算法稳定性](https://en.wikipedia.org/wiki/Sorting_algorithm#Stability)
- [排序算法中的稳定性](http://stackoverflow.com/questions/1517793/stability-in-sorting-algorithms)
- [排序算法中的稳定性](http://www.geeksforgeeks.org/stability-in-sorting-algorithms/)
- [排序算法 - 稳定性](http://homepages.math.uic.edu/~leon/cs-mcs401-s08/handouts/stability.pdf)
- [ ] 哪些算法可以用于链表?哪些用于数组?哪些两者都可以?
- 我不推荐对链表进行排序,但归并排序是可行的。
- [链表的归并排序](http://www.geeksforgeeks.org/merge-sort-for-linked-list/)
- 对于堆排序,请参阅上面的堆数据结构。堆排序很好,但不是稳定的。
- [ ] [Sedgewick - 归并排序 (5 个视频)](https://www.coursera.org/learn/algorithms-part1/home/week/3)
- [ ] [1. 归并排序](https://www.coursera.org/lecture/algorithms-part1/mergesort-ARWDq)
- [ ] [2. 自底向上归并排序](https://www.coursera.org/learn/algorithms-part1/lecture/PWNEl/bottom-up-mergesort)
- [ ] [3. 排序复杂度](https://www.coursera.org/lecture/algorithms-part1/sorting-complexity-xAltF)
- [ ] [4. 比较器](https://www.coursera.org/lecture/algorithms-part1/comparators-9FYhS)
- [ ] [5. 稳定性](https://www.coursera.org/learn/algorithms-part1/lecture/pvvLZ/stability)
- [ ] [Sedgewick - 快速排序 (4 个视频)](https://www.coursera.org/learn/algorithms-part1/home/week/3)
- [ ] [1. 快速排序](https://www.coursera.org/lecture/algorithms-part1/quicksort-vjvnC)
- [ ] [2. 选择](https://www.coursera.org/lecture/algorithms-part1/selection-UQxFT)
- [ ] [3. 重复键](https://www.coursera.org/lecture/algorithms-part1/duplicate-keys-XvjPd)
- [ ] [4. 系统排序](https://www.coursera.org/lecture/algorithms-part1/system-sorts-QBNZ7)
- [ ] UC Berkeley:
- [ ] [CS 61B 讲座 29:排序 I (视频)](https://archive.org/details/ucberkeley_webcast_EiUvYS2DT6I)
- [ ] [CS 61B 讲座 30:排序 II (视频)](https://archive.org/details/ucberkeley_webcast_2hTY3t80Qsk)
- [ ] [CS 61B 讲座 32:排序 III (视频)](https://archive.org/details/ucberkeley_webcast_Y6LOLpxg6Dc)
- [ ] [CS 61B 讲座 33:排序 V (视频)](https://archive.org/details/ucberkeley_webcast_qNMQ4ly43p4)
- [ ] [CS 61B 2014-04-21:基数排序(视频)](https://archive.org/details/ucberkeley_webcast_pvbBMd-3NoI)
- [ ] [冒泡排序 (视频)](https://www.youtube.com/watch?v=P00xJgWzz2c&index=1&list=PL89B61F78B552C1AB)
- [ ] [分析冒泡排序 (视频)](https://www.youtube.com/watch?v=ni_zk257Nqo&index=7&list=PL89B61F78B552C1AB)
- [ ] [插入排序,归并排序 (视频)](https://www.youtube.com/watch?v=Kg4bqzAqRBM&index=3&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
- [ ] [插入排序 (视频)](https://www.youtube.com/watch?v=c4BRHC7kTaQ&index=2&list=PL89B61F78B552C1AB)
- [ ] [归并排序 (视频)](https://www.youtube.com/watch?v=GCae1WNvnZM&index=3&list=PL89B61F78B552C1AB)
- [ ] [快速排序 (视频)](https://www.youtube.com/watch?v=y_G9BkAm6B8&index=4&list=PL89B61F78B552C1AB)
- [ ] [选择排序 (视频)](https://www.youtube.com/watch?v=6nDMgr0-Yyo&index=8&list=PL89B61F78B552C1AB)
- [ ] 归并排序代码:
- [ ] [使用输出数组 (C)](http://www.cs.yale.edu/homes/aspnes/classes/223/examples/sorting/mergesort.c)
- [ ] [使用输出数组 (Python)](https://github.com/jwasham/practice-python/blob/master/merge_sort/merge_sort.py)
- [ ] [原地 (C++)](https://github.com/jwasham/practice-cpp/blob/master/merge_sort/merge_sort.cc)
- [ ] 快速排序代码:
- [ ] [实现 (C)](http://www.cs.yale.edu/homes/aspnes/classes/223/examples/randomization/quick.c)
- [ ] [实现 (C)](https://github.com/jwasham/practice-c/blob/master/quick_sort/quick_sort.c)
- [ ] [实现 (Python)](https://github.com/jwasham/practice-python/blob/master/quick_sort/quick_sort.py)
- [ ] [[复习] 18 分钟看懂排序 (播放列表)](https://www.youtube.com/playlist?list=PL9xmBV_5YoZOZSbGAXAPIq1BeUf4j20pl)
- [ ] [4 分钟看懂快速排序 (视频)](https://youtu.be/Hoixgm4-P4M)
- [ ] [4 分钟看懂堆排序 (视频)](https://youtu.be/2DmK_H7IdTo)
- [ ] [3 分钟看懂归并排序 (视频)](https://youtu.be/4VqmGXwpLqc)
- [ ] [2 分钟看懂冒泡排序 (视频)](https://youtu.be/xli_FI7CuzA)
- [ ] [3 分钟看懂选择排序 (视频)](https://youtu.be/g-PGLbMth_g)
- [ ] [2 分钟看懂插入排序 (视频)](https://youtu.be/JU767SDMDvA)
- [ ] 实现:
- [ ] 归并排序:O(n log n) 平均和最坏情况
- [ ] 快速排序 O(n log n) 平均情况
- 选择排序和插入排序的平均和最坏情况都是 O(n^2)
- 对于堆排序,请参阅上面的堆数据结构
- [ ] 非必需,但我推荐它们:
- [ ] [Sedgewick - 基数排序 (6 个视频)](https://www.coursera.org/learn/algorithms-part2/home/week/3)
- [ ] [1. Java 中的字符串](https://www.coursera.org/learn/algorithms-part2/lecture/vGHvb/strings-in-java)
- [ ] [2. 键索引计数](https://www.coursera.org/lecture/algorithms-part2/key-indexed-counting-2pi1Z)
- [ ] [3. 最低有效位优先字符串基数排序](https://www.coursera.org/learn/algorithms-part2/lecture/c1U7L/lsd-radix-sort)
- [ ] [4. 最高有效位优先字符串基数排序](https://www.coursera.org/learn/algorithms-part2/lecture/gFxwG/msd-radix-sort)
- [ ] [5. 三路基数快速排序](https://www.coursera.org/lecture/algorithms-part2/3-way-radix-quicksort-crkd5)
- [ ] [6. 后缀数组](https://www.coursera.org/learn/algorithms-part2/lecture/TH18W/suffix-arrays)
- [ ] [基数排序](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#radixSort)
- [ ] [基数排序 (视频)](https://www.youtube.com/watch?v=xhr26ia4k38)
- [ ] [基数排序,计数排序(给定约束下的线性时间)(视频)](https://www.youtube.com/watch?v=Nz1KZXbghj8&index=7&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
- [ ] [随机化:矩阵乘法,快速排序,Freivalds 算法 (视频)](https://www.youtube.com/watch?v=cNB2lADK3_s&index=8&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)
- [ ] [线性时间排序 (视频)](https://www.youtube.com/watch?v=pOKy3RZbSws&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf&index=14)
作为总结,这里是 [15 种排序算法](https://www.youtube.com/watch?v=kPRA0W1kECg) 的可视化表示。
如果你需要关于这个主题的更多细节,请参阅[部分主题的补充细节](#additional-detail-on-some-subjects)中的“排序”部分
**[⬆ 返回顶部](#table-of-contents)**
## 图
图可以用来表示计算机科学中的许多问题,所以这一节很长,就像树和排序一样。
- 笔记:
- 在内存中表示图有 4 种基本方式:
- 对象和指针
- 邻接矩阵
- 邻接表
- 邻接图
- 熟悉每种表示法及其优缺点
- BFS 和 DFS - 了解它们的计算复杂度、权衡,以及如何在实际代码中实现它们
- 当被问到一个问题时,首先寻找基于图的解决方案,如果没有,再继续其他方法
- [ ] MIT(视频):
- [ ] [广度优先搜索](https://www.youtube.com/watch?v=oFVYVzlvk9c&t=14s&ab_channel=MITOpenCourseWare)
- [ ] [深度优先搜索](https://www.youtube.com/watch?v=IBfWDYSffUU&t=32s&ab_channel=MITOpenCourseWare)
- [ ] Skiena 讲座 - 很好的入门:
- [ ] [CSE373 2020 - 讲座 10 - 图数据结构 (视频)](https://www.youtube.com/watch?v=Sjk0xqWWPCc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=10)
- [ ] [CSE373 2020 - 讲座 11 - 图遍历 (视频)](https://www.youtube.com/watch?v=ZTwjXj81NVY&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=11)
- [ ] [CSE373 2020 - 讲座 12 - 深度优先搜索 (视频)](https://www.youtube.com/watch?v=KyordYB3BOs&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=12)
- [ ] [CSE373 2020 - 讲座 13 - 最小生成树 (视频)](https://www.youtube.com/watch?v=oolm2VnJUKw&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=13)
- [ ] [CSE373 2020 - 讲座 14 - 最小生成树(续) (视频)](https://www.youtube.com/watch?v=RktgPx0MarY&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=14)
- [ ] [CSE373 2020 - 讲座 15 - 图算法(续 2) (视频)](https://www.youtube.com/watch?v=MUe5DXRhyAo&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=15)
- [ ] 图(复习及更多):
- [ ] [6.006 单源最短路径问题 (视频)](https://www.youtube.com/watch?v=Aa2sqUhIn-E&index=15&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
- [ ] [6.006 Dijkstra (视频)](https://www.youtube.com/watch?v=NSHizBK9JD8&t=1731s&ab_channel=MITOpenCourseWare)
- [ ] [6.006 Bellman-Ford (视频)](https://www.youtube.com/watch?v=f9cVS_URPc0&ab_channel=MITOpenCourseWare)
- [ ] [6.006 加速 Dijkstra (视频)](https://www.youtube.com/watch?v=CHvQ3q_gJ7E&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=18)
- [ ] [Aduni:图算法 I - 拓扑排序,最小生成树,Prim 算法 - 讲座 6 (视频)]( https://www.youtube.com/watch?v=i_AQT_XfvD8&index=6&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
- [ ] [Aduni:图算法 II - DFS,BFS,Kruskal 算法,并查集数据结构 - 讲座 7 (视频)]( https://www.youtube.com/watch?v=ufj5_bppBsA&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=7)
- [ ] [Aduni:图算法 III:最短路径 - 讲座 8 (视频)](https://www.youtube.com/watch?v=DiedsPsMKXc&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=8)
- [ ] [Aduni:图算法 IV:几何算法简介 - 讲座 9 (视频)](https://www.youtube.com/watch?v=XIAQRlNkJAw&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=9)
- [ ] [CS 61B 2014:带权图 (视频)](https://archive.org/details/ucberkeley_webcast_zFbq8vOZ_0k)
- [ ] [贪心算法:最小生成树 (视频)](https://www.youtube.com/watch?v=tKwnms5iRBU&index=16&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)
- [ ] [强连通分量 Kosaraju 算法图算法 (视频)](https://www.youtube.com/watch?v=RpgcYiky7uw)
- [ ] [[复习] 16 分钟看懂最短路径算法 (播放列表) (视频)](https://www.youtube.com/playlist?list=PL9xmBV_5YoZO-Y-H3xIC9DGSfVYJng9Yw)
- [ ] [[复习] 4 分钟看懂最小生成树 (播放列表) (视频)](https://www.youtube.com/playlist?list=PL9xmBV_5YoZObEi3Hf6lmyW-CBfs7nkOV)
- 完整的 Coursera 课程:
- [ ] [图上的算法 (视频)](https://www.coursera.org/learn/algorithms-on-graphs/home/welcome)
- 我将实现:
- [ ] 带有邻接表的 DFS(递归)
- [ ] 带有邻接表的 DFS(使用栈的迭代)
- [ ] 带有邻接矩阵的 DFS(递归)
- [ ] 带有邻接矩阵的 DFS(使用栈的迭代)
- [ ] 带有邻接表的 BFS
- [ ] 带有邻接矩阵的 BFS
- [ ] 单源最路径(Dijkstra)
- [ ] 最小生成树
- 基于 DFS 的算法(见上面的 Aduni 视频):
- [ ] 检查环(拓扑排序所需,因为我们会在开始前检查环)
- [ ] 拓扑排序
- [ ] 计算图中的连通分量数
- [ ] 列出强连通分量
- [ ] 检查二分图
**[⬆ 返回顶部](#table-of-contents)**
## 更多知识
- 递归
- [ ] 斯坦福关于递归和回溯的讲座:
- [ ] [讲座 8 | 编程抽象 (视频)](https://www.youtube.com/watch?v=gl3emqCuueQ&list=PLFE6E58F856038C69&index=8)
- [ ] [讲座 9 | 编程抽象 (视频)](https://www.youtube.com/watch?v=uFJhEPrbycQ&list=PLFE6E58F856038C69&index=9)
- [ ] [讲座 10 | 编程抽象 (视频)](https://www.youtube.com/watch?v=NdF1QDTRkck&index=10&list=PLFE6E58F856038C69)
- [ ] [讲座 11 | 编程抽象 (视频)](https://www.youtube.com/watch?v=p-gpaIGRCQI&list=PLFE6E58F856038C69&index=11)
- 什么时候适合使用它?
- 尾递归如何比非尾递归更好?
- [ ] [什么是尾递ursion,为什么它那么糟糕?](https://www.quora.com/What-is-tail-recursion-Why-is-it-so-bad)
- [ ] [尾递归 (视频)](https://www.coursera.org/lecture/programming-languages/tail-recursion-YZic1)
- [ ] [解决任何递归问题的 5 个简单步骤(视频)](https://youtu.be/ngCos392W4w)
回溯蓝图:[Java](https://leetcode.com/problems/combination-sum/discuss/16502/A-general-approach-to-backtracking-questions-in-Java-(Subsets-Permutations-Combination-Sum-Palindrome-Partitioning))
[Python](https://leetcode.com/problems/combination-sum/discuss/429538/General-Backtracking-questions-solutions-in-Python-for-reference-%3A)
- 动态规划
- 你可能在面试中看不到任何动态规划问题,但值得能够识别出一个问题是否适合作为动态规划的候选。
- 这个主题可能非常困难,因为每个可用 DP 解决的问题必须被定义为一个递推关系,而想出这个递推关系可能会很棘手。
- 我建议看很多 DP 问题的例子,直到你对其中涉及的模式有了扎实的理解。
- [ ] 视频:
- [ ] [Skiena:CSE373 2020 - 讲座 19 - 动态规划简介 (视频)](https://www.youtube.com/watch?v=wAA0AMfcJHQ&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=18)
- [ ] [Skiena:CSE373 2020 - 讲座 20 - 编辑距离 (视频)](https://www.youtube.com/watch?v=T3A4jlHlhtA&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=19)
- [ ] [Skiena:CSE373 2020 - 讲座 20 - 编辑距离(续) (视频)](https://www.youtube.com/watch?v=iPnPVcZmRbE&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=20)
- [ ] [Skiena:CSE373 2020 - 讲座 21 - 动态规划 (视频)](https://www.youtube.com/watch?v=2xPE4Wq8coQ&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=21)
- [ ] [Skiena:CSE373 2020 - 讲座 22 - 动态规划和复习 (视频)](https://www.youtube.com/watch?v=Yh3RzqQGsyI&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=22)
- [ ] [Simonson:动态规划 0 (从 59:18 开始) (视频)](https://youtu.be/J5aJEcOr6Eo?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=3558)
- [ ] [Simonson:动态规划 I - 讲座 11 (视频)](https://www.youtube.com/watch?v=0EzHjQ_SOeU&index=11&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
- [ ] [Simonson:动态规划 II - 讲座 12 (视频)](https://www.youtube.com/watch?v=v1qiRwuJU7g&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=12)
- 单个 DP 问题的列表(每个都很短):
[动态规划 (视频)](https://www.youtube.com/playlist?list=PLrmLmBdmIlpsHaNTPP_jHHDx_os9ItYXr)
- [ ] 耶鲁课程笔记:
- [ ] [动态规划](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#dynamicProgramming)
- [ ] Coursera:
- [ ] [RNA 二级结构问题 (视频)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/80RrW/the-rna-secondary-structure-problem)
- [ ] [一个动态规划算法 (视频)](https://www.coursera.org/lecture/algorithmic-thinking-2/a-dynamic-programming-algorithm-PSonq)
- [ ] [图解 DP 算法 (视频)](https://www.coursera.org/lecture/algorithmic-thinking-2/illustrating-the-dp-algorithm-oUEK2)
- [ ] [DP 算法的运行时间 (视频)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/nfK2r/running-time-of-the-dp-algorithm)
- [ ] [DP 对比递归实现 (视频)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/M999a/dp-vs-recursive-implementation)
- [ ] [全局成对序列比对 (视频)](https://www.coursera.org/lecture/algorithmic-thinking-2/global-pairwise-sequence-alignment-UZ7o6)
- [ ] [局部成对序列比对 (视频)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/WnNau/local-pairwise-sequence-alignment)
- 设计模式
- [ ] [快速 UML 复习 (视频)](https://www.youtube.com/watch?v=3cmzqZzwNDM&list=PLGLfVvz_LVvQ5G-LdJ8RLqe-ndo7QITYc&index=3)
- [ ] 学习这些模式:
- [ ] 策略模式
- [ ] 单例模式
- [ ] 适配器模式
- [ ] 原型模式
- [ ] 装饰器模式
- [ ] 访问者模式
- [ ] 工厂模式,抽象工厂模式
- [ ] 外观模式
- [ ] 观察者模式
- [ ] 代理模式
- [ ] 委托模式
- [ ] 命令模式
- [ ] 状态模式
- [ ] 备忘录模式
- [ ] 迭代器模式
- [ ] 组合模式
- [ ] 享元模式
- [ ] [视频系列 (27 个视频)](https://www.youtube.com/playlist?list=PLF206E906175C7E07)
- [ ] [书籍:深入浅出设计模式](https://www.amazon.com/Head-First-Design-Patterns-Freeman/dp/0596007124)
- 我知道权威著作是《设计模式:可复用面向对象软件的基础》,但《深入浅出》对于面向对象的初学者来说非常棒。
- [便捷参考:给开发者的 101 个设计模式和技巧](https://sourcemaking.com/design-patterns-and-tips)
- 组合数学 (n 选 k) 与 概率
- [ ] [数学技能:如何求阶乘、排列和组合(选择)(视频)](https://www.youtube.com/watch?v=8RRo6Ti9d0U)
- [ ] [Make School:概率 (视频)](https://www.youtube.com/watch?v=sZkAAk9Wwa4)
- [ ] [Make School:更多概率和马尔可夫链 (视频)](https://www.youtube.com/watch?v=dNaJg-mLobQ)
- [ ] 可汗学院:
- 课程布局:
- [ ] [基础理论概率](https://www.khanacademy.org/math/probability/probability-and-combinatorics-topic)
- 仅视频 - 41 个(每个都很简单且很短):
- [ ] [概率讲解 (视频)](https://www.youtube.com/watch?v=uzkc-qNVoOk&list=PLC58778F28211FA19)
- NP、NP-完全问题与近似算法
- 了解最著名的 NP-完全问题类别,例如旅行商问题和背包问题,
并能在面试官伪装提问时认出它们。
- 知道 NP-完全意味着什么。
- [ ] [计算复杂度 (视频)](https://www.youtube.com/watch?v=moPtwq_cVH8&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=23)
- [ ] Simonson:
- [ ] [贪心算法 II 与 NP 完全性简介 (视频)](https://youtu.be/qcGnJ47Smlo?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=2939)
- [ ] [NP 完全性 II 与规约 (视频)](https://www.youtube.com/watch?v=e0tGC6ZQdQE&index=16&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
- [ ] [NP 完全性 III (视频)](https://www.youtube.com/watch?v=fCX1BGT3wjE&index=17&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
- [ ] [NP 完全性 IV (视频)](https://www.youtube.com/watch?v=NKLDp3Rch3M&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=18)
- [ ] Skiena:
- [ ] [CSE373 2020 - 讲座 23 - NP-完全性 (视频)](https://www.youtube.com/watch?v=ItHp5laE1VE&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=23)
- [ ] [CSE373 2020 - 讲座 24 - 可满足性问题 (视频)](https://www.youtube.com/watch?v=inaFJeCzGxU&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=24)
- [ ] [CSE373 2020 - 讲座 25 - 更多 NP-完全性 (视频)](https://www.youtube.com/watch?v=B-bhKxjZLlc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=25)
- [ ] [CSE373 2020 - 讲座 26 - NP-完全性挑战 (视频)](https://www.youtube.com/watch?v=_EzetTkG_Cc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=26)
- [ ] [复杂度:P,NP,NP-完全性,规约 (视频)](https://www.youtube.com/watch?v=eHZifpgyH_4&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=22)
- [ ] [复杂度:近似算法 (视频)](https://www.youtube.com/watch?v=MEz1J9wY2iM&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=24)
- [ ] [复杂度:固定参数算法 (视频)](https://www.youtube.com/watch?v=4q-jmGrmxKs&index=25&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)
- Peter Norvig 讨论了旅行商问题的近似最优解:
- [Jupyter Notebook](http://nbviewer.jupyter.org/url/norvig.com/ipython/TSP.ipynb)
- 如果你有 CLRS 这本书,请看第 1048 - 1140 页。
- 计算机如何处理程序
- [ ] [CPU 如何执行程序 (视频)](https://www.youtube.com/watch?v=XM4lGflQFvA)
- [ ] [计算机如何计算 - ALU (视频)](https://youtu.be/1I5ZMmrOfnA)
- [ ] [寄存器和 RAM (视频)](https://youtu.be/fpnE6UAfbtU)
- [ ] [中央处理器 (CPU) (视频)](https://youtu.be/FZGugFqdr60)
- [ ] [指令和程序 (视频)](https://youtu.be/zltgXvg6r3k)
- 缓存
- [ ] LRU 缓存:
- [ ] [LRU 缓存的魔力 (100 天的 Google 开发) (视频)](https://www.youtube.com/watch?v=R5ON3iwx78M)
- [ ] [实现 LRU (视频)](https://www.youtube.com/watch?v=bq6N7Ym81iI)
- [ ] [LeetCode - 146 LRU 缓存 (C++) (视频)](https://www.youtube.com/watch?v=8-FZRAjR7qU)
- [ ] CPU 缓存:
- [ ] [MIT 6.004 L15:内存层次结构 (视频)](https://www.youtube.com/watch?v=vjYF_fAZI5E&list=PLrRW1w6CGAcXbMtDFj205vALOGmiRc82-&index=24)
- [ ] [MIT 6.004 L16:缓存问题 (视频)](https://www.youtube.com/watch?v=ajgC3-pyGlk&index=25&list=PLrRW1w6CGAcXbMtDFj205vALOGmiRc82-)
- 进程与线程
- [ ] 计算机科学 162 - 操作系统 (25 个视频):
- 对于进程和线程,请看视频 1-11
- [操作系统和系统编程 (视频)](https://archive.org/details/ucberkeley-webcast-PL-XXv-cvA_iBDyz-ba4yDskqMDY6A1w_c)
- [进程和线程的区别是什么?](https://www.quora.com/What-is-the-difference-between-a-process-and-a-thread)
- 涵盖:
- 进程,线程,并发问题
- 进程和线程的区别
- 进程
- 线程
- 锁
- 互斥锁
- 信号量
- 监视器
- 它们是如何工作的?
- 死锁
- 活锁
- CPU 活动,中断,上下文切换
- 具有多核处理器的现代并发结构
- [分页,分段和虚拟内存 (视频)](https://youtu.be/O4nwUqQodAg)
- [中断 (视频)](https://youtu.be/iKlAWIKEyuw)
- 进程资源需求(内存:代码,静态存储,栈,堆,以及文件描述符,I/O)
- 线程资源需求(与同一进程中的其他线程共享上述内容(除栈外),但每个线程都有自己的 PC,栈计数器,寄存器和栈)
- Forking 实际上是写入时复制(只读),直到新进程写入内存,然后它才进行完整的复制。
- 上下文切换
- [上下文切换是如何由操作系统和底层硬件发起的?](https://www.javatpoint.com/what-is-the-context-switching-in-the-operating-system)
- [ ] [C++ 中的线程 (系列 - 10 个视频)](https://www.youtube.com/playlist?list=PL5jc9xFGsL8E12so1wlMS0r0hTQoJL74M)
- [ ] [CS 377 2014 年春季:马萨诸塞大学操作系统](https://www.youtube.com/playlist?list=PLacuG5pysFbDQU8kKxbUh4K5c1iL5_k7k)
- [ ] Python 中的并发 (视频):
- [ ] [关于线程的简短系列](https://www.youtube.com/playlist?list=PL1H1sBF1VAKVMONJWJkmUh6_p8g4F2oy1)
- [ ] [Python 线程](https://www.youtube.com/watch?v=Bs7vPNbB9JM)
- [ ] [理解 Python GIL (2010)](https://www.youtube.com/watch?v=Obt-vMVdM8s)
- [参考](http://www.dabeaz.com/GIL)
- [ ] [David Beazley - 从零开始的 Python 并发!- PyCon 2015](https://www.youtube.com/watch?v=MCs5OvhV9S4)
- [ ] [主题演讲 David Beazley - 感兴趣的主题](https://www.youtube.com/watch?v=ZzfHjytDceU)
- [ ] [Python 中的互斥锁](https://www.youtube.com/watch?v=0zaPs8OtyKY)
- 测试
- 涵盖:
- 单元测试的工作原理
- 什么是模拟对象
- 什么是集成测试
- 什么是依赖注入
- [ ] [与 James Bach 一起的敏捷软件测试 (视频)](https://www.youtube.com/watch?v=SAhJf36_u5U)
- [ ] [James Bach 关于软件测试的公开讲座 (视频)](https://www.youtube.com/watch?v=ILkT_HV9DVU)
- [ ] [Steve Freeman - 测试驱动开发(不是我们所说的那样)(视频)](https://vimeo.com/83960706)
- [幻灯片](http://gotocon.com/dl/goto-berlin-2013/slides/SteveFreeman_TestDrivenDevelopmentThatsNotWhatWeMeant.pdf)
- [ ] 依赖注入:
- [ ] [视频](https://www.youtube.com/watch?v=IKD2-MAkXyQ)
- [ ] [测试之道](http://jasonpolites.github.io/tao-of-testing/ch3-1.1.html)
- [ ] [如何编写测试](http://jasonpolites.github.io/tao-of-testing/ch4-1.1.html)
- 字符串搜索与操作
- [ ] [Sedgewick - 后缀数组 (视频)](https://www.coursera.org/learn/algorithms-part2/lecture/TH18W/suffix-arrays)
- [ ] [Sedgewick - 子字符串搜索 (视频)](https://www.coursera.org/learn/algorithms-part2/home/week/4)
- [ ] [1. 子字符串搜索简介](https://www.coursera.org/lecture/algorithms-part2/introduction-to-substring-search-n3ZpG)
- [ ] [2. 暴力子字符串搜索](https://www.coursera.org/learn/algorithms-part2/lecture/2Kn5i/brute-force-substring-search)
- [ ] [3. Knuth-Morris Pratt](https://www.coursera.org/learn/algorithms-part2/lecture/TAtDr/knuth-morris-pratt)
- [ ] [4. Boyer-Moore](https://www.coursera.org/learn/algorithms-part2/lecture/CYxOT/boyer-moore)
- [ ] [5. Rabin-Karp](https://www.coursera.org/lecture/algorithms-part2/rabin-karp-3KiqT)
- [ ] [在文本中搜索模式 (视频)](https://www.coursera.org/learn/data-structures/lecture/tAfHI/search-pattern-in-text)
如果你需要关于这个主题的更多细节,请参阅[部分主题的补充细节](#additional-detail-on-some-subjects)中的“字符串匹配”部分。
- 字典树
- 请注意有不同种类的字典树。有些有前缀,有些没有,有些使用字符串而不是位
来跟踪路径
- 我阅读了代码,但不会实现
- [ ] [Sedgewick - 字典树 (3 个视频)](https://www.coursera.org/learn/algorithms-part2/home/week/4)
- [ ] [1. R-Way 字典树](https://www.coursera.org/learn/algorithms-part2/lecture/CPVdr/r-way-tries)
- [ ] [2. 三向字典树](https://www.coursera.org/learn/algorithms-part2/lecture/yQM8K/ternary-search-tries)
- [ ] [3. 基于字符的操作](https://www.coursera.org/learn/algorithms-part2/lecture/jwNmV/character-based-operations)
- [ ] [关于数据结构和编程技术的笔记](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#Tries)
- [ ] 短课程视频:
- [ ] [字典树简介 (视频)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/08Xyf/core-introduction-to-tries)
- [ ] [字典树的性能 (视频)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/PvlZW/core-performance-of-tries)
- [ ] [实现字典树 (视频)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/DFvd3/core-implementing-a-trie)
- [ ] [字典树:一种被忽视的数据结构](https://www.toptal.com/java/the-trie-a-neglected-data-structure)
- [ ] [TopCoder - 使用字典树](https://www.topcoder.com/thrive/articles/Using%20Tries)
- [ ] [斯坦福讲座(实际用例)(视频)](https://www.youtube.com/watch?v=TJ8SkcUSdbU)
- [ ] [MIT,高级数据结构,字符串(过半后会变得非常晦涩)(视频)](https://www.youtube.com/watch?v=NinWEPPrkDQ&index=16&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf)
- 浮点数
- [ ] 简单的 8 位:[浮点数的表示 - 1 (视频 - 计算中有错误 - 请参阅视频描述)](https://www.youtube.com/watch?v=ji3SfClm8TU)
- Unicode
- [ ] [每个软件开发人员绝对、肯定需要了解的关于 Unicode 和字符集的最少知识]( http://www.joelonsoftware.com/articles/Unicode.html)
- [ ] [每个程序员绝对、肯定需要了解的关于编码和字符集的知识才能处理文本](http://kunststube.net/encoding/)
- 字节序
- [ ] [大端序与小端序](https://web.archive.org/web/20180107141940/http://www.cs.umd.edu:80/class/sum2003/cmsc311/Notes/Data/endian.html)
- [ ] [大端序与小端序对比 (视频)](https://www.youtube.com/watch?v=JrNF0KRAlyo)
- [ ] [由内而外看大端序与小端序 (视频)](https://www.youtube.com/watch?v=oBSuXP-1Tc0)
- 非常技术性的内核开发者谈话。如果大部分内容超出了你的理解范围,不用担心。
- 前半部分就足够了。
- 网络
- **如果你有网络经验或想成为可靠性工程师或运维工程师,请准备好回答问题**
- 否则,了解一下就好
- [ ] [可汗学院](https://www.khanacademy.org/computing/code-org/computers-and-the-internet)
- [ ] [UDP 和 TCP:传输协议的比较 (视频)](https://www.youtube.com/watch?v=Vdc8TCESIg8)
- [ ] [TCP/IP 和 OSI 模型解释! (视频)](https://www.youtube.com/watch?v=e5DEVa9eSN0)
- [ ] [互联网上的数据包传输。网络与 TCP/IP 教程。 (视频)](https://www.youtube.com/watch?v=nomyRJehhnM)
- [ ] [HTTP (视频)](https://www.youtube.com/watch?v=WGJrLqtX7As)
- [ ] [SSL 和 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)
- [ ] [视频系列 (21 个视频) (视频)](https://www.youtube.com/playlist?list=PLEbnTDJUr_IegfoqO4iPnPYQui46QqT0j)
- [ ] [子网划分详解 - 第 5 部分 CIDR 表示法 (视频)](https://www.youtube.com/watch?v=t5xYI0jzOf4)
- [ ] 套接字:
- [ ] [Java - 套接字 - 简介 (视频)](https://www.youtube.com/watch?v=6G_W54zuadg&t=6s)
- [ ] [套接字编程 (视频)](https://www.youtube.com/watch?v=G75vN2mnJeQ)
**[⬆ 返回顶部](#table-of-contents)**
## 最终复习
```
This section will have shorter videos that you can watch pretty quickly to review most of the important concepts.
It's nice if you want a refresher often.
```
- [ ] 系列 2-3 分钟的短主题视频 (23 个视频)
- [视频](https://www.youtube.com/watch?v=r4r1DZcx1cM&list=PLmVb1OknmNJuC5POdcDv5oCS7_OUkDgpj&index=22)
- [ ] 系列 2-5 分钟的短主题视频 - Michael Sambol (48 个视频):
- [视频](https://www.youtube.com/@MichaelSambol)
- [代码示例](https://github.com/msambol/dsa)
- [ ] [Sedgewick 视频 - 算法 I](https://www.coursera.org/learn/algorithms-part1)
- [ ] [Sedgewick 视频 - 算法 II](https://www.coursera.org/learn/algorithms-part2)
**[⬆ 返回顶部](#table-of-contents)**
## 更新你的简历
- 请参阅书籍中的简历准备信息:“编程面试金典”和“编程面试曝光”
- [“一份好的简历应该是什么样子”作者 Gayle McDowell(《编程面试金典》作者)](https://www.careercup.com/resume),
- 作者注:“这主要针对美国简历。印度和其他国家的 CV 有不同的期望,尽管许多要点是相同的。”
- [“循序渐进的简历指南”来自 Tech Interview Handbook](https://www.techinterviewhandbook.org/resume/guide)
- 详细的指南,教你如何从零开始设置你的简历,编写有效的简历内容,对其进行优化并测试你的简历
**[⬆ 返回顶部](#table-of-contents)**
## 面试流程与常规面试准备
- [ ] [如何在 2021 年通过工程面试](https://davidbyttow.medium.com/how-to-pass-the-engineering-interview-in-2021-45f1b389a1)
- [ ] [揭开技术招聘的神秘面纱](https://www.youtube.com/watch?v=N233T0epWTs)
- [ ] 如何在四大找到工作:
- [ ] [如何在四大找到工作 - Amazon,Facebook,Google 和 Microsoft (视频)](https://www.youtube.com/watch?v=YJZCUhxNCv8)
- [ ] [如何在四大找到工作.1(后续视频)](https://www.youtube.com/watch?v=6790FVXWBw8&feature=youtu.be)
- [ ] 《编程面试金典》系列 1:
- [ ] [Gayle L McDowell - 《编程面试金典》(视频)](https://www.youtube.com/watch?v=rEJzOhC5ZtQ)
- [ ] [与作者 Gayle Laakmann McDowell 一起破解编程面试 (视频)](https://www.youtube.com/watch?v=aClxtDcdpsQ)
- [ ] 破解 Facebook 编程面试:
- [ ] [方法](https://www.youtube.com/watch?v=wCl9kvQGHPI)
- [ ] [问题演练](https://www.youtube.com/watch?v=4UWDyJq8jZg)
- 准备课程:
- [Python 数据结构,算法和面试 (付费课程)](https://www.udemy.com/python-for-data-structures-algorithms-and-interviews/):
- 一门以 Python 为中心的面试准备课程,涵盖数据结构,算法,模拟面试等等。
- [使用 Python 的数据结构和算法简介 (Udacity 免费课程)](https://www.udacity.com/course/data-structures-and-algorithms-in-python--ud513):
- 一门以 Python 为中心的免费数据结构和算法课程。
- [数据结构和算法纳米学位!(Udacity 付费纳米
- [ ] [每日处理数百万请求的图像优化技术](http://highscalability.com/blog/2016/6/15/the-image-optimization-technology-that-serves-millions-of-re.html)
- [ ] [Patreon 架构简述](http://highscalability.com/blog/2016/2/1/a-patreon-architecture-short.html)
- [ ] [Tinder:最大的推荐引擎之一如何决定你下一个看到的人?](http://highscalability.com/blog/2016/1/27/tinder-how-does-one-of-the-largest-recommendation-engines-de.html)
- [ ] [现代缓存设计](http://highscalability.com/blog/2016/1/25/design-of-a-modern-cache.html)
- [ ] [Facebook 规模的实时视频流](http://highscalability.com/blog/2016/1/13/live-video-streaming-at-facebook-scale.html)
- [ ] [在 Amazon AWS 上扩展至 1100 万以上用户的初学者指南](http://highscalability.com/blog/2016/1/11/a-beginners-guide-to-scaling-to-11-million-users-on-amazons.html)
- [ ] [整个 Netflix 技术栈的 360 度全方位视角](http://highscalability.com/blog/2015/11/9/a-360-degree-view-of-the-entire-netflix-stack.html)
- [ ] [延迟无处不在且让你损失销售额 - 如何克服它](http://highscalability.com/latency-everywhere-and-it-costs-you-sales-how-crush-it)
- [ ] [支撑 Instagram 的力量:数百个实例,数十种技术](http://instagram-engineering.tumblr.com/post/13649370142/what-powers-instagram-hundreds-of-instances)
- [ ] [Salesforce 架构 - 他们如何每天处理 13 亿笔事务](http://highscalability.com/blog/2013/9/23/salesforce-architecture-how-they-handle-13-billion-transacti.html)
- [ ] [ESPN 的大规模架构 - 以每秒 100,000 次 "Duh Nuh Nuhs" 的规模运行](http://highscalability.com/blog/2013/11/4/espns-architecture-at-scale-operating-at-100000-duh-nuh-nuhs.html)
- [ ] 请参阅下方“消息传递、序列化和队列系统”部分,了解有关可以粘合服务的一些技术的信息
- [ ] Twitter:
- [O'Reilly MySQL CE 2011: Jeremy Cole, "@Twitter 的大数据与小数据" (视频)](https://www.youtube.com/watch?v=5cKTP36HVgI)
- [大规模时间线](https://www.infoq.com/presentations/Twitter-Timeline-Scalability)
- 了解更多内容,请查看[视频系列](#video-series)部分中的“挖掘海量数据集”视频系列
- [ ] 实践系统设计过程:这里有一些在纸上尝试演练的思路,每个都附带了一些现实世界中是如何处理的相关文档:
- 复习:[系统设计入门](https://github.com/donnemartin/system-design-primer)
- [HiredInTech 的系统设计](http://www.hiredintech.com/system-design/)
- [小抄](https://github.com/jwasham/coding-interview-university/blob/main/extras/cheat%20sheets/system-design.pdf)
- 流程:
1. 理解问题与范围:
- 在面试官的帮助下定义用例
- 提出额外的功能
- 删去面试官认为超出范围的项目
- 假设需要高可用性,并将其作为用例添加
2. 思考约束条件:
- 询问每月有多少请求
- 询问每秒有多少请求(他们可能会主动提供,或者让你自己计算)
- 估算读写百分比
- 在估算时牢记 80/20 法则
- 每秒写入多少数据
- 5 年内所需的总存储空间
- 每秒读取多少数据
3. 抽象设计:
- 层(服务、数据、缓存)
- 基础设施:负载均衡、消息传递
- 驱动服务的任何关键算法的粗略概述
- 考虑瓶颈并确定解决方案
- 练习:
- [设计一个随机唯一 ID 生成系统](https://blog.twitter.com/2010/announcing-snowflake)
- [设计一个键值数据库](http://www.slideshare.net/dvirsky/introduction-to-redis)
- [设计一个图片分享系统](http://highscalability.com/blog/2011/12/6/instagram-architecture-14-million-users-terabytes-of-photos.html)
- [设计一个推荐系统](http://ijcai13.org/files/tutorial_slides/td3.pdf)
- [设计一个短网址系统:复制自上文](http://www.hiredintech.com/system-design/the-system-design-process/)
- [设计一个缓存系统](https://web.archive.org/web/20220217064329/https://adayinthelifeof.nl/2011/02/06/memcache-internals/)
**[⬆ 回到顶部](#table-of-contents)**
## 附加学习
```
I added them to help you become a well-rounded software engineer and to be aware of certain
technologies and algorithms, so you'll have a bigger toolbox.
```
- 编译器
- [编译器如何在约 1 分钟内工作 (视频)](https://www.youtube.com/watch?v=IhC7sdYe-Jg)
- [哈佛 CS50 - 编译器 (视频)](https://www.youtube.com/watch?v=CSZLNYF4Klo)
- [C++ (视频)](https://www.youtube.com/watch?v=twodd1KFfGk)
- [理解编译器优化 (C++) (视频)](https://www.youtube.com/watch?v=FnGCDLhaxKU)
- Emacs 和 vi(m)
- 熟悉基于 UNIX 的代码编辑器
- vi(m):
- [使用 Vim 编辑 01 - 安装、设置和模式 (视频)](https://www.youtube.com/watch?v=5givLEMcINQ&index=1&list=PL13bz4SHGmRxlZVmWQ9DvXo1fEg4UdGkr)
- [VIM 冒险](http://vim-adventures.com/)
- 4 个视频的集合:
- [vi/vim 编辑器 - 第 1 课](https://www.youtube.com/watch?v=SI8TeVMX8pk)
- [vi/vim 编辑器 - 第 2 课](https://www.youtube.com/watch?v=F3OO7ZIOaJE)
- [vi/vim 编辑器 - 第 3 课](https://www.youtube.com/watch?v=ZYEccA_nMaI)
- [vi/vim 编辑器 - 第 4 课](https://www.youtube.com/watch?v=1lYD5gwgZIA)
- [使用 Vi 代替 Emacs](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#Using_Vi_instead_of_Emacs)
- emacs:
- [Emacs 基础教程 (视频)](https://www.youtube.com/watch?v=hbmV1bnQ-i0)
- 3 个 (视频) 的集合:
- [Emacs 教程 (初学者) -第 1 部分- 文件命令、剪切/复制/粘贴、光标命令](https://www.youtube.com/watch?v=ujODL7MD04Q)
- [Emacs 教程 (初学者) -第 2 部分- 缓冲区管理、搜索、M-x grep 和 rgrep 模式](https://www.youtube.com/watch?v=XWpsRupJ4II)
- [Emacs 教程 (初学者) -第 3 部分- 表达式、语句、~/.emacs 文件和包](https://www.youtube.com/watch?v=paSgzPso-yc)
- [Evil 模式:或者,我是如何学会停止担忧并爱上 Emacs 的 (视频)](https://www.youtube.com/watch?v=JWD1Fpdd4Pc)
- [使用 Emacs 编写 C 程序](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#Writing_C_programs_with_Emacs)
- [Emacs 绝对初学者指南 (David Wilson 的视频)](https://www.youtube.com/watch?v=48JlgiBpw_I&t=0s)
- [Emacs 绝对初学者指南 (David Wilson 的笔记)](https://systemcrafters.net/emacs-essentials/absolute-beginners-guide-to-emacs/)
- Unix/Linux 命令行工具
- 我从好用的工具中填满了下面的列表。
- bash
- cat
- grep
- sed
- awk
- curl 或 wget
- sort
- tr
- uniq
- [strace](https://en.wikipedia.org/wiki/Strace)
- [tcpdump](https://danielmiessler.com/study/tcpdump/)
- [基础 Linux 命令教程](https://labex.io/tutorials/practice-linux-commands-hands-on-labs-398420)
- DevOps
- [DevOps 路线图](https://roadmap.sh/devops)
- 信息论 (视频)
- [可汗学院](https://www.khanacademy.org/computing/computer-science/informationtheory)
- 更多关于马尔可夫过程的内容:
- [核心马尔可夫文本生成](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/waxgx/core-markov-text-generation)
- [核心实现马尔可夫文本生成](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/gZhiC/core-implementing-markov-text-generation)
- [项目 = 马尔可夫文本生成演练](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/EUjrq/project-markov-text-generation-walk-through)
- 请参阅下面的 MIT 6.050J 信息与熵系列了解更多
- 奇偶校验与汉明码 (视频)
- [简介](https://www.youtube.com/watch?v=q-3BctoUpHE)
- [奇偶校验](https://www.youtube.com/watch?v=DdMcAUlxh1M)
- 汉明码:
- [错误检测](https://www.youtube.com/watch?v=1A_NcXxdoCc)
- [错误纠正](https://www.youtube.com/watch?v=JAMLuxdHH8o)
- [错误检查](https://www.youtube.com/watch?v=wbH2VxzmoZk)
- 熵
- 另请参阅下面的视频
- 务必先观看信息论视频
- [信息论、Claude Shannon、熵、冗余、数据压缩与比特 (视频)](https://youtu.be/JnJq3Py0dyM?t=176)
- 密码学
- 另请参阅下面的视频
- 务必先观看信息论视频
- [可汗学院系列](https://www.khanacademy.org/computing/computer-science/cryptography)
- [密码学:哈希函数](https://www.youtube.com/watch?v=KqqOXndnvic&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=30)
- [密码学:加密](https://www.youtube.com/watch?v=9TNI2wHmaeI&index=31&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)
- 压缩
- 务必先观看信息论视频
- Computerphile (视频):
- [压缩](https://www.youtube.com/watch?v=Lto-ajuqW3w)
- [压缩中的熵](https://www.youtube.com/watch?v=M5c_RFKVkko)
- [倒置的树 (哈夫曼树)](https://www.youtube.com/watch?v=umTbivyJoiI)
- [附加比特/特里特 - 哈夫曼树](https://www.youtube.com/watch?v=DV8efuB3h2g)
- [优雅的文本压缩 (LZ 77 方法)](https://www.youtube.com/watch?v=goOa3DGezUA)
- [文本压缩遇上概率](https://www.youtube.com/watch?v=cCDCfoHTsaU)
- [Compressor Head 视频](https://www.youtube.com/playlist?list=PLOU2XLYxmsIJGErt5rrCqaSGTMyyqNt2H)
- [(可选) Google Developers Live:GZIP 还不够!](https://www.youtube.com/watch?v=whGwm0Lky2s)
- 计算机安全
- [MIT (23 个视频)](https://www.youtube.com/playlist?list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
- [简介,威胁模型](https://www.youtube.com/watch?v=GqmQg-cszw4&index=1&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
- [控制劫持攻击](https://www.youtube.com/watch?v=6bwzNg5qQ0o&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh&index=2)
- [缓冲区溢出漏洞与防御](https://www.youtube.com/watch?v=drQyrzRoRiA&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh&index=3)
- [权限分离](https://www.youtube.com/watch?v=6SIJmoE9L9g&index=4&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
- [能力](https://www.youtube.com/watch?v=8VqTSY-11F4&index=5&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
- [沙箱化原生代码](https://www.youtube.com/watch?v=VEV74hwASeU&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh&index=6)
- [Web 安全模型](https://www.youtube.com/watch?v=chkFBigodIw&index=7&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
- [保护 Web 应用程序](https://www.youtube.com/watch?v=EBQIGy1ROLY&index=8&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
- [符号执行](https://www.youtube.com/watch?v=yRVZPvHYHzw&index=9&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
- [网络安全](https://www.youtube.com/watch?v=SIEVvk3NVuk&index=11&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
- [网络协议](https://www.youtube.com/watch?v=QOtA76ga_fY&index=12&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
- [侧信道攻击](https://www.youtube.com/watch?v=PuVMkSEcPiI&index=15&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
- 垃圾回收
- [Python 中的 GC (视频)](https://www.youtube.com/watch?v=iHVs_HkjdmI)
- [深入 Java:垃圾回收很好!](https://www.infoq.com/presentations/garbage-collection-benefits)
- [深入 Python:CPython 中的垃圾回收 (视频)](https://www.youtube.com/watch?v=P-8Z0-MhdQs&list=PLdzf4Clw0VbOEWOS_sLhT_9zaiQDrS5AR&index=3)
- 并行编程
- [Coursera (Scala)](https://www.coursera.org/learn/parprog1/home/week/1)
- [用于高性能并行计算的高效 Python (视频)](https://www.youtube.com/watch?v=uY85GkaYzBk)
- 消息传递、序列化和队列系统
- [Thrift](https://thrift.apache.org/)
- [教程](http://thrift-tutorial.readthedocs.io/en/latest/intro.html)
- [Protocol Buffers](https://developers.google.com/protocol-buffers/)
- [教程](https://developers.google.com/protocol-buffers/docs/tutorials)
- [gRPC](http://www.grpc.io/)
- [面向 Java 开发者的 gRPC 101 (视频)](https://www.youtube.com/watch?v=5tmPvSe7xXQ&list=PLcTqM9n_dieN0k1nSeN36Z_ppKnvMJoly&index=1)
- [Redis](http://redis.io/)
- [教程](http://try.redis.io/)
- [Amazon SQS (队列)](https://aws.amazon.com/sqs/)
- [Amazon SNS (发布-订阅)](https://aws.amazon.com/sns/)
- [RabbitMQ](https://www.rabbitmq.com/)
- [入门](https://www.rabbitmq.com/getstarted.html)
- [Celery](http://www.celeryproject.org/)
- [Celery 的第一步](http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html)
- [ZeroMQ](http://zeromq.org/)
- [简介 - 阅读手册](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/)
- A*
- [A 搜索算法](https://en.wikipedia.org/wiki/A*_search_algorithm)
- [A* 寻路 (E01: 算法解释) (视频)](https://www.youtube.com/watch?v=-L-WgKMFuhE)
- 快速傅里叶变换
- [傅里叶变换的互动指南](https://betterexplained.com/articles/an-interactive-guide-to-the-fourier-transform/)
- [什么是傅里叶变换?它有什么用?](http://www.askamathematician.com/2012/09/q-what-is-a-fourier-transform-what-is-it-used-for/)
- [什么是傅里叶变换? (视频)](https://www.youtube.com/watch?v=Xxut2PN-V8Q)
- [分治法:FFT (视频)](https://www.youtube.com/watch?v=iTMn0Kt18tg&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=4)
- [理解 FFT](http://jakevdp.github.io/blog/2013/08/28/understanding-the-fft/)
- 布隆过滤器
- 给定一个具有 m 个比特和 k 个哈希函数的布隆过滤器,插入和成员测试的时间复杂度均为 O(k)
- [布隆过滤器 (视频)](https://www.youtube.com/watch?v=-SuTGoFYjZs)
- [布隆过滤器 | 挖掘海量数据集 | 斯坦福大学 (视频)](https://www.youtube.com/watch?v=qBTdukbzc78)
- [教程](http://billmill.org/bloomfilter-tutorial/)
- [如何编写布隆过滤器应用程序](http://blog.michaelschmatz.com/2016/04/11/how-to-write-a-bloom-filter-cpp/)
- HyperLogLog
- [如何仅用 1.5KB 内存计算十亿个不同的对象](http://highscalability.com/blog/2012/4/5/big-data-counting-how-to-count-a-billion-distinct-objects-us.html)
- 局部敏感哈希
- 用于确定文档的相似性
- 与 MD5 或 SHA 相反,后者用于确定 2 个文档/字符串是否完全相同
- [Simhashing (希望) 变得简单](http://ferd.ca/simhashing-hopefully-made-simple.html)
- van Emde Boas 树
- [分治法:van Emde Boas 树 (视频)](https://www.youtube.com/watch?v=hmReJCupbNU&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=6)
- [MIT 课程笔记](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)
- 增强数据结构
- [CS 61B 第 39 课:增强数据结构](https://archive.org/details/ucberkeley_webcast_zksIj9O8_jc)
- 平衡搜索树
- 至少了解一种类型的平衡二叉树(并知道它是如何实现的):
- "在平衡搜索树中,AVL 和 2/3 树现在已经过时,红黑树似乎更受欢迎。
一种特别有趣的自组织数据结构是伸展树,它使用旋转
将任何被访问的键移到根节点。" - 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)
- [[复习] 19 分钟 AVL 树 (播放列表) (视频)](https://www.youtube.com/playlist?list=PL9xmBV_5YoZOUFgdIeOPuH6cfSnNRMau-)
- **伸展树**
- 在实践中:
伸展树通常用于实现缓存、内存分配器、路由器、垃圾回收器、
数据压缩、绳索(用于长文本字符串的字符串替代品)、Windows NT(在虚拟内存、
网络和文件系统代码中)等
- [CS 61B:伸展树 (视频)](https://archive.org/details/ucberkeley_webcast_G5QIXywcJlY)
- MIT 课程:伸展树:
- 数学性很强,但一定要看最后 10 分钟。
- [视频](https://www.youtube.com/watch?v=QnPl_Y6EqMo)
- **红/黑树**
- 这些是 2-3 树(见下文)的转换。
- 在实践中:
红黑树为插入时间、删除时间和搜索时间提供了最坏情况下的保证。
这不仅使它们在时间敏感的应用程序(如实时应用程序)中非常有价值,
而且使它们成为提供最坏情况保证的其他数据结构中的重要构建块;
例如,许多用于计算几何的数据结构可以基于红黑树,并且
当前 Linux 内核中使用的完全公平调度器使用了红黑树。在 Java 8 版本中,
集合 HashMap 已被修改,不再使用 LinkedList 来存储具有糟糕哈希码的相同元素,
而是使用红黑树
- [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)
- [红黑树](https://en.wikipedia.org/wiki/Red%E2%80%93black_tree)
- [二分搜索与红黑树简介](https://www.topcoder.com/thrive/articles/An%20Introduction%20to%20Binary%20Search%20and%20Red-Black%20Trees)
- [[复习] 30 分钟红黑树 (播放列表) (视频)](https://www.youtube.com/playlist?list=PL9xmBV_5YoZNqDI8qfOZgzbqahCUmUEin)
- **2-3 搜索树**
- 在实践中:
2-3 树具有更快的插入速度,但代价是较慢的搜索速度(因为高度比 AVL 树更高)。
- 你会很少使用 2-3 树,因为它的实现涉及不同类型的节点。相反,人们使用红黑树。
- [23 树的直觉与定义 (视频)](https://www.youtube.com/watch?v=C3SsdUqasD4&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6&index=2)
- [23 树的二叉视图](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 树成为
理解红黑树背后逻辑的重要工具,这就是为什么许多 introductory algorithm texts 会在介绍
红黑树之前先介绍 2-4 树,尽管 **2-4 树在实践中并不常用**。
- [CS 61B 第 26 课:平衡搜索树 (视频)](https://archive.org/details/ucberkeley_webcast_zqrqYXkth6Q)
- [自底向上 234 树 (视频)](https://www.youtube.com/watch?v=DQdMYevEyE4&index=4&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6)
- [自顶向下 234 树 (视频)](https://www.youtube.com/watch?v=2679VQ26Fp4&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6&index=5)
- **N 叉 (K 叉, M 叉) 树**
- 注意:N 或 K 是分支因子(最大分支数)
- 二叉树是 2 叉树,分支因子 = 2
- 2-3 树是 3 叉树
- [K 叉树](https://en.wikipedia.org/wiki/K-ary_tree)
- **B 树**
- 有趣的事实:这是个谜,但 B 可能代表 Boeing(波音)、Balanced(平衡)或 Bayer(发明者之一)。
- 在实践中:
B 树被广泛用于数据库。大多数现代文件系统使用 B 树(或其变体)。除了
在数据库中的用途外,B 树还用于文件系统中,以允许快速随机访问特定
文件中的任意块。基本问题是将文件块地址转换为磁盘块
(或可能转换为柱面磁头扇区)地址
- [B 树](https://en.wikipedia.org/wiki/B-tree)
- [B 树数据结构](http://btechsmartclass.com/data_structures/b-trees.html)
- [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 - 内存层次结构模型 (视频)](https://www.youtube.com/watch?v=V3omVLzI0WE&index=7&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf)
- 涵盖了缓存无感知 B 树,非常有趣的数据结构
- 前 37 分钟非常技术性,可以跳过 (B 是块大小,缓存行大小)
- [[复习] 26 分钟 B 树 (播放列表) (视频)](https://www.youtube.com/playlist?list=PL9xmBV_5YoZNFPPv98DjTdD9X6UI9KMHz)
- k-D 树
- 非常适合在矩形或更高维对象中查找多个点
- 非常适合 k 近邻
- [kNN K-d 树算法 (视频)](https://www.youtube.com/watch?v=Y4ZgLlDfKDg)
- 跳表
- "这些多少有点像邪教数据结构" - Skiena
- [随机化:跳表 (视频)](https://www.youtube.com/watch?v=2g9OSRKJuzM&index=10&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)
- [获取动画和更多细节](https://en.wikipedia.org/wiki/Skip_list)
- 网络流
- [5 分钟了解 Ford-Fulkerson — 逐步示例 (视频)](https://www.youtube.com/watch?v=Tl90tNtKvxs)
- [Ford-Fulkerson 算法 (视频)](https://www.youtube.com/watch?v=v1VgJmkEJW0)
- [网络流 (视频)](https://www.youtube.com/watch?v=2vhN4Ice5jI)
- 不相交集 & 并查集
- [UCB 61B - 不相交集;排序与选择 (视频)](https://archive.org/details/ucberkeley_webcast_MAEGXTwmUsI)
- [Sedgewick 算法 - 并查集 (6 个视频)](https://www.coursera.org/learn/algorithms-part1/home/week/1)
- 快速处理的数学
- [整数算术,Karatsuba 乘法 (视频)](https://www.youtube.com/watch?v=eCaXlAaN2uE&index=11&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
- [中国剩余定理 (用于密码学) (视频)](https://www.youtube.com/watch?v=ru7mWZJlRQg)
- 树堆
- 二叉搜索树和堆的结合
- [树堆](https://en.wikipedia.org/wiki/Treap)
- [数据结构:树堆讲解 (视频)](https://www.youtube.com/watch?v=6podLUYinH8)
- [在集合操作中的应用](https://www.cs.cmu.edu/~scandal/papers/treaps-spaa98.pdf)
- 线性规划 (视频)
- [线性规划](https://www.youtube.com/watch?v=M4K6HYLHREQ)
- [寻找最小成本](https://www.youtube.com/watch?v=2ACJ9ewUC6U)
- [寻找最大值](https://www.youtube.com/watch?v=8AA_81xI3ik)
- [用 Python 解线性方程 - 单纯形算法](https://www.youtube.com/watch?v=44pAWI7v5Zk)
- 几何,凸包 (视频)
- [图算法 IV:几何算法简介 - 第 9 课](https://youtu.be/XIAQRlNkJAw?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=3164)
- [几何算法:Graham & Jarvis - 第 10 课](https://www.youtube.com/watch?v=J5aJEcOr6Eo&index=10&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
- [分治法:凸包,中位数查找](https://www.youtube.com/watch?v=EzeYI7p9MjU&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=2)
- 离散数学
- [计算机科学 70, 001 - 2015 年春季 - 离散数学与概率论](http://www.infocobuild.com/education/audio-video-courses/computer-science/cs70-spring2015-berkeley.html)
- [Shai Simonson 的离散数学 (19 个视频)](https://www.youtube.com/playlist?list=PLWX710qNZo_sNlSWRMVIh6kfTjolNaZ8t)
- [IIT Ropar NPTEL 离散数学](https://nptel.ac.in/courses/106/106/106106183/)
**[⬆ 回到顶部](#table-of-contents)**
## 某些主题的更多细节
```
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?
```
- **SOLID**
- [ ] [Bob Martin 面向对象与敏捷设计的 SOLID 原则 (视频)](https://www.youtube.com/watch?v=TMuno5RZNeE)
- [ ] S - [单一职责原则](http://www.oodesign.com/single-responsibility-principle.html) | [每个对象的单一职责](http://www.javacodegeeks.com/2011/11/solid-single-responsibility-principle.html)
- [更多风味](https://docs.google.com/open?id=0ByOwmqah_nuGNHEtcU5OekdDMkk)
- [ ] O - [开闭原则](http://www.oodesign.com/open-close-principle.html) | [在生产级别,对象已准备好进行扩展但不允许修改](https://en.wikipedia.org/wiki/Open/closed_principle)
- [更多风味](http://docs.google.com/a/cleancoder.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BwhCYaYDn8EgN2M5MTkwM2EtNWFkZC00ZTI3LWFjZTUtNTFhZGZiYmUzODc1&hl=en)
- [ ] L - [里氏替换原则](http://www.oodesign.com/liskov-s-substitution-principle.html) | [基类和派生类遵循 ‘IS A’ 原则](http://stackoverflow.com/questions/56860/what-is-the-liskov-substitution-principle)
- [更多风味](http://docs.google.com/a/cleancoder.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BwhCYaYDn8EgNzAzZjA5ZmItNjU3NS00MzQ5LTkwYjMtMDJhNDU5ZTM0MTlh&hl=en)
- [ ] I - [接口隔离原则](http://www.oodesign.com/interface-segregation-principle.html) | 客户端不应被强迫实现他们不使用的接口
- [5 分钟了解接口隔离原则 (视频)](https://www.youtube.com/watch?v=3CtAfl7aXAQ)
- [更多风味](http://docs.google.com/a/cleancoder.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BwhCYaYDn8EgOTViYjJhYzMtMzYxMC00MzFjLWJjMzYtOGJiMDc5N2JkYmJi&hl=en)
- [ ] D -[依赖倒置原则](http://www.oodesign.com/dependency-inversion-principle.html) | 减少对象组合中的依赖性。
- [为什么依赖倒置原则很重要](http://stackoverflow.com/questions/62539/what-is-the-dependency-inversion-principle-and-why-is-it-important)
- [更多风味](http://docs.google.com/a/cleancoder.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BwhCYaYDn8EgMjdlMWIzNGUtZTQ0NC00ZjQ5LTkwYzQtZjRhMDRlNTQ3ZGMz&hl=en)
- **Union-Find**
- [概述](https://www.coursera.org/learn/data-structures/lecture/JssSY/overview)
- [朴素实现](https://www.coursera.org/learn/data-structures/lecture/EM5D0/naive-implementations)
- [树](https://www.coursera.org/learn/data-structures/lecture/Mxu0w/trees)
- [按秩合并](https://www.coursera.org/learn/data-structures/lecture/qb4c2/union-by-rank)
- [路径压缩](https://www.coursera.org/learn/data-structures/lecture/Q9CVI/path-compression)
- [分析选项](https://www.coursera.org/learn/data-structures/lecture/GQQLN/analysis-optional)
- **更多动态规划** (视频)
- [6.006: 动态规划 I:斐波那契,最短路径](https://www.youtube.com/watch?v=r4-cftqTcdI&ab_channel=MITOpenCourseWare)
- [6.006: 动态规划 II:文本对齐,21点](https://www.youtube.com/watch?v=KLBCUx1is2c&ab_channel=MITOpenCourseWare)
- [6.006: 动态规划 III:括号化,编辑距离,背包问题](https://www.youtube.com/watch?v=TDo3r5M1LNo&ab_channel=MITOpenCourseWare)
- [6.006: 动态规划 IV:吉他指法,俄罗斯方块,超级马里奥](https://www.youtube.com/watch?v=i9OAOk0CUQE&ab_channel=MITOpenCourseWare)
- [6.046: 动态规划 & 高级 DP](https://www.youtube.com/watch?v=Tw1k46ywN6E&index=14&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)
- [6.046: 动态规划:所有节点对的最短路径](https://www.youtube.com/watch?v=NzgFUwOaoIw&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=15)
- [6.046: 动态规划 (学生背诵)](https://www.youtube.com/watch?v=krZI60lKPek&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=12)
- **高级图处理** (视频)
- [同步分布式算法:对称性破缺。最短路径生成树](https://www.youtube.com/watch?v=mUBmcbbJNf4&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=27)
- [异步分布式算法:最短路径生成树](https://www.youtube.com/watch?v=kQ-UQAzcnzA&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=28)
- MIT **概率论** (充满数学,而且讲得很慢,这对数学内容来说很好) (视频):
- [MIT 6.042J - 概率论简介](https://www.youtube.com/watch?v=SmFwFdESMHI&index=18&list=PLB7540DEDD482705B)
- [MIT 6.042J - 条件概率](https://www.youtube.com/watch?v=E6FbvM-FGZ8&index=19&list=PLB7540DEDD482705B)
- [MIT 6.042J - 独立性](https://www.youtube.com/watch?v=l1BCv3qqW4A&index=20&list=PLB7540DEDD482705B)
- [MIT 6.042J - 随机变量](https://www.youtube.com/watch?v=MOfhhFaQdjw&list=PLB7540DEDD482705B&index=21)
- [MIT 6.042J - 期望 I](https://www.youtube.com/watch?v=gGlMSe7uEkA&index=22&list=PLB7540DEDD482705B)
- [MIT 6.042J - 期望 II](https://www.youtube.com/watch?v=oI9fMUqgfxY&index=23&list=PLB7540DEDD482705B)
- [MIT 6.042J - 大偏差](https://www.youtube.com/watch?v=q4mwO2qS2z4&index=24&list=PLB7540DEDD482705B)
- [MIT 6.042J - 随机游走](https://www.youtube.com/watch?v=56iFMY8QW2k&list=PLB7540DEDD482705B&index=25)
- [Simonson:近似算法 (视频)](https://www.youtube.com/watch?v=oDniZCmNmNw&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=19)
- **字符串匹配**
- Rabin-Karp (视频):
- [Rabin Karps 算法](https://www.coursera.org/lecture/data-structures/rabin-karps-algorithm-c0Qkw)
- [预计算](https://www.coursera.org/learn/data-structures/lecture/nYrc8/optimization-precomputation)
- [优化:实现与分析](https://www.coursera.org/learn/data-structures/lecture/h4ZLc/optimization-implementation-and-analysis)
- [表倍增,Karp-Rabin](https://www.youtube.com/watch?v=BRO7mVIFt08&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=9)
- [滚动哈希,平摊分析](https://www.youtube.com/watch?v=w6nuXg0BISo&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=32)
- Knuth-Morris-Pratt (KMP:
- [Knuth-Morris-Pratt (KMP) 字符串匹配算法](https://www.youtube.com/watch?v=5i7oKodCRJo)
- Boyer–Moore 字符串搜索算法
- [Boyer-Moore 字符串搜索算法](https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm)
- [高级字符串搜索 Boyer-Moore-Horspool 算法 (视频)](https://www.youtube.com/watch?v=QDZpzctPf10)
- [Coursera:字符串算法](https://www.coursera.org/learn/algorithms-on-strings/home/week/1)
- 开头很好,但过了 KMP 之后,它就变得比需要的更复杂了
- 对 tries 的很好解释
- 可以跳过
- **排序**
- 斯坦福排序课程:
- [第 15 课 | 编程抽象 (视频)](https://www.youtube.com/watch?v=ENp00xylP7c&index=15&list=PLFE6E58F856038C69)
- [第 16 课 | 编程抽象 (视频)](https://www.youtube.com/watch?v=y4M9IVgrVKo&index=16&list=PLFE6E58F856038C69)
- Shai Simonson:
- [算法 - 排序 - 第 2 课 (视频)](https://www.youtube.com/watch?v=odNJmw5TOEE&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=2)
- [算法 - 排序 II - 第 3 课 (视频)](https://www.youtube.com/watch?v=hj8YKFTFKEE&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=3)
- Steven Skiena 排序课程:
- [CSE373 2020 - 归并排序/快速排序 (视频)](https://www.youtube.com/watch?v=jUf-UQ3a0kg&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=8)
- [CSE373 2020 - 线性排序 (视频)](https://www.youtube.com/watch?v=0ksyQKmre84&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=9)
- NAND To Tetris:[从第一性原理构建现代计算机](https://www.coursera.org/learn/build-a-computer)
**[⬆ 回到顶部](#table-of-contents)**
## 视频系列
坐下来好好享受吧。
- [单个动态规划问题列表 (每个都很短)](https://www.youtube.com/playlist?list=PLrmLmBdmIlpsHaNTPP_jHHDx_os9ItYXr)
- [x86 架构,汇编,应用程序 (11 个视频)](https://www.youtube.com/playlist?list=PL038BE01D3BAEFDB0)
- [MIT 18.06 线性代数,2005 年春季 (35 个视频)](https://www.youtube.com/playlist?list=PLE7DDD91010BC51F8)
- [极好 - MIT 微积分重访:单变量微积分](https://www.youtube.com/playlist?list=PL3B08AE665AB9002A)
- [《算法设计手册》中的 Skiena 课程 - CSE373 2020 - 算法分析 (26 个视频)](https://www.youtube.com/watch?v=22hwcnXIGgk&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=1)
- [UC Berkeley 61B (2014 年春季):数据结构 (25 个视频)](https://archive.org/details/ucberkeley-webcast-PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd)
- [UC Berkeley 61B (2006 年秋季):数据结构 (39 个视频)](https://archive.org/details/ucberkeley-webcast-PL4BBB74C7D2A1049C)
- [UC Berkeley 61C:机器结构 (26 个视频)](https://archive.org/details/ucberkeley-webcast-PL-XXv-cvA_iCl2-D-FS5mk0jFF6cYSJs_)
- [OOSE:使用 UML 和 Java 的软件开发 (21 个视频)](https://www.youtube.com/playlist?list=PLJ9pm_Rc9HesnkwKlal_buSIHA-jTZMpO)
- [MIT 6.004:计算结构 (49 个视频)](https://www.youtube.com/playlist?list=PLDSlqjcPpoL64CJdF0Qee5oWqGS6we_Yu)
- [卡内基梅隆大学 - 计算机体系结构课程 (39 个视频)](https://www.youtube.com/playlist?list=PL5PHm2jkkXmi5CxxI7b3JCL1TWybTDtKq)
- [MIT 6.006:算法导论 (47 个视频)](https://www.youtube.com/watch?v=HtSuA80QTyo&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&nohtml5=False)
- [MIT 6.033:计算机系统工程 (22 个视频)](https://www.youtube.com/watch?v=zm2VP0kHl1M&list=PL6535748F59DCA484)
- [MIT 6.034 人工智能,2010 年秋季 (30 个视频)](https://www.youtube.com/playlist?list=PLUl4u3cNGP63gFHB6xb-kVBiQHYe_4hSi)
- [MIT 6.042J:计算机科学数学,2010 年秋季 (25 个视频)](https://www.youtube.com/watch?v=L3LMbpZIKhQ&list=PLB7540DEDD482705B)
- [MIT 6.046:算法设计与分析 (34 个视频)](https://www.youtube.com/watch?v=2P-yW7LQr08&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)
- [MIT 6.824:分布式系统,2020 年春季 (20 个视频)](https://www.youtube.com/watch?v=cQP8WApzIQQ&list=PLrw6a1wE39_tb2fErI4-WkMbsvGQk9_UB)
- [MIT 6.851:高级数据结构 (22 个视频)](https://www.youtube.com/watch?v=T0yzrZL1py0&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf&index=1)
- [MIT 6.854:高级算法,2016 年春季 (24 个视频)](https://www.youtube.com/playlist?list=PL6ogFv-ieghdoGKGg2Bik3Gl1glBTEu8c)
- [哈佛 COMPSCI 224:高级算法 (25 个视频)](https://www.youtube.com/playlist?list=PL2SOU6wwxB0uP4rJgf5ayhHWgw7akUWSf)
- [MIT 6.858 计算机系统安全,2014 年秋季](https://www.youtube.com/watch?v=GqmQg-cszw4&index=1&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh)
- [斯坦福:编程范式 (27 个视频)](https://www.youtube.com/playlist?list=PL9D558D49CA734A02)
- [Christof Paar 的密码学简介](https://www.youtube.com/playlist?list=PL6N5qY2nvvJE8X75VkXglSrVhLv1tVcfy)
- [课程网站以及幻灯片和问题集](http://www.crypto-textbook.com/)
- [挖掘海量数据集 - 斯坦福大学 (94 个视频)](https://www.youtube.com/playlist?list=PLLssT5z_DsK9JDLcT8T62VtzwyW9LNepV)
- [Sarada Herke 的图论 (67 个视频)](https://www.youtube.com/user/DrSaradaHerke/playlists?shelf_id=5&view=50&sort=dd)
**[⬆ 回到顶部](#table-of-contents)**
## 计算机科学课程
- [在线 CS 课程目录](https://github.com/open-source-society/computer-science)
- [CS 课程目录 (许多包含在线讲座)](https://github.com/prakhar1989/awesome-courses)
**[⬆ 回到顶部](#table-of-contents)**
## 算法实现
- [普林斯顿大学的多算法实现](https://algs4.cs.princeton.edu/code)
**[⬆ 回到顶部](#table-of-contents)**
## 论文
- [喜欢经典论文?](https://www.cs.cmu.edu/~crary/819-f09/)
- [1978: 通信顺序进程](http://spinroot.com/courses/summer/Papers/hoare_1978.pdf)
- [在 Go 中实现](https://godoc.org/github.com/thomas11/csp)
- [2003: Google 文件系统](http://static.googleusercontent.com/media/research.google.com/en//archive/gfs-sosp2003.pdf)
- 在 2012 年被 Colossus 取代
- [2004: MapReduce: 大型集群上的简化数据处理]( http://static.googleusercontent.com/media/research.google.com/en//archive/mapreduce-osdi04.pdf)
- 大部分被 Cloud Dataflow 取代了?
- [2006: Bigtable: 面向结构化数据的分布式存储系统](https://static.googleusercontent.com/media/research.google.com/en//archive/bigtable-osdi06.pdf)
- [2006: 面向松耦合分布式系统的 Chubby 锁服务](https://research.google.com/archive/chubby-osdi06.pdf)
- [2007: Dynamo: Amazon 的高可用键值存储](http://s3.amazonaws.com/AllThingsDistributed/sosp/amazon-dynamo-sosp2007.pdf)
- Dynamo 论文引发了 NoSQL 革命
- [2007: 每个程序员都应该知道的关于内存的知识 (非常长,作者鼓励跳过某些章节)](https://www.akkadia.org/drepper/cpumemory.pdf)
- 2012: AddressSanitizer: 快速地址健全性检查器:
- [论文](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/37752.pdf)
- [视频](https://www.usenix.org/conference/atc12/technical-sessions/presentation/serebryany)
- 2013: Spanner: Google 的全球分布式数据库:
- [论文](http://static.googleusercontent.com/media/research.google.com/en//archive/spanner-osdi2012.pdf)
- [视频](https://www.usenix.org/node/170855)
- [2015: Google 的持续流水线](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43790.pdf)
- [2015: 大规模的高可用性:构建 Google 的广告数据基础设施](https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/44686.pdf)
- [2015: 开发人员如何搜索代码:案例研究](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43835.pdf)
- 更多论文:[1,000 篇论文](https://github.com/0voice/computer_expert_paper)
**[⬆ 回到顶部](#table-of-contents)**
## 许可证
[CC-BY-SA-4.0](./LICENSE.txt)
翻译版本:
- [Bahasa Indonesia](translations/README-id.md) - [Bulgarian](translations/README-bg.md) - [Español](translations/README-es.md) - [German](translations/README-de.md) - [Japanese (日本語)](translations/README-ja.md) - [Marathi](translations/README-mr.md) - [Polish](translations/README-pl.md) - [Português Brasileiro](translations/README-ptbr.md) - [Russian](translations/README-ru.md) - [Tiếng Việt - Vietnamese](translations/README-vi.md) - [Urdu - اردو](translations/README-ur.md) - [Uzbek](translations/README-uz.md) - [বাংলা - Bangla](translations/README-bn.md) - [ខ្មែរ - Khmer](translations/README-kh.md) - [简体中文](translations/README-cn.md) - [繁體中文](translations/README-tw.md)翻译正在进行中:
- [Afrikaans](https://github.com/jwasham/coding-interview-university/issues/1164) - [Arabic](https://github.com/jwasham/coding-interview-university/issues/98) - [French](https://github.com/jwasham/coding-interview-university/issues/89) - [Greek](https://github.com/jwasham/coding-interview-university/issues/166) - [Italian](https://github.com/jwasham/coding-interview-university/issues/1030) - [Korean(한국어)](https://github.com/jwasham/coding-interview-university/issues/118) - [Malayalam](https://github.com/jwasham/coding-interview-university/issues/239) - [Persian - Farsi](https://github.com/jwasham/coding-interview-university/issues/186) - [Telugu](https://github.com/jwasham/coding-interview-university/issues/117) - [Thai](https://github.com/jwasham/coding-interview-university/issues/156) - [Turkish](https://github.com/jwasham/coding-interview-university/issues/90) - [Українська](https://github.com/jwasham/coding-interview-university/issues/106) - [עברית](https://github.com/jwasham/coding-interview-university/issues/82) - [हिन्दी](https://github.com/jwasham/coding-interview-university/issues/81)标签:CS基础知识, DNS解析, FAANG, JS文件枚举, 刷题, 学习计划, 学习路线, 开发手册, 开源项目, 数据结构, 求职指南, 算法, 编程学习, 编程面试, 自学编程, 计算机科学, 软件工程师, 逆向工具, 面试准备