学习任何知识都有方法,有的事半功倍,有的事倍功半,这篇文章主要介绍了作者自己对于学习数据结构与算法的认识。

学习算法和数据结构需要掌握的东西并不多,抓住重点,有的放矢,学习算法并没有想象中的难。

什么是数据结构?什么是算法

数据结构算法都可以从广义狭义上进行定义。

广义:

  • 数据结构:数据的存储结构
    • 图书馆将书籍分门别类,按照一定规律编号
  • 算法:操作数据的一组方法
    • 查找一本书可以一本本挨着找,也可以先根据书籍的类别定位具体的书架,再依次查找,不同的查找方法就是不同的**算法**。

狭义:

也是专栏的内容,指的是著名的数据结构和算法,是前人智慧的沉淀和结晶,比如:

  • 队列
  • 二分查找
  • 动态规划

这些经典的,最常用的数据结构与算法,是前人从实际操作的场景中抽象得来,经过了非常多的求证和检验,可以高效地帮助我们解决实际的开发问题

数据结构与算法不能孤立的看待,二者相辅相成,数据结构为算法服务,算法作用在特定的数据结构上

  • 数组这个数据结构具有支持随机访问的特点,而常用的二分查找需要数组做数据结构支撑,如果是一个链表的话,二分查找并不能使用在链表上,因为**链表不支持随机访问**。
  • 数组结构是静态的,只是数据的一种组织方式,如果没有算法操作数据,孤立的使用数据结构是没有意义的。

学习基础

虽然算法涉及数学知识,但是这门专栏并不需要很深厚的数学基础。

由浅入深,从概念到应用,只要有高中数学水平,就可以学习。

有编程基础和项目经验更好,这样可以将理论映射到实践,有更加直观的感受,作者会从实际场景出发,不仅教"是什么",还会讲"为什么"以及"怎么做" what why how

学习的重点

首先需要学会最基础的重要概念:复杂度分析。也就是怎样分析一个算法的时间复杂度与空间复杂度。

算法数据结构的存在意义是更省空间更快速度存储处理数据,因此需要有一个标准对这个速度进行量化,这就是复杂度分析方法

所以首先需要掌握复杂度分析这个基础,才能进行后面的学习。

下面是作者画的脑图,涵盖了主要的数据结构与算法,我重新画一遍,加深记忆:

数据结构和算法

画完之后发现了NNN多之前完全没听过的概念,脑子里对算法和数据结构的印象就是那几个常用的...

作为初学者或非算法工程师,并不需要掌握图中所有的知识点,很多高级数据结构与算法如二分图最大流等,平时开发中很少用到

学习需要抓住重点,2/8法则,如果平摊学习的话,学习起来会很吃力。

下面是作者总结的20个最常用最基础的数据结构与算法,集中精力学习即可:

10个最常用数据结构:

  • 数组
  • 链表
  • 队列
  • 散列表
  • 二叉树
  • 跳表
  • Trie树

10个最常用算法:

  • 递归
  • 排序
  • 二分查找
  • 搜索
  • 哈希
  • 贪心
  • 分治
  • 回溯
  • 动态规划
  • 字符串匹配

掌握了上面说到的基础数据结构与算法,再去学复杂的就会很容易了,同时学习不能死记硬背,而是根据算法的**来历自身的特点适合解决的问题以及实际应用场景**进行学习。

学习过程中需要多思考,多问为什么,而不能被动的学习。【费曼学习法】

事半功倍的学习技巧

1. 边学边练,适度刷题

建议花一些大块的时间,集中的将涉及的数据结构和算法自己用代码实现一遍,同时适度刷题。

2. 多问、多思考、多互动

学习最好的方法就是几个人一块讨论切磋学习,对应到专栏就是多留言,多看留言。【这个我已经体会到了,留言至少能多学20%的知识】

3. 打怪升级学习法

给自己找乐趣,给自己设计一个切实可行目标,让自己能够体验到不断变强的正反馈,这样就会越学越有动力。

4. 知识需要沉淀,不要试图一下子全部掌握

需要反复实践,反复思考,反复学习,沉淀+思考,慢慢就可以掌握,这个主要是心态上的,不要一下子就想全部掌握,欲速则不达。

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

最是人间留不住,曾是惊鸿照影来。