【数据结构与算法】如何高效学习数据结构与算法

前言

本文是个人基于覃超老师的《算法训练营》的学习笔记,此笔记的内容都是学习后的个人记录、个人总结、理解和思想。仅供参考学习。

很多同学在大学的时候会觉得数据结构与算法很枯燥,很多小伙伴都不愿意听这门课程。甚至以前还觉得能开发一个项目就能成为一个合格的程序员。但是学会算法,或者接触过数据结构与算法后,发现懂这门知识的程序员编写出来的代码相对有更高的质量。代码的性能、写法、底层逻辑和解决问题的能力都会高于不懂数据结构与算法的程序员。

到了如今,如果想成为一个高级开发工程师或者进入大厂,不论岗位是前端、后端还是AI,算法都是重中之重。也无论我们需要进入的公司的岗位是否最后是做算法工程师,前提面试就需要考算法。所以小时不学算法,长大掉头发

这系列的《算法学习笔记》,与大家一起重温或者学习数据结构与算法。

这里也赠送大家一句话:

好记性不如烂笔头,好记性更不如好笔记

愿大家在技术银河中终身漂泊学习时,习惯编写自己的笔记,以后这些笔记必定成为我们最珍贵的宝藏!✨

如何系统化学习算法

深入到精通一门知识的我们都需要一个系统化的学习方法,如果这门知识越是有难度,前期就越是枯燥无味,或者甚至觉得很困难。所以学习算法也是一样的:

  • 枯燥无味
    • 所以需要系统化学习;
    • 小步快跑的方式进行学习;
    • 不懂就找答案不要埋头苦学;
  • 不牢固
    • 越是庞大的知识,越学就会越觉得之前学到的知识忘的差不多了;
    • 其实就是缺乏知识的稳固性;
  • 预习
    • 学习任何一门知识,都要先了解和预习这门知识;
    • 同理,在学习一门新的开发语言时,我们都会先来一个hello world
  • 坚持leetcode刷题
    • 要学会算法,并且稳固这一门知识,不断的刻意练习是重中之重;

系统化的效果

系统化学习和拿起一本书最终的效果是不一样的。很多时候我们开始学习一门知识,我们都会看:《xxx深入浅出》、《xxx指南》和《从0到1学会xxx》,其实里面的知识是很庞大的。只靠知识是无法支撑我们的实战和经验的,所以我们需要系统化的学习方法最终达到的目标也是不一样的,例如:

  • 提升到职业顶尖水平
  • 通过一线互联网大厂的面试
  • 要有Leetcode 300+ 刷题量

推荐阅读《Outliner》这本书中的学习方法

精通一个领域

前面说到,任何一个领域的知识都是很庞大的。而且只靠看书,看文章学习都是不够的。所以一套好的学习方法,可以为我们打开一扇大门。而且在打开这扇大门的同时不会因为艰苦、困难、煎熬或者是枯燥而最后放弃。

  • 切碎知识点 Chunk it up
    • 庖丁解牛
    • 脉络相连 - 从根部开始学习,到分支,再到树叶。让每一个知识点都有关联关系
  • 刻意练习 Deliberate Practicing
  • 反馈 Feedback

数据结构有什么?

  • 一维:
    • 基础: 数组 array (string),链表 linked list
    • 高级:栈 stack,队列 queue, 双端队列 duque,集合 set,映射 map (hash or map),等等
  • 二维:
    • 基础:树 tree, 图 graph
    • 高级:二叉搜索树 binary search tree(红黑树 red-black tree, AVL),堆 heap,并查集 disjoint set,字典树 Trie
  • 特殊:
    • 位运算 Bitwise,步隆过滤器 BloomFilter
    • LRU Cache (缓存)

参考:覃超老师的《数据库脑图》

算法有什么?

任何的高级算法与数据结构都会转换成If Else,for循环,其实也是最朴素的计算机的知识,没有什么AI,人工智能的知识。高级算法重点是找到重复单元

  • 跳转语句 (Branch) :If-else,switch
  • 循环 (Iteration) :for, which,while loop
  • 递归 (Recursion) : Divide & Conquer, Backtrace
  • 搜索 (Search) :深度优先搜索 Depth first search,广度优先搜索 Breadth first search,启发式搜索 A*
  • 动态规划 (Dynamic Programming)
  • 二分查找 (Binary Search)
  • 贪心 (Greedy)
  • 数学 (Math),几何 (Geometry)

参考:覃超老师的《算法脑图》

刻意练习 - Deliberate practice

无论是科学家、国家运动员、技术专家还是游戏职业选手,他们的优秀的背后都有一个共同点:刻意练习

什么是刻意练习?

  • 刻意练习 - 过遍数,持续多边形的练习,用数遍达到质变!(五毒神掌);
  • 练习不擅长的地方;
  • 如果感到不舒服、不爽、枯燥的话,那证明我们正在爬坡,正在提升!

反馈 - Feedback

很多时候在学习中,特别是在自学的过程,我们永远不知道自己的学习的成果是怎么样的。或者我们有时候会遇到难点但是无法突破,甚至有时候我们以为自己很努力,或者已经很强了。但是其实还只是坐井观天而已。所以我们在学习的时候需要反馈。所谓的反馈有几种:

  • 即时反馈
    • 学会使用一门语言;
    • 能写出能执行的代码;
    • 能写出一个项目;
    • 能实现一个功能;
  • 主动型反馈
    • 高手代码(Github、LeetCode);
    • 第一视角止步(看视频,看高手写的代码,学习思路);
  • 被动式反馈(高手指点)
    • 代码审查 code review;
    • 例如:教练看你打,给你反馈;

切题四件套

我个人认为也可以叫解题四大法则

  • 理解题目(Clarification)
    • 在LeetCode看题后,先思考,认真确认和理解题目;
    • 避免忽略了一些条件或者是误解题目;
    • 面试的时候更加应该跟面试官确认清楚题目、条件、场景等;
  • 多种解题方案(Possible solutions)
    • 对比时间和空间复杂度 compare (time/spaace)
    • 最优解 optimal (加强)
  • 多编写(Coding)
    • 代码反复练习和编写;
    • 每一种解法都反复练习和编写;
  • 多测试案例(Test cases)
    • 在LeetCode上可以改变测试案例;
    • 多测试几种案例,确保自己的代码可以适应各种特殊情况;

刷题方式(五毒神掌)

第一遍

  • 5分钟:读题 + 思考;
  • 5分钟过后,没有思路就直接看解法;
  • 记录多个解题方法,比较解题方法的优弊;
  • 尝试默写代码,训练刻意手写代码;

第二遍

  • 自己编写,这时候就不要再看题解了;
  • LeetCode提交代码,确保能通过;
  • 有Bug没有关系,重复debug到通过为止;
  • 编写出多种解题方法;
  • 持续优化 - 重点是 执行时间 (可参考LeetCode中打败了多少的人,也可以点击比较优秀的人,学习更好的写法);

第三遍

  • 过了一天后,再重复做题;
  • 根据自己不熟悉的题目与程度做专项练习;
  • 专项练习就是针对自己不熟悉的种类的题,从而刻意练习哪一种题;

第四篇

  • 过了一周后,再反复练习;

第五遍

  • 面试前,提前2-3周开始重复练习;

总结

这篇笔记中,我们记录了一下关键知识重点点:

  • 如何深入学习一门知识
    • 通过系统化学习一门知识;
    • 最高效和持续的学习算法就是通过系统化的学习;
    • 这里推荐大家,真的想学好一个技术,最好的方法就是找对老师,找对课程,找对人;
  • 如何攻破庞大的知识体系变成编程职业高手
    • 切碎知识点与建立脉络
    • 刻意练习
    • 反馈
  • 数据结构中有什么? - 看脑图
  • 算法中有什么?- 看脑图
  • 算法练习方法
    • 切题四件套
    • 五毒神掌

我是三钻,一个在技术银河中和你们一起来终身漂泊学习。
点赞是力量,关注是认可,评论是关爱!下期再见 👋!

公众号《技术银河》回复"算法资料"可以获得PDF版和脑图资料!

推荐阅读

  • 📖《分析时间与空间复杂度《三钻数据结构与算法笔记》》 — 算法的核心时间和空间复杂度,《数据结构与算法》都是围绕着这个核心开展的。它的存在也是为了解决我们在编程的过程中性能问题,同时也让我们有更高级的思维和思路,写出更优质的程序。

  • 📖《28关学会HTML与HTML5基础》 — 一个系列的文章和大家一起闯关进攻前端全方位知识点。没有闯过这些关卡的童鞋,无论前端能力如何,这个可以锻炼我们自己,也可以深入知道我们自己的前端水平和差距。想学习前端的童鞋可以从零开始学习,一起排除困难共同打开前端大门!

  • 📖《44关深入浅出CSS基础之第一篇》 — 这周我们一起闯过了22关,下一期我们会一起把剩余的22关完成。学习是一种像爬山一样的过程,要经历过漫长的上坡路,一步一个脚印。“路漫漫其修远兮,吾将上下而求索。”, 在追寻知识的道路上,前方的道路还很漫长,但我们将百折不挠,不遗余力地,上天下地的去追求和探索。让我们继续坚持学习,终身学习成长。在大前端的时代爬到技术的巅峰,做一个有深度的技术人员。

  • 🔥《前端必看的8个HTML+CSS技巧》 — CSS是一个很独特的语言。看起来非常简单,但是某种特殊效果看似简单,实现起来就颇有难度。这篇文章主要是给在学习前端的童鞋分享一些新的CSS技巧,一些在前端教程和培训课堂中不会讲到的知识。第二就是让还在前端开发这条道路上的童鞋们,重新燃起对前端排版和特效的热爱和热情!🔥

  • 250
    点赞
  • 1367
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 28
    评论
前Facebook工程师 打造王者级课程                            覃超 Facebook 早期员工&多年面试官、曾作为 Facebook Messenger Tech Lead,主导和参与了 Facebook App、Facebook Messenger、Facebook Phone 等产品的研发工作。 现在,覃超老师致力于计算机科学领域的培训指导,经他指导的学生,90%以上拿到了硅谷公司或国内顶级互联网公司的offer。 推动0到3岁程序员 打通职业发展路径 数据结构算法计算机学科知识结构的核心和技术体系的基石,随着科技的飞速发展,数据结构的基础性地位反而更加坚固,是每一个程序员必须掌握的底层核心技能! 多岗位必备技能 快速提升编程内功   作为一名程序员,无论是任何岗位,掌握数据结构算法,就可以在面试前建立自己的算法技术体系,同时有助于更好地阅读源码和设计编写一些复杂的工具,快速提升编程内功! 建立框架性知识体系 覆盖重要知识点 很多人认为可能除了面试,之后再也用不到据结构与算法了,但是如果程序员想拔高一个层次,数据结构算法是很重要的一部分,《全解数据结构算法》帮你完成角色的转变! 透彻讲解底层核心原理 拓展能力上限 很多人认为可能除了面试,之后再也用不到据结构与算法了,但是如果程序员想拔高一个层次,数据结构算法是很重要的一部分,《全解数据结构算法》帮你完成角色的转变!
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三钻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值