重要的一课!
共 3824字,需浏览 8分钟
·
2021-05-10 19:56
早上四点多起来,回复了微信小小号上近 100 条消息,很多都回复的蛮仔细!
累到不累,因为我喜欢和读者交流的感觉。但也有伤心的,好不容易敲了很多字,发过去,发现人已经不在了,麻了麻了。我是能理解的,毕竟关注你了,加了微信,给你发了信息,等啊等,一直不回复,算怎么回事,耍什么大牌!
当然了,这也是没办法的事,一对多,再加上工作、生活、读书、写作、学习,很难做到及时响应,尤其是需要沉浸式工作的时候,手机基本上是静音的状态。
有问题,尽管来问就行了,尽量不要问在吗?毕竟二哥是个活人,哈哈。像下面这样的读者,我就很喜欢,直接抛出问题,语气也很舒适。
有些直接甩了红包,遇到这种情况我一般第一时间就冲过来了,哈哈哈哈哈哈。
当然了,我也不是全天候都在看手机,像这个读者的信息是昨天 22 点发的,我那时候已经睡下了,但我早上 4 点多起来后就及时回复了。
温馨提示一点。大家不要学我起这么早,每个人的作息习惯不一样,还是要保证足够的睡眠,毕竟互联网打工人很辛苦的。我想表达的是,只要我看到信息,都会一条不落的回复,因为我觉得大家给我发信息是对我的信任,我必须得做出回应。只不过不一定能及时回复,还希望大家能够理解。
留个包袱,如果今年公众号的增长能突破一个关键性的节点的话,我也打算搞个知识星球,把这些问题都沉淀下,后面说不定还能整理出一本 PDF。
不说这些了。早上回复的这些信息当中,有一条我觉得蛮想在公众号里给大家统一说明一下的。
二哥,你觉得计算机专业课中哪门课是最重要的?
对于我们计算机专业的人来说,我觉得有 6 门课非常非常的重要:
C 语言 计算机操作系统 计算机组成原理 计算机网络 数据结构 算法
不管你以后从事的是 Java 开发、C++ 开发、还是 Python 开发,也或者是前端开发,这几门课能在大学里早点学就早点学,如果时间不够用或者错过了,工作后一定要找机会补一补。前提条件是,你对技术有追求,想在这方面有更深的造诣。
这 6 门课涉及到的知识点还是非常庞大的,没办法通过一篇文章全部说清楚,所以这次,我打算重点说说数据结构。
什么是数据结构?
数据结构是一种具有一定逻辑关系,在计算机中应用某种存储结构,并且封装了相应操作的数据元素集合。它包含三方面的内容,逻辑关系、存储关系及操作。不同种类的数据结构适合于不同种类的应用,而部分甚至专门用于特定的作业任务。例如,计算机网络依赖于路由表运作,B 树高度适用于数据库的封装。
菜鸟教程上对数据结构的定义我觉得还是蛮正式(官方)的,简单点说,数据结构就是把一堆数据,按照某种格式揉成一坨。
大家喜欢吃宫保鸡丁吗?
反正二哥挺喜欢这道菜的。我就以宫保鸡丁为例,来讲一讲数据结构吧。维基百科上是这样定义的。
宫保鸡丁(英语:Kung Pao chicken或Kung-Pao Chicken),又称宫爆鸡丁,呈糊辣荔枝味,源于黔菜、流传至鲁而后成于川菜的一道川味名菜。贵州、山东和四川三地对这道菜的做法不完全一样,称呼也有差异。贵州称为糊辣子鸡丁,山东则名为酱爆鸡丁,而四川是以宫保鸡丁为名的。
来,抽象下宫保鸡丁。
struct KungPaoChicken {
鸡肉 = []
花生 = []
葱段 = []
花椒 = []
辣椒 = []
}
这个结构体(struct 是 C 语言中的一个概念)就是一个自定义的数据结构,将很多不同的配料融合在了一起。对于计算机的数据结构来说,只不过是把这些配料换成了基本数据类型。
拿 Java 来举例,基本的数据类型有 int、char、double 这些,复杂点的有 String(引用数据类型),底层是 char 型的数组,而那些自定义的类型不过是对基本数据类型和引用类型的封装。
抽象完宫保鸡丁再来抽象一下二哥吧。
class 二哥 {
int age = 18;
double 体重 = 65kg;
void eat(宫保鸡丁) {
体重 += 1kg;
}
}
伪代码不是很严谨哈,大家理解这个意思就行了。
说到底,数据结构不过是一种抽象后的封装。像 Java,它之所以流行的一个很重要的原因,就是它提供了多种多样的、方便开发者调用的数据结构,比如说对数组的封装 ArrayList、对链表的封装 LinkedList、对哈希表的封装 HashMap、ConcurrentHashMap 等等。C 语言就没有这些,想用的话,就得自己封装。但 Java 和 C 语言的基本数据类型是一致的,int、float 这些都是相通的。
对于初学者来说,平常敲代码都是直接去调用数据结构的,是很少去想这些数据结构是怎么实现的。
当一个初学者向高级程序员迈进的时候,就必须得静下心来,去搞清楚 ArrayList 和 LinkedList 的内部实现,搞清楚之后就会明白,之所以它们在增删改查的时候性能上有差异,就是因为它们的内部使用了不同的数据结构所导致的。
有一说一,我在 2008 年刚学 Java 的那会,真的是不理解,为什么明明有了 ArrayList,Java 还要设计 LinkedList,不都是集合嘛!
害!
数据结构为什么这么重要?
我直接放大招吧,甩一段清华大学计算机系教授邓俊辉老师话吧。
数据结构是计算机科学的关键内容,也是构建高效算法的必要基础。其中涉及的知识,在相关专业的课程系统中始终处于核心位置。以 ACM/IEEE Computing Curricula(计算机教学大纲)为例,其中对于几个相关专业(计算机科学、计算机工程、信息系统、信息技术、软件工程)的共同要求中,数据结构与算法作为程序设计概念与技能的核心,紧随在数学之后,排在第二位。
数据结构说复杂也不复杂,说简单也不简单,这不重要,重要的是必须得学!
有读者可能会问,“我数学学的不好,学数据结构能学会吗?”
说句实在话,数据结构和数学之间没有必然的关系。我上小学的时候,参加过洛阳市的奥林匹克数学竞赛,还得了三等奖;初中的时候,数学成也一直保持得不错,但上了高中之后,由于贪玩,数学成绩一落千丈,成了瘸腿课。大学的时候对离散数学、微积分这些更是头大,压根没怎么学。
但这并不妨碍我学习数据结构,真的。数据结构中,树算是最难的一块了,像数组、链表、栈、哈希表这些相对来说,计算机专业的,只要稍微下点功夫,都是能掌握的。
说了这么多,数据结构到底该怎么学呢?
如果你有 C/C++ 的底子,我给推荐两本书。
第一本,《趣学数据结构》
说到这,多说一嘴。2018 年的时候,人民邮电出版社的张老师邀请我出一本 Java 方面的书,我当时想命名为《趣学 Java》。张老师说,刚好之前和陈小玉老师合作出了一本《趣学算法》的书,要不发一本你看看吧。
你别说,这本书还挺适合拿来作为算法的入门书呢。后来,陈小玉老师又出了一本新书,叫《趣学数据结构》,我看了,虽然离“趣”字有点距离,但很适合作为一门数据结构方面的入门书。
第二本,《数据结构(C++语言版)》
对,清华大学邓俊辉教授编著的,豆瓣评分也蛮高的。这本书还配套了视频课程,是免费的,可以在学堂在线上看,我之前也有推荐过。
https://www.xuetangx.com/search?query=数据结构
课程质量木得说,算是国家级精品课了。大家有时间的话,一定要刷一遍。
如果你有 Java 的底子,我也给推荐两本书。
第一本,《数据结构与算法分析(Java 语言描述)》
虽然翻译得不怎么样,但内容很全面,适合拿来作为一本数据结构的入门书。
第二本,《算法(第 4 版)》
虽然名为算法,但大家都知道,算法是基于数据结构的,数组、队列、栈、堆、二叉树、哈希表等等,这些数据结构都讲到了。
如果时间比较紧的话,C/C++ 程序员只看《数据结构(C++语言版)》就行了,Java 程序员只看《算法(第 4 版)》就行了。如果一遍没看懂的话,再看一遍就好了。
有网友“三色院堇子的老公”说得好。
数据结构就是你已经写了几百万行,然后数据结构减到 90 万行,性能还翻倍,嗯,终于学会了!😎
在我看来,学习分为两种,一种是先学理论,后走实战检验,一种是先实战采坑,后补理论。
有些人,如果没有理论基础,完全不知道怎么下手写代码。
而有些人呢,就是喜欢先敲代码,因为一上来看书很容易懵逼,只有经过一定量的代码实战后,再去读书就会有一种豁然开朗的感觉。
两种学习方法我觉得都没问题,重要的是看你适合哪一种。但不管选哪一种,记得学数据结构~~~~
我是二哥,下期见。