都说数据结构重要,那到底什么是数据结构,重要在哪儿?

2018 年 9 月 20 日 算法与数据结构

来自:大数据前沿(微信号:bigdataqianyan)


每次别人问我:“你觉得计算机专业课中哪门课是最重要的?”

我每次都会回答:“数据结构”。


可是为什么呢?

我又讲不出来。


近期临近开学,我又收到了不少同学的私信:

“二胖,没学离散数学能学数据结构吗?”

“不学数据结构能学Python吗?”

“。。。”


后来我想了想,其实我当时到大一到大二的时候也曾有过这样的困惑,想提前学习一些知识,又不知道学啥,然后就查资料,查啊查,一天天过去了,啥也没学。


所以,我就用自己的理解来尝试讲一讲“数据结构”为什么这么重要。


01

什么是“数据结构”?

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


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

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


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


相信大家都吃过饭吧?


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


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


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


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

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

数据结构为什么重要?

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


大家都听过区块链吧?

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



大家可以把每个区块简单地理解为一个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,可怕。


说这些只是想告诉大家,这本书我是认认真真看过的,写得非常好。配上对应的课程,相辅相成,坚持看下来,你的编程能力一定会大大提升。


噢,对了,课程是免费的,大家可以去学堂在线上查看。课程的地址我已经在文章从《深入理解计算机系统》谈一谈编程入门中讲过了,大家可以点击链接去查看相应的内容。



●编号752,输入编号直达本文

●输入m获取文章目录

推荐↓↓↓

大数据与人工智能

更多推荐18个技术类公众微信

涵盖:程序人生、算法与数据结构、黑客技术与网络安全、大数据技术、前端开发、Java、Python、Web开发、安卓开发、iOS开发、C/C++、.NET、Linux、数据库、运维等。

登录查看更多
3

相关内容

离散数学(Discrete mathematics)是研究离散量的结构及其相互关系的数学学科,是现代数学的一个重要分支。
Python地理数据处理,362页pdf,Geoprocessing with Python
专知会员服务
110+阅读 · 2020年5月24日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
160+阅读 · 2020年5月14日
【经典书】数据结构与算法C++,第二版,738页pdf
专知会员服务
165+阅读 · 2020年3月27日
【图神经网络(GNN)结构化数据分析】
专知会员服务
114+阅读 · 2020年3月22日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
Python数据分析:过去、现在和未来,52页ppt
专知会员服务
99+阅读 · 2020年3月9日
《代码整洁之道》:5大基本要点
专知会员服务
49+阅读 · 2020年3月3日
知识图谱本体结构构建论文合集
专知会员服务
102+阅读 · 2019年10月9日
【数据中台】什么是数据中台?
产业智能官
17+阅读 · 2019年7月30日
树形结构为什么不需要归一化?
七月在线实验室
8+阅读 · 2019年4月30日
R语言自然语言处理:关键词提取与文本摘要(TextRank)
R语言中文社区
4+阅读 · 2019年3月18日
图卷积网络到底怎么做,这是一份极简的Numpy实现
胶囊网络,是什么?
人工智能头条
32+阅读 · 2019年1月2日
自然语言处理NLP的坑到底有多大?
专知
45+阅读 · 2018年11月12日
为什么你应该学 Python ?
计算机与网络安全
4+阅读 · 2018年3月24日
五步帮你实现用户画像的数据加工
云栖社区
6+阅读 · 2018年2月4日
Factor Graph Attention
Arxiv
6+阅读 · 2019年4月11日
Arxiv
3+阅读 · 2019年3月1日
Arxiv
5+阅读 · 2018年4月30日
Arxiv
23+阅读 · 2017年3月9日
VIP会员
相关VIP内容
Python地理数据处理,362页pdf,Geoprocessing with Python
专知会员服务
110+阅读 · 2020年5月24日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
160+阅读 · 2020年5月14日
【经典书】数据结构与算法C++,第二版,738页pdf
专知会员服务
165+阅读 · 2020年3月27日
【图神经网络(GNN)结构化数据分析】
专知会员服务
114+阅读 · 2020年3月22日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
Python数据分析:过去、现在和未来,52页ppt
专知会员服务
99+阅读 · 2020年3月9日
《代码整洁之道》:5大基本要点
专知会员服务
49+阅读 · 2020年3月3日
知识图谱本体结构构建论文合集
专知会员服务
102+阅读 · 2019年10月9日
相关资讯
【数据中台】什么是数据中台?
产业智能官
17+阅读 · 2019年7月30日
树形结构为什么不需要归一化?
七月在线实验室
8+阅读 · 2019年4月30日
R语言自然语言处理:关键词提取与文本摘要(TextRank)
R语言中文社区
4+阅读 · 2019年3月18日
图卷积网络到底怎么做,这是一份极简的Numpy实现
胶囊网络,是什么?
人工智能头条
32+阅读 · 2019年1月2日
自然语言处理NLP的坑到底有多大?
专知
45+阅读 · 2018年11月12日
为什么你应该学 Python ?
计算机与网络安全
4+阅读 · 2018年3月24日
五步帮你实现用户画像的数据加工
云栖社区
6+阅读 · 2018年2月4日
Top
微信扫码咨询专知VIP会员