目录

数据结构和算法 | 为什么学?是什么?怎么学?【1】

以下内容主要是来自于极客时间王争老师的《数据结构与算法之美》,这篇主要是笔记内容!

1. 重要性 — 为什么?

  • 基础知识就像是一座大楼的地基,它决定了我们的技术高度。而要想快速做出点事情,前提条件一定是基础能力过硬,“内功”要到位。

    一位腾讯T4的大牛曾经说过像区块链、人工智能这些看似很新的技术,其实一点儿都不“新“。最初学编程的时候,他就把那些基础的知识都学透了。当面临行业变动、新技术更迭的时候,他不断发现,那些所谓的新技术,核心和本质的东西其实就是当初学的那些知识。掌握了这个“规律”之后,他学任何东西都很快,任何新技术都能快速迎头赶上。这就是他快速学习并且获得成功的秘诀。那么作为技术人都需要修炼哪些”内功“呢?无外乎是大学里的那些基础课程,操作系统,计算机网络、编译原理,当然还有数据结构和算法。

  • 想通过大厂面试,数据结构和算法一定要好。因为校招的时候,参加面试的学生通常没有实际项目经验。公司只能考察他们的基础知识是否牢固。相比短期能力,更看重你的长期潜力。

  • 在一些基础框架中,一般都揉和了很多基础数据结构和算法的设计思想。掌握数据结构和算法,不管对于阅读框架源码,还是理解背后的设计思想,都是非常有用的。

  • 虽然对于大部分业务开发来说,平时可能更多的是利用已经封装好的现成的接口、类库,很少需要自己实现数据结构和算法。但是,不需要自己实现,并不代表什么都不需要了解。了解类库背后的原理,懂得时间、空间复杂度分析可以更好用好、用对它们。比如在选择ArrayList、Linked List的时候。

  • 对于编程有追求的人来说。要想自己编程能力强,性能好坏是其中一个非常重要的评判标准,这一点就需要扎实的数据结构与算法知识。

  • 掌握数据结构与算法,你看待问题的深度,解决问题的角度就会完全不一样了。而且学会了数据结构与算法的思想,甚至可以应用在生活中。

2. 概念 — 是什么

2.1. 广义层面

**数据结构就是指一组数据的存储结构,算法就是操作数据的一组方法。**拿图书馆做例子,假如把图书馆中的书籍当成数据,那么书籍按照类别、按照规律编号,那么这个就是“数据”的存储结构。如何找到一本书呢?你可以一本一本地找,也可以先根据书籍类别的编号,先定位图书的大体位置,然后再依次查找。笼统地说,这些查找方法都是算法。

2.2. 狭义层面

某些著名的数据结构和算法,比如队列、堆、栈、二分查找、动态规划等。并且这些数据结构和算法是相辅相成的。**数据结构是为算法服务的,算法是要作用在特定的数据结构之上。**所以无法孤立数据结构来讲算法,也无法孤立算法来讲数据结构。比如数组这种数据结构具有随机访问的特点,常用的二分查找算法需要用数组来存储数据,但如果我们选择链表这种数据结构,二分查找算法就无法工作了,因为链表不支持随机访问。数据结构是静态的,它只是组织数据的一种方式,如何不在它的基础上操作、构建算法、孤立存在的数据结构就是没用的。

3. 学习重点

3.1. 复杂度分析

一定要掌握复杂度分析,这个是数据结构与算法学习的精髓。它是考量效率和资源消耗的方法,从某段代码的复杂度分析出发可以对代码进行优化。所以说如果只掌握数据结构和算法的特点、用法,而不会复杂度分析,就相当于只掌握了口诀而不知道心法。(这个可以通过一段算法的优化出发来更好的讲解,比如通过对一段代码进行复杂度分析,发现这段代码的复杂度可以通过某些方式降下来,比如换个数据结构,那么这样这段代码就得到了优化,就好比你以前掌握了算法优化的本质)

3.2. 20 个最常用的、最基础的数据结构和算法

数据结构与算法的知识点比较多,这是一张几乎涵盖了所有数据结构和算法书籍中都会讲到的知识点。

https://img.dawnguo.cn/Algorithm/0_0.jpg

但是这 20 个是最常用的、最基础的数据结构和算法:

  • 数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie树
  • 递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。

集中精力攻克这些基础的数据结构和算法后,应付面试还是工作需要都足够了。假如再学更加复杂的数据结构和算法,也会非常容易、非常快。

3.3. 附:常见数据结构与算法集合

https://img.dawnguo.cn/Algorithm/网上-全部算法概括.jpg

4. 学习方法

  • 学习数据结构和算法的过程中,不要死记硬背,不要为了学习和学习,对于个人来说,不要为了要把这个学完而学完,而是要学习它的“来历”“自身的特点”“适合解决的问题”以及“实际的应用场景”。学习数据结构和算法的过程,是非常好的思维训练的过程,不要被动地记忆,要多辩证地思考,多问为什么。如果一直这么坚持做,你会发现,学完之后,写代码的时候不由自主地考虑到很多性能方面的事件,时间复杂度、空间复杂度非常高的垃圾代码出现的次数会越来越少。编程内容就得到真正的修炼了。

  • 边学边练习,适度刷题

    将讲的过程中涉及到数据结构和算法全都自己写出来,用代码实现一遍,别只停留在看的程度。**适度刷题,但是一定不要浪费太多时间在刷题上。**作为个人还是多刷题吧,但是前提是掌握了,然后再去应用。

  • 多问、多思考、多互动

    就是找几个人一起学习,一块儿讨论切磋。

  • 打怪升级学习法 — 学习完之后,可以写一篇学习笔记或者学习心得

    学习过程中,遇到的最大问题是坚持不下来(PS:起码对于个人学算法来说,好像确实这样)。那么在枯燥的学习过程中,可以给自己设立一个切实可行的目标,比如每节课后都认真总结和思考,写一篇学习笔记或者学习心得发布到某平台等(这个感觉是适合自己的打怪升级方式)。

  • 知识需要沉淀,不要试图一下子掌握所有

    想听一遍,看一遍就把所有知识点掌握是不可能的。**学习知识的过程是反复迭代、不断沉淀的过程。**遇到没有学懂的,可以先沉淀一下,过几天再重新学一遍。

5. 学习路线

极客时间-《数据结构与算法》-王争老师,针对专栏而制定的学习路线,可参考。

https://img.dawnguo.cn/Algorithm/王争-学习路线和书籍推荐.jpg

巨人的肩膀

  1. 极客时间-《数据结构与算法》-王争老师