(一)算法与数据结构学习路径
1. 初阶
顺序 | 资源 | 知识分类/使用方法 | 链接和介绍 |
1 | 《大话数据结构》 | 【入门】 数据结构入门 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAg6cWHuwYo1f6a6AE.pdf 【大O、线性表、栈、队列、串、二叉树、图、查找、排序】 非常适合初学者的读物。通篇以一种趣味方式来叙述,大量引用了各种各样的生活知识来类比,并充分运用图形语言来体现抽象内容,对数据结构所涉及到的一些经典算法做到逐行分析、多算法比较。 |
2 | 《算法图解》 | 【入门】 算法入门 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAg6sWHuwYogMnp5gM.pdf 【大O、排序、递归、散列表、图、贪心、动态规划、KNN】 书中的前三章将帮助你打下基础,带你学习二分查找、大 O 表示法、两种基本的数据结构以及递归等。 余下的篇幅将主要介绍应用广泛的算法,具体内容包括:面对具体问题时的解决技巧,比如,何时采用贪婪算法或动态规划;散列表的应用;图算法;Kzui 近邻算法。 |
3 | 《算法第四版》 | 【理论】 与2互补看 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAg68WHuwYovvT-3AI.pdf 【队列、栈、排序、查找、图、字符串】 这本书虽然较为通俗易懂,也强烈推荐其中红黑树、单词查找树、字符串算法的部分,KMP有限自动状态机最好也要留意,但是有相当一些重要的算法思想并未多加涉及(如回溯、滑动窗口、动态规划、贪心)。 |
4 | 数据结构与算法基础(青岛大学王卓老师的入门课) | 【理论】 这几个视频互补着看,排名越高的推荐人数越多 | 基础数据结构 https://www.bilibili.com/video/BV1nJ411V7bd/?p=1 【复杂度表示、线性表、链表、栈、队列、数组、二叉树、图、排序】 这门课针对的是算法的学习,对代码实现的要求不高,一些比较难的算法怎么实现代码老师没有讲(kmp算法,最小生成树,最短路径等等细节) |
4’ | 浙江大学 数据结构课 B站 (陈越、何钦铭) | 【理论】 这几个视频互补着看,排名越高的推荐人数越多 | https://www.bilibili.com/video/BV1Kb41127fT 课件与作业:https://github.com/CYBruce/DataStructure_Algorithm_ZJU 【堆、栈、二叉树、堆、图、递归、排序、KMP】 B站很多小伙伴都管陈越老师叫做陈越姥姥,陈姥姥的课简单易懂,二叉树和链表说的多,但是对于图太少,后面概念解释多程序少,对于新手不友好。 |
4’ | 数据结构(郝斌) | 【理论】 这几个视频互补着看,排名越高的推荐人数越多 | https://www.bilibili.com/video/BV11s41167h6/?p=1&vd_source=46837cab4ae2c4134d82b0c5db24e10f 【链表、栈、队列、递归、二叉树】 |
4’ | 数据结构与算法(北京大学) | 【理论】 这几个视频互补着看,排名越高的推荐人数越多 | https://www.icourse163.org/course/PKU-1002534001#/info 【线性表、栈、队列、字符串、二叉树、图、排序】 |
5 | 刷题 | 【实战】 刷50道以上的基础题 | Leetcode 算法小白的 LeetCode 刷题顺序:https://zhuanlan.zhihu.com/p/407414826 牛客网 https://www.nowcoder.com/exam/oj?page=1&tab=SQL%E7%AF%87&topicId=199&fromPut=pc_kol_wenqlgd labuladong 的算法小抄 https://github.com/labuladong/fucking-algorithm |
6 | 可视化工具/网站 | 辅助学习的工具 | 笑笑的计算之心: https://space.bilibili.com/507554252 VisuAlgo: Data Structure Visualizations: https://www.cs.usfca.edu/~galles/visualization/Algorithms.html |
【竞赛专区】如果要准备竞赛,继续看下面的。 | |||
6 | 刷水题 | 【竞赛】 刷100道以上的水题 | 把HDU POJ的水题都刷一遍 HDU:acm.hdu.edu.cn/ POJ:http://poj.org/ |
顺序 | 资源 | 知识分类/使用方法 | 链接和介绍 |
1 | 《算法导论》 | 【理论】 经典必看 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAg68WHuwYo_M-08gM.pdf 算法届圣经,重数学和推理,但是有高中数学水平就可以看 |
2 | 《数据结构与算法分析——C语言描述》 《数据结构与算法分析——Java语言描述》 | 【代码】 二选一。这本用的是真正的代码,看过对implementation很有帮助 | C语言版: https://32931414.s21i.faiusr.com/61/ABUIABA9GAAg68WHuwYo3c-_yQE.pdf Java语言版: https://32931414.s21i.faiusr.com/61/ABUIABA9GAAg7cWHuwYovL79xQU.pdf里面使用的代码,不是所谓的伪代码,而是正经可以运行的C代码,所以新人如果能照着做一遍下来,收获应该不小. |
3 | 《编程珠玑》 | 【理论】 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAg6cWHuwYoidGakAI.pdf 学习算法不仅需要像Alogrithms,算法导论这样的重量级的内功心法,像《编程之美》、《编程珠玑》这样的轻量级的轻功身法也必不可少。前些年网上不是很流行像“给你10亿个数,找到最大的n个”或者“给你10亿个数,找出现次数最多的那个数”之类的百度面试题吗?看了此书你就知道怎么解决了。相比于《编程之美》来说,本书中的示例技巧性略低一些,但是也更有实际应用价值一些。 |
4 | 《编程之美-微软技术面试心得》 | 【面试】 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAg6sWHuwYoqsnuKA.pdf 《编程之美》这本书有多位作者,其中绝大部分是微软的工程师,所以书的质量很有保证。不过,这里面的算法题目稍微有点难,也不是很系统,这也是我把它归到面试这一部分的原因。 虽说是一本面试书,但如果把前面十几页扯掉的话,我更愿意把它看作是一本讲解题思维的算法小品。在书中,作者通常是给出一个平常解法,然后再一次又一次的优化改进,你可以很清楚的看到基本的算法设计思想是如何得到运用以解决实际问题的。 |
【竞赛专区】如果要准备竞赛,继续看下面的。 这个阶段Focus在基础算法和数据结构: 队列 栈 树 图 并查集 堆 DFS BFS 最短路 最小生成树 拓扑排序 动态规划 贪心 搜索 KMP 哈希 Trie AC自动机 快速幂 逆元 费马小定理 欧拉函数 素数筛 分解质因数 | |||
5 | (Optional) 《c++ primer plus》 | 【竞赛】【语言】 熟悉C++语法(C和STL) | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAg6cWHuwYohI_KlwE.pdf |
6 | 《算法竞赛入门经典》(紫书)刘汝佳 | 【竞赛】 竞赛经典中的经典,推荐的人最多的书籍。还是有难度的。 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAg6cWHuwYojdn1rAc.pdf 我记得之前有见过刘汝佳的《算法竞赛入门经典》,内容充实,由浅入深。里面的算法都需要你逐一实现一下。题目大部分出自ACM与OI竞赛,因此读这本书的最佳阅读方式就是自己做过每一道题。《入门经典》并不会拘泥于某个算法或数据结构(比如线段树、KMP)究竟如何实现,而是将关注点集中在建模与思考的过程,它已经远远跳出了“术”的层面,将重点拔高到“略”的高度。它并不够入门,学习曲线陡峭,而且篇幅并不是非常详略得当。 |
6’ | 《挑战程序设计竞赛》(蓝书) | 【竞赛】 平替 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAg6sWHuwYoiLPujwc.pdf 《挑战》这本书分为例题和习题,大量的题来自 POJ,也有 AOJ, GCJ 上的题目。少量的例题是没有 OJ 可以提交的,只能看书。 == 推荐另一本《挑战程序竞赛》,并非紫书不好,只是读起来太费劲,而且有些章节也没安排好。 紫书买了半年没看懂几个算法,挑战买回来一个月知道了模板的弱鸡参上。 |
7 | 《算法竞赛入门经典训练指南》 | 【竞赛】 这本书比紫书要深,在紫书后面读 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAg6cWHuwYosdyTUA.pdf 这本书比紫书要深,在紫书后面读 |
8 | 刷题 | 【竞赛】
| 【推荐比较多的Online Judge平台】 洛谷: 北京大学POJ:英文题目较多,有部分中文,但质量较高 Codeforces:CF 最吸引人的地方在于它那超级牛批的比赛系统,CF 上每个用户都拥有 Rating,也就是比赛积分。上面的比赛一般分为四种:Div1、Div2、Div3、Educational Codeforces Round。Div 的比赛一般是根据积分来的,每个积分段只能参加对应的 Div 的比赛,Div1的比赛是里面最难的,大佬基本都在这里。Educational Codeforces Round 则是类似 ACM 的比赛,提交之后立马出结果。 但是如果仅限这些也算不上超级,还有一个更有意思的是,CF 的比赛还提供一个 hack 功能,通俗点说就是你去看别人提交的代码,然后通过提交你想出的特殊测试用例然后找出别人代码的 bug,hack 成功则加积分,比赛更多了很多乐趣。一周一次的常规赛能很好得锻炼临场发挥能力以及切水题能力,比较难。难度从ABCDEF......但是百度搜题解一般都搜得到。 51nod: http://www.51nod.com/index.html 杭电HDU:水题HDU比较多,而且多数为中文。适合新手刷题,里面也有大量难题。 Virtual Judge: Topcoder(比赛): 【其他OJ】 浙大ZOJ: http://acm.zju.edu.cn/onlinejudge TimusOJ: SPOJ: RQNOJ: 计蒜客: OPenJudge: Universal Online Judge(UOJ): coci contest(比赛): Atcoder(比赛): 建议常去 TopCoder 和 Codeforces 比赛。这些地方题目质量有保障,大家的代码是公开的。同时很关键的是,这样的平台可以让你对题目的难度、比赛的进度、国内外顶级选手的实力做到心中有数,培养在大型比赛中所需要的大局观和节奏感。 USACO(比赛): |
顺序 | 资源 | 知识分类/使用方法 | 链接和介绍 |
1 | 《具体数学》 | 【数学】 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAg3cmHuwYoyZ6KMg.pdf 这本书《具体数学》是Stanford计算机系的教材(1970 年开始给研究生授课),书的内容是Knuth的巨著TAOCP第一章的扩展,涉及了计算机科学领域内几乎所有可能遇到的数学知识。书中许多经典问题的解答比目前广泛流传的解法更易懂。对于提高大家的数学修养有很大帮助。 |
2 | Project Euler | 【数学】 | 杜瑜皓推荐,里面有许多数学题(虽然不完全是OJ) |
【竞赛专区】如果要准备竞赛,继续看下面的。 这个阶段focus在进阶的算法以及复杂一些的: 树状数组 线段树 平衡树 后缀数组 二分图匹配 网络流 费用流 割点 桥 强联通 双联通 最近公共祖先 四大DP(数位dp 区间dp 状压dp 概率dp) 博弈论SG函数 下面是要进军金牌要熟悉的知识点: 更复杂的数据结构(树链剖分,动态树,可持久化线段树,DLX,后缀自动机,回文树,斜率优化/单调队列优化/四边形优化DP,插头dp,莫比乌斯反演......) | |||
3 | 《算法艺术与信息学竞赛》 刘汝佳 | 【竞赛】 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAg3cmHuwYo-MCHYg.pdf |
4 | 《算法竞赛进阶指南》李煜东 | 【竞赛】 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAg3cmHuwYo0vXr3QU.pdf |
5 | 刷英文套题 | 【竞赛】 提升英文阅读能力 | |