学习任何知识都有方法,有的事半功倍,有的事倍功半,这篇文章主要介绍了作者自己对于学习数据结构与算法的认识。
学习算法和数据结构需要掌握的东西并不多,抓住重点,有的放矢,学习算法并没有想象中的难。
什么是数据结构?什么是算法
数据结构与算法都可以从广义
和狭义
上进行定义。
广义:
- 数据结构:数据的存储结构
- 图书馆将书籍分门别类,按照一定规律编号
- 算法:操作数据的一组方法
- 查找一本书可以一本本挨着找,也可以先根据书籍的类别定位具体的书架,再依次查找,不同的查找方法就是不同的**
算法
**。
- 查找一本书可以一本本挨着找,也可以先根据书籍的类别定位具体的书架,再依次查找,不同的查找方法就是不同的**
狭义:
也是专栏的内容,指的是著名的数据结构和算法,是前人智慧的沉淀和结晶,比如:
- 队列
- 栈
- 二分查找
- 动态规划
这些经典的,最常用的数据结构与算法,是前人从实际操作的场景中抽象得来,经过了非常多的求证和检验
,可以高效地帮助我们解决实际的开发问题。
数据结构与算法不能孤立的看待,二者相辅相成,数据结构为算法服务,算法作用在特定的数据结构上。
数组
这个数据结构具有支持随机访问
的特点,而常用的二分查找需要数组做数据结构支撑,如果是一个链表
的话,二分查找并不能使用在链表上,因为**链表
不支持随机访问**。- 数组结构是静态的,只是数据的一种组织方式,如果没有算法操作数据,孤立的使用数据结构是没有意义的。
学习基础
虽然算法涉及数学知识,但是这门专栏并不需要很深厚的数学基础。
由浅入深,从概念到应用,只要有高中数学水平,就可以学习。
有编程基础和项目经验更好,这样可以将理论映射到实践,有更加直观的感受,作者会从实际场景出发,不仅教"是什么",还会讲"为什么"以及"怎么做" what why how。
学习的重点
首先需要学会最基础的重要概念:复杂度分析。也就是怎样分析一个算法的时间复杂度与空间复杂度。
算法
和数据结构
的存在意义是更省空间
,更快速度
地存储
和处理
数据,因此需要有一个标准对这个速度进行量化
,这就是复杂度分析方法
。
所以首先需要掌握复杂度分析这个基础,才能进行后面的学习。
下面是作者画的脑图,涵盖了主要的数据结构与算法,我重新画一遍,加深记忆:
【画完之后发现了NNN多之前完全没听过的概念,脑子里对算法和数据结构的印象就是那几个常用的...】
作为初学者或非算法工程师,并不需要掌握图中所有的知识点,很多高级数据结构与算法如二分图
,最大流
等,平时开发中很少用到。
学习需要抓住重点,2/8法则,如果平摊学习的话,学习起来会很吃力。
下面是作者总结的20个最常用最基础的数据结构与算法,集中精力学习即可:
10个最常用数据结构:
- 数组
- 链表
- 栈
- 队列
- 散列表
- 二叉树
- 堆
- 跳表
- 图
- Trie树
10个最常用算法:
- 递归
- 排序
- 二分查找
- 搜索
- 哈希
- 贪心
- 分治
- 回溯
- 动态规划
- 字符串匹配
掌握了上面说到的基础数据结构与算法,再去学复杂的就会很容易了,同时学习不能死记硬背,而是根据算法的**来历
,自身的特点,适合解决的问题以及实际应用场景**进行学习。
学习过程中需要多思考,多问为什么,而不能被动的学习。【费曼学习法】
事半功倍的学习技巧
1. 边学边练,适度刷题
建议花一些大块的时间,集中的将涉及的数据结构和算法自己用代码实现一遍,同时适度刷题。
2. 多问、多思考、多互动
学习最好的方法就是几个人一块讨论切磋学习,对应到专栏就是多留言,多看留言。【这个我已经体会到了,留言至少能多学20%的知识】
3. 打怪升级学习法
给自己找乐趣,给自己设计一个切实可行
目标,让自己能够体验到不断变强的正反馈,这样就会越学越有动力。
4. 知识需要沉淀,不要试图一下子全部掌握
需要反复实践,反复思考,反复学习,沉淀+思考,慢慢就可以掌握,这个主要是心态上的,不要一下子就想全部掌握,欲速则不达。
Q.E.D.
Comments | 0 条评论