每次别人问我:“你觉得计算机专业课中哪门课是最重要的?”
我每次都会回答:“数据结构”。
可是为什么呢?
我又讲不出来。
近期临近开学,我又收到了不少同学的私信:
“二胖,没学离散数学能学数据结构吗?”
“不学数据结构能学Python吗?”
“。。。”
后来我想了想,其实我当时到大一到大二的时候也曾有过这样的困惑,想提前学习一些知识,又不知道学啥,然后就查资料,查啊查,一天天过去了,啥也没学。
所以,我就用自己的理解来尝试讲一讲“数据结构”为什么这么重要。
01
什么是“数据结构”?
这里我就不说那些“官方的定义”,简单谈谈自己的理解吧。
数据结构是一种抽象的封装。
好像还是有点绕脑,不过没关系,我们继续往下看。
说简单点就是,把一堆基本的数据,按照某种顺序给揉成一坨。
相信大家都吃过饭吧?
做一道菜需要放各种调料,如盐、味精,还有肉等,把它们混在一起就做成了一道菜。
口水鸡是二胖最喜欢的一道菜,这里我们就以口水鸡为例,来讲一讲什么是数据结构。下图是百度百科中口水鸡的做法。
好,下面我就用程序来表示一下,我写的是伪码,大家能懂就好哈。
先来抽象一下“口水鸡”:
对,上述这个结构体就是一个自定义的数据结构,将很多种不同的东西融合在一起;而计算机中的数据结构,则是把一些基本的数据类型,如int、double等融合成一些复杂的数据结构,如map、队列。
抽象完口水鸡再来抽象“你”吧:
然后再来抽象一下“厨师”:
这里的抽象有点随意,不过大家理解就好,我们把一堆很基本的元素抽象成了3个数据结构,这三个元素就是所谓的数据结构。
而平时我们说的链表无非就是把一些基本元素和指针做了融合,树、图也是把指针和一些基本元素融合后再外加一些流程,如函数。
比如python的dict,dict的key,value就是两种相同或者不同的数据类型;dict还提供了一些函数,譬如get(),set()。dict就是一个典型的被封装的数据结构。
所以我说数据结构是一种抽象的封装,当然,数据结构并没有我们举的例子那样简单,但是原理是一样的。
我们平时写程序都是直接去调用这些数据结构,而没有去想它们的内部实现是怎样的。数据结构这门课就是要告诉我们常见的数据结构是如何实现的,比如Vector,map的实现。我们常常听到的譬如平衡二叉树,红黑树,大顶堆等词汇就是出自数据结构这门课。具体了解数据结构后,我们就可以知道队列的内部实现是什么样,词典的内部实现又是什么样。
学习了数据结构以后,我们还可以针对某一场景去选择某种数据结构,比如随机读写时我们会选择数组,而经常插入删除时我们会选择链表。也可以自己创建一些适合项目情景的数据结构,比如口水鸡。
02
数据结构为什么重要?
我认为数据结构之所以重要,是因为它是程序的根基,不说别的,我就举个最近很火的例子。
大家都听过区块链吧?
二胖给大家画个简单的区块链示意图:
大家可以把每个区块简单地理解为一个struct,就像口水鸡那样把很多基础类型放在一个结构体里面。
巧了,这区块链怎么看起来那么像链表?
其实它就是一个链表,只是在下一个链表中存入了上一个链表的hash值,如果上一个区块有一点改变,它的hash值就会改变,就会和下一个链表中存入的hash值不匹配。那么这个区块就作假了,所以说区块链具有不可篡改性和防伪性。
这么牛逼的项目,和数据结构的关系大不大?如果大家没学过链表,是不是看起来有点迷糊?
再给大家举一个例子,网络通信基础协议:IPv4协议。下图是协议的报头:
以前老听别人说,协议、协议,报头、报头。其实学了数据结构你就会知道,所谓协议,就是通信双方都需要安装上图所示的数据结构来收发数据。
数据结构说复杂也复杂,说简单也简单,反正不学是不行的。
03
没学过离散数学能学数据结构吗?
完全可以,其实只要会基本的代码语法就可以学习数据结构,也没有什么必须遵循的学习次序。
我相信之前那个读者问我这个问题是因为他们的课程安排是离散数学先于数据结构。我上大学那会儿也是先学离散数学,再学数据结构,当时我也搞不明白它俩有什么关系,不过我现在明白了。
其实离散数学和数据结构的关系并不是很大,但也不能说没关系。因为离散数学会讲图论、集合论,这些知识都是对数据结构的理论支持。但是两者之间的关系远未大到没学离散数学就学不了数据结构的程度。顺便多说一句,离散数学的数理逻辑、集合论、图论等理论对算法学习也很有帮助。
04
数据结构怎么学?
其实我在之前的文章中已经和大家推荐过学习方法。
首先你一定要会写代码,我学习过C和C++的数据结构,我个人认为熟悉C/C++的数据结构后,可以更好地理解计算机系统。毕竟C和C++比较难,学好了与它们相关的数据结构后,其实其他编程语言的数据结构都是大同小异,可以无压力切换。
当然,你要是不喜欢C/C++,那也没必要非去学,毕竟搞懂它们要耗费的时间成本还比较大,其实直接学python的数据结构也不是不可以。
如果你想学C/C++数据结构,那我再推荐一遍吧。
我学C数据结构用的是下面这本书,是由清华大学严蔚敏著写的。因为当时学校数据结构课用的这本书,所以我就跟着老师认认真真地撸了一遍,学下来的收获挺大,内容相对比较难。这本书也是很多学校的考研指定用书,要考研的同学可以直接学习这本书。
上面推荐那本书适合考试,那么下面我要推荐的第二本书适合学习。
是我自学时用的也是这本书,由清华大学邓俊辉教授著写,这也是我极力推荐的一本书,因为它十分适合自学,豆瓣评分9.1。
为了给大家证明我没有吹牛,可以给大家看几张照片。这本书我在学生时代看了n遍,没看过二胖也是不会推荐给你的。下面两张图是我当时做的笔记,几乎每一页都有自己的批注:
我还发现了一张自己在2016年找工作三刷数据结构时发的朋友圈,当时是国庆节,我在寝室一边看视频课程,一边看书,大家可以看下面这张图,书上的那一页内容是不是和上面那张图是同一页?
但是明显现那一页上面多了不少笔记吧,那是我后面再看那本书的时候记录的。一个寂寞但记忆深刻的国庆,刷完数据结构后,我就拿到了10多个offer,可怕。
说这些只是想告诉大家,这本书我是认认真真看过的,写得非常好。配上对应的课程,相辅相成,坚持看下来,你的编程能力一定会大大提升。
领取专属 10元无门槛券
私享最新 技术干货