系列源于个人原因想重学一遍 数据结构与算法 (虽然之前也没怎么好好学)

主要内容为常用数据结构&常用算法,结合个人技术栈 Go & TS 来「刷题」

以下 What & Why 为开篇絮絮叨叨,嫌麻烦可略过直接看 How (๑•̀ㅂ•́)و✧

What

先理解涵义,才能更好学习。我们先来思考下,「算法」是什么?

非程序思维可能会想到数学算法,比如一堆公式。那放到程序世界,算法就变成一堆「代码」(Func方法/函数)。

那回想一下学生时代的数学解题,如何解应用题?比如算圆的面积,用公式 S=πr² ,类似的问题就都能解了。

再回到程序世界,类似数学公式,很多经典的数据结构和算法,都是前人从很多实际操作场景中抽象出来的,且经过非常多的求证和检验,从而帮助我们更高效地解决实际的开发问题

那「数据结构」呢?即一组数据的存储结构。算法的设计很多时候需要取决于数据结构,而算法的实现更依赖于采用的存储结构。数据结构和算法是相辅相成的,数据结构是为算法服务的

Why

为什么需要学习数据结构和算法?

  1. 🏭 大厂面试必备
  2. 🏆 编程能力体现
  3. 💰 技术成就价值

大部分互联网公司(尤其是大厂)会在面试中加入很多算法问题,从而有效筛选候选人。而算法,的确从一定程度上考察了面试者思考解决问题的能力,也能考察写代码的基本功。

代码写得好不好?性能好坏是其中一个非常重要的评判标准。但是,如果连代码的时间复杂度、空间复杂度都不知道怎么分析,怎么写出高性能的代码呢?

掌握数据结构和算法,看问题会更深,解决问题的角度也会不一样。数据结构与算法作为计算机的基础&核心知识,将使你更具竞争力,体现更大价值。

How

怎么学?这个问题并无普适性,每个人的基础和学习方法均不同,天才看看《算法导论》就超过90%的人了 ,普通人还是需要循序渐进、查漏补缺的来。

本人(可能比普通人还更🐷一些)的「学习方式」&「计划路线」如下:

学习方法

结合一些专栏大牛的推荐学习方法 & 个人学习经验,列举如下:

  1. 👨‍💻 多敲代码,有计划刷题
  2. 💡 勤加思考,忌一知半解
  3. 💪 坚持沉淀,宜反复迭代

实践出真知,学习过程中涉及的数据结构和算法,全都要自己敲出来,一定比单纯看博客或对应学习视频效果佳。

计划学习参考 极客时间专栏-数据结构和算法之美(避免广告嫌疑,不加链接了)以及针对性的刻意练习关联 LeetCode 并进行个人总结。个人学习使用 Playground:Golang PlaygroundTypeScript Playground

以下,针对 「刷题」和「坚持」,多聊几句,打打鸡血 (๑•̀ㅂ•́)و✧

刷题

至于刷题,有以下几个建议:

  1. 🗓 刷题是项系统工程,须制定合理计划
  2. ❌ 随机或按难度刷题,容易混乱,参考知乎回答: LeetCode按照怎样的顺序来刷题比较好?
  3. 🤔 分析总结解题思路,死记硬背或者光追求运行成功意义不大;面试往往也会让你阐述思路并继续追问优化方式等

另,参考 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:年底要完成它!