我用自己的理解来尝试讲一讲“数据结构”与“离散数学”为什么这么重要。

01

什么是“数据结构”?

这里我就不说那些“官方的定义”,简单谈谈自己的理解吧。

数据结构是一种抽象的封装。

好像还是有点绕脑,不过没关系,我们继续往下看。

说简单点就是,把一堆基本的数据,按照某种顺序给揉成一坨。

相信大家都吃过饭吧?

做一道菜需要放各种调料,如盐、味精,还有肉等,把它们混在一起就做成了一道菜。

口水鸡是我最喜欢的一道菜,这里我们就以口水鸡为例,来讲一讲什么是数据结构。下图是百度百科中口水鸡的做法。

离散数学及其应用如何(数据结构与离散数学)(1)

好,下面我就用程序来表示一下,我写的是伪码,大家能懂就好哈。

先来抽象一下“口水鸡”:

struct 口水鸡 { 鸡肉 = [] 葱 = [] 姜 = [] 麻酱 = [] 盐 = [] 花椒 = [] 植物油 = [] }

对,上述这个结构体就是一个自定义的数据结构,将很多种不同的东西融合在一起;而计算机中的数据结构,则是把一些基本的数据类型,如int、double等融合成一些复杂的数据结构,如map、队列。

抽象完口水鸡再来抽象“你”吧:

class 你{ float 体重 = 80kg; int 年龄 = 20; 。。。 此处省略一万字 。。。 bool eat (口水鸡){ 口水鸡.鸡肉 -=50克; 体重 =50克; } }

然后再来抽象一下“厨师”:

class 厨师{ 口水鸡 做菜(调料){ 口水鸡 小鸡 = new 口水鸡(); 小鸡.append(300克鸡肉); 把锅烧热; 加入调料; return 小鸡; } }

这里的抽象有点随意,不过大家理解就好,我们把一堆很基本的元素抽象成了3个数据结构,这三个元素就是所谓的数据结构

而平时我们说的链表无非就是把一些基本元素和指针做了融合,树、图也是把指针和一些基本元素融合后再外加一些流程,如函数

比如python的dict,dict的key,value就是两种相同或者不同的数据类型;dict还提供了一些函数,譬如get(),set()。dict就是一个典型的被封装的数据结构。

所以我说数据结构是一种抽象的封装,当然,数据结构并没有我们举的例子那样简单,但是原理是一样的。

我们平时写程序都是直接去调用这些数据结构,而没有去想它们的内部实现是怎样的。数据结构这门课就是要告诉我们常见的数据结构是如何实现的,比如Vector,map的实现。我们常常听到的譬如平衡二叉树,红黑树,大顶堆等词汇就是出自数据结构这门课。具体了解数据结构后,我们就可以知道队列的内部实现是什么样,词典的内部实现又是什么样。

学习了数据结构以后,我们还可以针对某一场景去选择某种数据结构,比如随机读写时我们会选择数组,而经常插入删除时我们会选择链表。也可以自己创建一些适合项目情景的数据结构,比如口水鸡。

02

数据结构为什么重要?

我认为数据结构之所以重要,是因为它是程序的根基,不说别的,我就举个最近很火的例子。

大家都听过区块链吧?

给大家画个简单的区块链示意图:

离散数学及其应用如何(数据结构与离散数学)(2)

大家可以把每个区块简单地理解为一个struct,就像口水鸡那样把很多基础类型放在一个结构体里面。

巧了,这区块链怎么看起来那么像链表?

其实它就是一个链表,只是在下一个链表中存入了上一个链表的hash值,如果上一个区块有一点改变,它的hash值就会改变,就会和下一个链表中存入的hash值不匹配。那么这个区块就作假了,所以说区块链具有不可篡改性和防伪性。

这么牛逼的项目,和数据结构的关系大不大?如果大家没学过链表,是不是看起来有点迷糊?

再给大家举一个例子,网络通信基础协议:IPv4协议。下图是协议的报头:

离散数学及其应用如何(数据结构与离散数学)(3)

以前老听别人说,协议、协议,报头、报头。其实学了数据结构你就会知道,所谓协议,就是通信双方都需要安装上图所示的数据结构来收发数据。数据结构说复杂也复杂,说简单也简单,反正不学是不行的。

03

没学过离散数学能学数据结构吗?

完全可以,其实只要会基本的代码语法就可以学习数据结构,也没有什么必须遵循的学习次序

我相信之前那个读者问我这个问题是因为他们的课程安排是离散数学先于数据结构。我上大学那会儿也是先学离散数学,再学数据结构,当时我也搞不明白它俩有什么关系,不过我现在明白了。

其实离散数学和数据结构的关系并不是很大,但也不能说没关系。因为离散数学会讲图论、集合论,这些知识都是对数据结构的理论支持。但是两者之间的关系远未大到没学离散数学就学不了数据结构的程度。顺便多说一句,离散数学的数理逻辑、集合论、图论等理论对算法学习也很有帮助。

04

数据结构怎么学?

其实我在之前的文章中已经和大家推荐过学习方法。

首先你一定要会写代码,我学习过C和C 的数据结构,我个人认为熟悉C/C 的数据结构后,可以更好地理解计算机系统。毕竟C和C 比较难,学好了与它们相关的数据结构后,其实其他编程语言的数据结构都是大同小异,可以无压力切换。

当然,你要是不喜欢C/C ,那也没必要非去学,毕竟搞懂它们要耗费的时间成本还比较大,其实直接学python的数据结构也不是不可以。

,