作者 l 二胖
来源 l 大数据前沿(公众号ID: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的数据结构也不是不可以。
那么,想学习数据结构有什么好的课程推荐吗?免费的?还是付费购买?
请大家相信,真正能让你学到知识技能的精品课程,绝大部分是付费课程,但是这一次给大家推荐一个绝佳的学习福利。
七月在线【数据结构班】,原价99元,限时0元免费报名,来自BAT的『三大金牌讲师』联合授课,提供讲师答疑、课程代码和课件、还赠送免费书籍。
这是七月在线最新的数据结构课程,将给学员详细介绍数据结构原理,并配合leetcode直播刷题,让你一举窥探大牛讲师的思考过程、coding过程,使学员对于各种牛逼的编程技巧一览无余。助力同学们打好基本功,在技术进阶之路上走的更远~
想学【数据结构与算法】,请扫码关注公众号,回复:666,免费进群领取免单券。
本文来源:公众号 @大数据前沿,作者二胖,一个文章被知乎日报转载n次,收藏量超过100k的原创作者。除了技术文章,公众号还常常发表与职场、互联网及生活有关的文章,欢迎关注。
今日学习推荐
▼
【机器学习集训营第六期】
三个月挑战年薪四十万
报名即送
《机器学习工程师 第八期》《深度学习 第三期》
且组团还能优惠,2人及2人以上组团报名
可各减500元
想组团者请加
微信客服:julyedukefu_02
点击“阅读原文”立即报名
面试常考:Python中的os模块和sys模块「文末送Python畅销书」