前言
从13年年初来到北京工作,到现在已有六七个年头了,过去的六年多的时间里,不管是独自写代码还是带领小伙伴写代码,始终没有认真学习过数据结构和算法,大学里学的那点数据结构的知识也还的差不多了。刚工作的前两年,我一直都不知道自己学了数据结构和算法后有毛用,平时写代码好像也没太用得到算法,顶多就是用个排序啥的。而数据结构就更是扯淡了,不管是什么开发语言,都已经提供了实现好的工具集,我为什么非要纠结他内部的数据结构呢,不了解它的实现原理不也一样用吗?我想应该不只是我有这些疑问,刚开始工作的很多小伙伴也许都有这些疑问。既然这样,我们就带着这些疑问开启今天的学习之旅。
学习算法的重要性
首先我们说说为什么要学习数据结构和算法。
- 面试需要
你是不是觉得数据结构和算法,跟操作系统、计算机网络、计算机组成原理一样,是脱离实际工作的,除了面试的时候能用得到,否则这辈子你都用不到?其实对于工作时间不是很久的小伙伴来说,首先还真就是为了面试。很多大公司,国外的大厂咱就不说了哈,国内的BATJTMD这一类的一二线互联网,数据结构和算法肯定是必面的,甚至有的面试官会让面试者现场手写代码,很多工作了多年的IT老兵其实经验很丰富,但是最后就是死在了算法和数据结构上。这是社招,校招呢,更不用说了,校招的时候面试者通常没有什么具体的项目经验,面试官只能看他们的基础,看啥呢,肯定还是包括数据结构和算法,因为这是编程的基本功。
- 工作需要
假设我们通过背面试题侥幸通过了面试,这时候你肯定又有疑问了,现在是不是就不用管什么数据结构算法了,反正各种语言都有API,会用就是了。问题来了,你不知道API类库的实现原理,不懂得时间、空间复杂度分析,你怎么能用好API呢,如果不知道ArrayList、LinkedList、HashMap......等等的实现原理,在存储数据的时候,你知道该用哪个吗?当然我知道很多小伙伴和我之前一样,不管是啥列表就选ArrayList,映射就选HashMap,这种方式行么,行,反正不会失业,但是万一来个老IT,会被人家骂死。
- 学习需要
如果你不想一直做一名只会增删改查的程序猿,就需要了解我们所使用的框架实现原理,不论是Spring全家桶、Redis、MyBtais、RPC......哪一个基础框架在实现时,都用了很多的数据结构和算法的设计思想,如果不懂,那看框架源码会很难,如果框架的实现原理都不知道,想用好某个框架也会很难。
- 性能需要
这个就不用说了,如果你的产品用户量很少,几百几千个用户无所谓快慢,选什么数据结构的类库也没啥影响,但是如果你的产品是千万级、亿级的呢,你时时刻刻都得考虑性能,一个简单的ArrayList可能都会导致系统崩溃。
- 未来需要
我们都知道现在人工智能、机器学习、区块链这一类的新兴事物比较火,工资也很高,但是你感觉这些东西不懂数据结构和算法能干得了吗?
学习了数据结构和算法,考虑问题的角度、深度和广度就会不一样,也是在未来职场和别人竞争的捷径,更是面试时你怼面试官的法宝。
说了这么多,我们来说说什么是数据结构,什么是算法。我个人认为,数据结构就是数据的存储结构,算法就是操作数据的方法,算法是在数据结构的基础上进行的,比如如果一个算法是作用在数组上的,我们来了个链表,那这算法还怎么工作。
知识图谱
本次学习,主要学习
10个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie树(字典树/前缀树)
10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法
下面这张图是数据结构和算法的知识点,我们能把这张图中的东西搞懂,数据结构和算法这块基本上就没太大问题了。
另推荐两个学习数据结构和算法的网站:
算法可视化:
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
leetcode:
https://leetcode-cn.com