系列源于个人原因想重学一遍 数据结构与算法 (虽然之前也没怎么好好学)
主要内容为常用数据结构&常用算法,结合个人技术栈 Go & TS 来「刷题」
以下 What & Why 为开篇絮絮叨叨,嫌麻烦可略过直接看 How (๑•̀ㅂ•́)و✧
What
先理解涵义,才能更好学习。我们先来思考下,「算法」是什么?
非程序思维可能会想到数学算法,比如一堆公式。那放到程序世界,算法就变成一堆「代码」(Func方法/函数)。
那回想一下学生时代的数学解题,如何解应用题?比如算圆的面积,用公式 S=πr²
,类似的问题就都能解了。
再回到程序世界,类似数学公式,很多经典的数据结构和算法,都是前人从很多实际操作场景中抽象出来的,且经过非常多的求证和检验,从而帮助我们更高效地解决实际的开发问题。
那「数据结构」呢?即一组数据的存储结构。算法的设计很多时候需要取决于数据结构,而算法的实现更依赖于采用的存储结构。数据结构和算法是相辅相成的,数据结构是为算法服务的。
Why
为什么需要学习数据结构和算法?
- 🏭 大厂面试必备
- 🏆 编程能力体现
- 💰 技术成就价值
大部分互联网公司(尤其是大厂)会在面试中加入很多算法问题,从而有效筛选候选人。而算法,的确从一定程度上考察了面试者思考解决问题的能力,也能考察写代码的基本功。
代码写得好不好?性能好坏是其中一个非常重要的评判标准。但是,如果连代码的时间复杂度、空间复杂度都不知道怎么分析,怎么写出高性能的代码呢?
掌握数据结构和算法,看问题会更深,解决问题的角度也会不一样。数据结构与算法作为计算机的基础&核心知识,将使你更具竞争力,体现更大价值。
How
怎么学?这个问题并无普适性,每个人的基础和学习方法均不同,天才看看《算法导论》就超过90%的人了 ,普通人还是需要循序渐进、查漏补缺的来。
本人(可能比普通人还更🐷一些)的「学习方式」&「计划路线」如下:
学习方法
结合一些专栏大牛的推荐学习方法 & 个人学习经验,列举如下:
- 👨💻 多敲代码,有计划刷题
- 💡 勤加思考,忌一知半解
- 💪 坚持沉淀,宜反复迭代
实践出真知,学习过程中涉及的数据结构和算法,全都要自己敲出来,一定比单纯看博客或对应学习视频效果佳。
计划学习参考 极客时间专栏-数据结构和算法之美(避免广告嫌疑,不加链接了)以及针对性的刻意练习关联 LeetCode 并进行个人总结。个人学习使用 Playground:Golang Playground 和 TypeScript Playground
以下,针对 「刷题」和「坚持」,多聊几句,打打鸡血 (๑•̀ㅂ•́)و✧
刷题
至于刷题,有以下几个建议:
- 🗓 刷题是项系统工程,须制定合理计划
- ❌ 随机或按难度刷题,容易混乱,参考知乎回答: LeetCode按照怎样的顺序来刷题比较好?
- 🤔 分析总结解题思路,死记硬背或者光追求运行成功意义不大;面试往往也会让你阐述思路并继续追问优化方式等
另,参考 LeetCode Patthens,若是 Golang 技术栈可参考 https://github.com/halfrost/LeetCode-Go
坚持
坚持的前提是有计划,但是计划永远赶不上变化(只怪学生时代没打好基础)
个人实行「每周打卡博客 + 自我奖励」的方式来坚持,💪
计划路线
本普通人计划开始博客打卡学习, 常用数据结构&算法 的学习(总结)路线 👀 ↓
仅列举大纲,以下计划周更(一周系列会拆分多篇,完成后上链接),具体会有所调整
复杂度很很很重要,仅总结其规律,但一开始又很难说清楚(题刷多了自然会),建议反复迭代
- 复杂度分析 —— 时间复杂度 & 空间复杂度
- 复杂度分析 —— 最好、最坏、平均 & 均摊时间复杂度
简单介绍以下 6 种常见数据结构的定义,暂不涉及具体算法使用,同样建议反复迭代
!!!常见算法并尽可能结合具体适用场景 & LeetCode 例题;计划学习的顺序会有所调整
- 二分(查找)法
- 双指针
- 排序 —— 插入排序 & 冒泡排序
- 排序 —— 快速排序 & 归并排序
- LRU 缓存淘汰算法
- 递归
- 二叉树分治
- 广度优先搜索 BFS
- 深度优先搜索 DFS
- 动态规划
- 字符串匹配
- 跳表 & Redis
- B+树 & MySQL 数据库索引
以上(拆分短篇)大致估了下 50+; 50*7=350 Σ(o゚д゚oノ)
2021 第一个 FLAG:年底要完成它!