文章目录
如何有效学习数据结构与算法
期待目标:
-
职业顶尖级别 - 对于算法数据结构的理解
-
一线互联网公司面试
-
LeetCode 300+ 的积累
引申一个方法论
如果想精通某个领域,大概有三步骤如下:
- 1.Chunk it up 切碎知识点
- 2.Deliberate Practicing 刻意练习
- 3.Feedback 反馈
源自:中文版译名:《异类:不一样的成功启示录》作者:尔科姆·格拉德威尔
1.Chunk it up 切碎知识点
1.1 背景:
要对知识点进行**庖丁解牛**(先分解打散) 和对知识点的**脉络连接**(再组织链接)
举例:打游戏里CS,星际,LOL这些,里面有不同的技能需要训练,如下:
• 控兵(微操)
• 运营
• 战术
• 热键操作 vs 鼠标操作
• …
故对数据结构和算法也不外如是,接下来我们数据结构和算法进行分解:
1.2 数据结构大脉络
- 一维:
- 基础:数组 array (string), 链表 linked list
- 高级:栈 stack, 队列 queue, 双端队列 deque, 集合 set, 映射 map (hash or map), etc
- 二维:
- 基础:树 tree, 图 graph
- 高级:二叉搜索树 binary search tree (red-black tree, AVL), 堆 heap, 并查集 disjoint set, 字典树 Trie, etc
- 特殊:
- 位运算 Bitwise, 布隆过滤器 BloomFilter
- LRU Cache
注意:了解每个数据结构的原理和代码框架
脑图如下:数据结构脑图
1.3 算法大脉络
- 基础(条件判断,循环结构与递归)
- If-else, switch —> branch
- for, while loop —> Iteration
- 递归 Recursion 【 Divide(分解) & Conquer(治理), Backtrace(回溯)】
- 高级
- 搜索 Search: 深度优先搜索 Depth first search, 广度优先搜索 Breadth first search, A*, etc
- 动态规划 Dynamic Programming
- 二分查找 Binary Search
- 贪心 Greedy
- 数学 Math , 几何 Geometry
注意:在头脑中回忆上面每种算法的思想和代码模板
脑图如下:算法脑图
课堂作业:自己动手绘制一份数据结构和算法脑图
用脑图的方式把知识的脉络串联起来,不管对于学习新知识还是巩固已有知识,都是一种很好的学习方式。同学们可以将目前自己所掌握的数据结构和算法知识绘制成脑图,在绘制过程中可以查阅资料,补充目前掌握欠缺的部分,找到自己薄弱的地方。后面再通过课程的学习和刻意练习,动态地将自己绘制的脑图逐步补充、完善,从而达到真正的融会贯通。
2.Deliberate Practicing 刻意练习
2.1背景:
-
基本功是区别业余和职业选手的根本
-
基础动作的分解训练和反复练习 —> 最大的误区(以为简单就练一次足够了)
2.2 如何进行刻意练习
- 刻意练习 — 过遍数(“五毒神掌法”,后面会具体提到如何操作)
- 专门练习缺陷、弱点地方
- 不舒服、不爽、枯燥,有这种感觉就对了
- 生活中例子:乒乓球、台球、游戏等等
3.Feedback 反馈
问题:如何对自己的学习成果进行总结或者评价:
- 即时反馈(看代码是否AC)
- 主动型反馈(自己去找)
- 高手代码 (GitHub, LeetCode, etc.)
- 第一视角直播
- 被动式反馈(高手给你指点)
- code review
- 教练看你打,给你反馈
切题四件套(战术)
- Clarification(很重要,搞清楚问题是什么意思)
- Possible solutions (把尽可能想到的解决方案都试一试,不能限于一个思路,一开始可以拿脑图对照究竟可以用哪些工具解决这个问题)
- compare (time/space,注意对比时间复杂度还有空间复杂度,能用到的解题思路谁相对更优)
- optimal(加强)
- Coding(多写)
- Test cases
五步刷题法-五毒神掌(战略)
刷题第一遍
- 5分钟:读题 + 思考 (觉得自己读题较慢,理解较慢,最多可以放宽到15分钟)
- 直接看解法:注意!多解法,比较解法优劣
- 背诵、默写好的解法
刷题第二遍
- 马上自己写 —> LeetCode 提交
- 多种解法比较、体会 —> 优化
刷题第三遍
- 过了一天后,再重复做题
- 不同解法的熟练程度 —> 专项练习
刷题第四遍
- 过了一周:反复回来练习相同题目
刷题第五遍
- 面试前一周恢复性训练