前言
从零开始学习数据结构与算法,知识顺序是:先数据结构再算法。
整理知识点的顺序是:对于每个数据结构,会先实现该数据结构,然后讲解关键的知识点、一些概念等。然后辅助一些经典的题。
因为是学习教程,所以不应该是深度优先遍历,而是广度优先的法则,先把比较基础的、常用的学习了。再反过来进阶,补充较高级的知识点。比如b树、图这些
所以目录有两个:
1、我目前掌握的所有关于数据结构与算法的 知识图谱目录
2、从0到1逐渐完善的路径目录
参考书籍:
- 《王道考研系列-数据结构考研复习指导》
- 《极客时间-数据结构与算法之美》
- 极客时间-算法40讲
- 北大屈老师-算法课
- 左程云-算法书
根据掌握程度将学习分为4个阶段:
阶段1-掌握知识
阶段2-脱稿复刷经典题、初步探索新题、代码优化要求
阶段3-敞开题库检验自己解题能力
阶段4-以面试水准要求自己,解题时间控制
1-知识掌握阶段
掌握基本的数据结构与算法,对着知识讲解自己实现一遍相关数据结构与算法,按类型刷经典的中度偏简单的题。
这时的进步可以是:从看到题目呆若木鸡连思路都没有,到知道可以暴力、或者知道是从某个数据结构与算法里借鉴思维变种可以解答某题,再到可以灵活写递归、设计程序结构。
伴随动作:之前不熟悉的api、原来并没有理解透彻的代码执行,一些精妙精巧的代码技巧,一些有用的数学知识、位运算知识等
学习姿势:
- 《王道考研系列-数据结构考研复习指导》:考研书,理论知识掌握。以及一些经典的课后题,整理题解背后的思路(大致流程图->每一步细分->着重考虑边界条件/递归返回条件/循环结束条件->直至拆分到特别熟悉的小模块无需思考即可写出的代码片段->拼合模块->测试,考虑鲁棒性和可优化空间),写伪码笔记、整理记忆卡片等。
- 学习完数据结果知识,自己是否能像这篇回答一样手写出知识点?
- 北大屈老师-算法课
练习姿势:
- 做题慢下来,不追求速度和质量,不求完美只求完成
- 刷特定类型的题,学习堆就解锁堆的基本实现、常见的经典的堆的题
参考书籍:
- 基础科普:
- 图解算法-有些例题有用
- 王道:算是比较全面
- 北大-屈老师的课
- 课后练习题(一般也是经典的题)
- leetcode按tag分的经典题
- 算法40讲
- 50个必会的代码-王争
2-脱稿复刷经典题
学完了基础知识以后,对数组、链表、树、堆、排序、DFS、BFS、DP、Greedy、Divider-Conquer等都已经比较熟悉了,此时再把之前做过的题目再做一遍; 同时再做一些新的题目,可以适当加大题目的难度,并尽量将代码优化到最优;
这时复刷的时候难免会忘记之前的代码细节,可能只是隐隐约约记得算法思路了,这时别急着看源码实现,而是硬着头皮先写一版,自己用学到的方法手撕一遍,然后对照着大师的代码,看看自己的不足!
代码运行不正确的时候,耐心调试~~
3-敞开题库测试检验
综合练习,全面提高自己算法能力,随机一道题,看看能否解决。花20~30分钟思考以后,让人没有思路,再去看solution。
4-速度反应度质量的要求
使用姿势三练习到一定程度,我想内功修为已经蛮高了,此时,再有目的的刷,比如为通过Google、微软面试等,这个时候,追求速度。
**
一些心得
知识输出:
(说实话现在只是对这些经典题有了第一印象了。也尽力 覆盖了必知必会的 耳熟能详的一些题作为练习题。
期待就是根据这些题能更深刻的体会到所考的知识点,也根据题来考验自己是不是真的会了。
那么我写知识总结的目的是什么呢?(相比看github仓库的代码
github仓库是简单图文介绍 相关知识点,对于题库来说,每道题过于细节了,应该将这些题集结起来一起总结:
- 理清一个算法、数据结构的核心实现/核心思路—能解释给别人(以后忘记的自己)听,一下能看明白的那种
能(用自己的思路)解释给别人听,xxx 是 xx 的问题
别人问我什么是快速排序,我能
- 写出伪代码和关键步骤
- 抽象出快速排序的核心思想
- 准确回答出快排为什么快、快排与堆排时间复杂度一致为啥大家都用的快排等经得起推敲的问题
- 时间复杂度怎么计算出
篇幅不应该太长:比如一些很细节的推敲问题:可以放在评论里写出来或者是其他文稿里写
- 总结题— 再看到这个题 我有思维,而不再是只有的暴力解法
- 某个知识点集合起的题—- 重在该知识点思维的抽象,然后抽解不同,在不同的题里 该知识点是怎么 小改变的
- 一题多解,扩散涉及到的其他知识点。(某个题可以 针对 一题多解还可以 串联 解释相关知识点,比如斐波拉契可以解释 迭代、递归、dp)
培养框架式思维、总结框架式代码
**
常用算法要形成自己的模板。比如:递归、二分查找、动态规划等!
