笔者作为一名非科班出身的程序员,想系统地补充“数据结构与算法”这一块知识,入了极客时间的专栏《数据结构与算法之美》,希望能以笔记的形式总结、分享所学,更以督促学习。
本章内容源于对专栏以下章节的学习笔记:
经验篇
作者开篇介绍了两个和数据结构与算法有关的例子:
- 1.在作者的学生时代,为了帮他提高编程能力,师兄给了他一本《算法导论》,使他对算法开始着迷。通过对数据结构与算法的研究,编程能力有了质的飞跃。他认为那是他人生为数不多的转折点之一。
- 2.一位在腾讯工作10年的T4大牛,跳槽去区块链领域,用了不到半年时间,就把区块链的整个技术脉络摸清楚了。他曾经说,像区块链、人工智能这些看似很新的技术,其实一点儿都不“新”。最初学编程的时候,他就把那些基础的知识都学透了。当面临行业变动、新技术更迭的时候,他不断发现,那些所谓的新技术,核心和本质的东西其实就是当初学的那些知识。
基础知识就像是一座大楼的地基,它决定了我们的技术高度。而要想快速做出点事情,前提条件一定是基础能力过硬,“内功”要到位。
我们都知道基础无外乎就是操作系统、计算机网络、编译原理等,当然还有数据结构和算法。
人生路上,我们会遇到很多的坎。跨过去,你就可以成长,跨不过去就是困难和停滞。而在后面很长的一段时间里,你都需要为这个困难买单。对于我们技术人来说,更是这样。既然数据结构和算法这个坎,我们总归是要跨过去,为什么不是现在呢?
目的篇
我们为什么要学习数据结构和算法?
1.通关大厂面试
- 就校招而言,没有实际项目经验,公司只能考察基础知识是否牢固。
- 就社招而言,越是厉害的公司越重视考察数据结构与算法等基础知识,相对短期能力,公司更看中你的长期潜力。
摆正心态:我们学任何知识都是为了“用”的,是为了解决实际工作问题。
2.避免只会业务操作
在基础框架中,一般都柔和了很多基础数据结构和算法的设计思想。掌握数据结构和算法,不管对于阅读框架源码,还是理解其背后的设计思想,都是非常有用的。
3.开源框架的目标
相同原理的框架,为什么有的人写的就可以在GitHub上被很多人使用,甚至被官方收录?归根结底在于细节,比如算法的优化、数据存储效率、内存的优化等等。
4.对编程的追求
不想只会写凑合的代码,对编程有所追求。性能好坏起码是评判代码非常重要的一个标准。
小结:学习数据结构和算法,并不是为了死记硬背几个知识点。目的是建立时间复杂度、空间复杂度意识,写出高质量的代码,能够设计基础架构,提升编程技能,训练逻辑思维,积攒人生经验,以此获得工作回报,实现你的价值,完善你的人生。掌握了数据结构与算法,你看待问题的深度,解决问题的角度就会完全不一样。
方法篇
如何系统高效地学习数据结构与算法?
1.数据结构与算法的定义
从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。
2.数据结构与算法的关系
数据结构和算法是相辅相成的。数据结构是为算法服务的,算法要作用在特定的数据结构之上。
3.学习认知要求
搞清楚:是什么、为什么、怎么做?
4.学习重点
- 首先要掌握一个数据结构与算法中最重要的概念——复杂度分析;
- 10个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;
- 10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法;
- 学习它们的来历、自身的特点、适合解决的问题以及实际的应用场景。
5.学习技巧
- 边学边练,适度刷题
- 多问、多思考、多互动
- 打怪升级学习法:留言、笔记、心得、找错
- 知识需要沉淀,不要想试图一下子掌握所有:学习知识的过程是反复迭代、不断沉淀的过程,书读百遍其义自见