数据结构与算法的学习,文字教材跟从王争的《数据结构与算法之美》,视频教程跟从AcWing的y总。做技术,要耐得住寂寞,十年磨一剑,不否认来时路,也无畏将来。
为什么要学习数据结构与算法?
数据结构与算法不是一朝一夕就可以掌握的。下定决心学习前,最好做好要学一年以上的准备。如果仅仅是写纯框架的工程,大概是不需要学习特别深的算法的。但是在阅读开源项目源码、程序语言内置方法底层实现时,是需要读者具有深厚的数据结构与算法能力的。
我见过许多技术非常强,但是面试会跪在“算法”上,网络安全岗位随着逐渐兴起,也从一开始会使用脚本,到非常强调算法功底,尤其是二进制方向。拿pwn方向来讲,栈相关题目需要栈相关知识,而堆相关的题目需要链表相关的知识。
我学习过前端开发(vue为主),也学习后端开发(golang为主,java也写),前端在编写动态路由、组件复用,后端的响应处理、CURD、中间件、消息队列,我大多是根据业务逻辑使用框架编写。这些框架底层,一般都揉合了很多基础数据结构和算法的设计思想。
比如,我们常用的Key-Value数据库Redis,里面的有序集合是用什么数据结构来实现的?为什么用跳表来实现?为什么不用二叉树?
王争在开篇词就写到基础架构研发工程师,我也为之一撼,因为我的目标就是能写开源框架。以RPC为例,不同公司、不同人做出的RPC框架,架构设计思路差不多。最后实现的功能也差不多。但是有些做出来的Bug多、性能一般、扩展性不好、只能在公司仅有的几个项目使用。而有的人做的框架可以被Apache收录。
高手之间的竞争在于细节。算法是不是够优化?数据存取效率是不是够高,内存是不是够节省等等?这些累积起来,决定了一个框架是不是优秀。
如何系统高效地学习数据结构与算法?
实际上,数据结构和算法的东西并不多,常用的、基础的知识点更是屈指可数(不是我说的,王争说的,狗头保命),还没有到考验智商的地步。
理解概念并学会使用
概念记的再牢,不理解、不会用也是徒劳无获。理解的过程中不必死扣定义,但是要理解概念。比如理解什么是数据结构与算法:
数据结构是为算法服务的,算法要作用在特定的数据结构之上。数组支持随机访问,可以使用二分查找来提高效率,如果使用链表存储,那么二分查找就无法工作了,因为链表不支持随机访问。
学习的重点内容
数据结构与算法的内容非常多,先学什么?后学什么?学习数据结构与算法首先要学会复杂度分析!然后就可以进入数据结构与算法的正文内容了:
事半功倍的学习技巧
学习数据结构是非常好的思维训练过程,所以,千万不要被动的记忆,要多辩证的思考,多问为什么,引用中庸关于学习的经典:”博学之,审问之,慎思之,明辨之,笃行之。”,我会单独出一篇说说来读博学之这一篇,汲取先辈学习之智慧。
边学边练,适度刷题
每周花1-2个小时的时间,集中把每周学习的数据结构和算法,全部自己写出来,用代码实现一遍。然后留出两个小时纠错和总结。
“适度”刷题,但不要浪费太多的时间刷题。学习的目的还是掌握,然后应用。
多问、多思考、多互动
学习最好的方法是,找到几个人一起学习,一块儿讨论切磋,有问题及时寻求老师答疑。
打怪升级学习法
学习最大的问题就是,坚持不下来。所以,在枯燥的学习过程中,也可以给自己设立一个切实可行的目标,像打怪一样升级。
知识需要沉淀,不要试图一下字掌握所有
在学习的过程中,一定会碰到”拦路虎”。如果碰到学不懂的知识点不要着急,实属正常现象。学习知识的过程是反复迭代、不断沉淀的过程。书读百遍其义自见。