应该有不少伙伴都学过数据结构吧?
这数据结构真的搞得我头大,这都是啥啊
不怕你笑话,我在大学四年都搞不懂数据结构,这是个什么东西?我真的那么蠢吗?非常尴尬)
当我在大学的时候,我总觉得这件事太抽象了,无法理解。我越学就越跟不上,学到一半就掉队了。基本上就是属于放弃治疗了。后来我知道这本书中写的是伪代码。我说怎么能把我看得一楞一楞的?就这样,在大学四年的时间里,我愣是没有搞懂数据结构.
然后嘞,那些搞懂的,顺利参加校招,拿到满意offer,进入大厂,迎娶白富美……而我呢?
面试官:“数据结构有了解吗?”
我:“啥?你说啥?数据结构是个啥?”
然后我就顺利毕业了……
扎心不,老铁?你是不是也是这样啊,正在读大学,数据结构也是一脸懵逼,或者毕业了,还是不知道数据结构到底是个啥,说出去怪尴尬,没事,看了今天这篇文章,保准你可以出去大声喊“我……终于……知道……数据结构是个啥啦”(拉长音……)
数据结构是个啥玩意啊?
当我第一次接触“数据结构”时,我觉得它有点抽象,但我不认为它很难理解。嗯,应该是这样的。谁知道,我学得越多,就越糊涂。让我们看看这个数据结构是如何定义的:
数据结构是相互之间存在一种或多种特定关系的数据元素的**,换句话说,数据结构是带“结构”的数据元素的**,“结构”就是指数据元素之间存在的关系。
我不知道你看到这个定义时的感受。但我当时是有点困惑,现在的我看着这个定义,
恩
蛮好的
聊聊数据在计算机中的存储
为了更好地理解数据结构,你需要首先了解计算机中数据的存储。举个简单的例子。例如,我们需要存储一个数字,比如1024。如何储存?我们知道代码(Java)通常是这样写的:
int a = 1024;
那就是定义一个整型。写完后,它就保存在我们的电脑上。事实上市保存在我们电脑的硬盘上。只有当程序加载到内存中时,它才能被CPU读取和运行。所以,这个1024实际上需要加载到内存中。这里我们需要注意的是,这个1024是我们编写的程序中的一个整型变量。你需要明白的是,我们说它保存在内存中,是因为我们想运行这个程序。
一旦运行此程序,此程序中包含的数据将加载到内存中,就像这里的1024一样被保存到内存中。怎么怎么保存呢?这里你还要记住这么一句话:
计算机中的数据都是以二进制的形式保存的
因此嘞,这个1024是十进制,要转换成二进制保存在内存中,内存有一定的大小,你要保存一个整数,你是不是得占用内存的一些空间啊,假如是这样:
你看,这样这个1024就被存在了内存中,当然,你得明白,这个1024其实被转换成了二进制形式,我这样只是为了便于表示说明。
再来说数据结构
在我们了解了数据是如何存储在计算机中之后,我们可以再来看看数据结构。定义我们之前看过了,怎么去理解嘞。顾名思义,数据结构就是数据和结构。结构可以理解为关系,即数据之间的关系
这样说还是有点困惑?你可以这样理解。首先,你应该知道数据结构。它是一门学科。这是干什么的?说白了,就是研究数据该怎么存储?
你可能说了,还研究怎么存储,难道存储不都是一样的吗,虽然这个问题有点chun,但是嘞,确实是个让小白疑惑的问题,数据的存储当然是不同的。例如,如果我们要存储五个整数{1、2、3、4、5},那么如何将它们存储在内存中
可能是这样
在内存中是排成一排的,一个挨着一个,
也有可能是这样!!!
就是在内存中没啥顺序,零散的存放,所以啊你看,对于数据,可以按照不同的方式去存储,是给你连续挨着存放,还是存放在哪就存放在哪啊,你可能要问啦,哪这咋整,这个嘛,就得看数据本身以及其他相关要求,看看你这个数据以后准备怎么用,然后考虑怎么存放比较合适。
所以啊,数据结构啊,就是来管理数据在内存中的存储的,比如,有一些数据要在内存总存储,那就得看数据结构,数据结构让你怎么存放你就得怎么存放,让你连续存放,你就不能撒花似的哪都是的。
另外啊,你还需要知道,这里的数据结构是个统称,就好比水果,它有香蕉苹果和橘子,数据结构也是一样啊,它是个总称,有数组,链表,栈和队列等等,这些都属于数据结构,就好比,香蕉苹果和橘子都是水果,这个好理解吧!
然后嘞,这些数据结构啊,每个都有它们自己的一些特点,这些特点就是规定如果数据选择了它这种数据结构来存储,就要按照它的要求在内存中存放,比如你选择了数组,那么你这些数据就要在内存中连续存储,一个挨着一个,不能乱,而如果你选择了链表这种存储结构,那在内存中就不要求你非得连续存储,随意,有空地你就可以存储。
所以你看,不同的数据结构有它特定的用途……
到了这里,你差不多就理解了数据结构是个啥了吧,也就是说啊,数据结构就是研究数据怎么存储嘞,然后数据结构是个总称,好比水果,其下有数组,链表,栈和队列这些数据结构,好比水果有香蕉苹果和橘子,其实嘞,你就可以把数据结构想象成一个容器,容器是干啥的嘞,盛东西的啊,这里就是存储数据的,而这些容器形状各异,你选择了不同的容器(数据结构),那么就意味着数据的存储形式是不同的。
说了这么多,就这些吗?当然不是。我们可以想象,我们上面提到的五个数据之间是没有联系的。最多,当数据连续存储时,它们彼此相邻。这样,就形成了一对一的关系,就像排队一样。我在你前面,你在我后面。
但还有另一种数据。比如我们要存储一个家谱中的数据信息,比如这样:
你怎么把这些数据存储到内存中呢?这些不同于那些冷冰冰的数字。把它们保存在内存中就万事大吉了。当我们保存这种家谱数据时,我们实际上不仅保存了数据,而且保存了数据之间的关系。
经过以上的介绍,你一定了解个大概了。然后只需要选择一个合适得数据结构来存储它,说的不错。我们可以分析家谱数据,发现这些数据有一对多的关系。例如,爷爷有三个儿子,叔叔有两个孩子。数据结构中有一个名为tree(数) 的结构,可以存储此类数据。
上面提到的一对一和一对多都是表示数据之间的关系,其实就是数据结构中的结构。有人可能会问,有多对多的关系吗?**一定是有的,那么这种关系如何储存呢?没关系。数据结构中还有一个叫做图德数据结构,就是专门针对多对多的数据的。
所以你看,数据结构是个啥,不就是管着数据该怎么存储嘛?
数据结构都有哪些嘞?
那么,你肯定好奇,那么,数据结构都有哪些啊?数据结构总的来说有如下三大类:
接下来我对这些数据结构做一下简单的介绍。
在我的专栏有详细介绍,我就不多说了
实际上,对于数据的存储该选择什么样的数据结构,那就要取决于数据的逻辑结构和物理结构,再次声明下,这点的理解很重要,以下我说的每个字都不要漏掉哦
啥是逻辑结构?
不知道你们之前有没有想过这个问题,数据的逻辑结构是个啥?可能你有点迷糊,但是说起来真的很简单:
数据的逻辑结构就是指的数据之间存在的关系
我想经过上面的讲解,你这里立马就知道,这里指的关系就是上面说的什么一对一,一对多和多对多了,不错,就是这些,这里的数据的逻辑结构指的就是这么些个关系,就好比我上面给的那个图,我们再来看一下:
我想经过以上的解释,你会马上知道这里的关系是指一对一,一对多,多对多。不错,就是这些。这里的数据的逻辑结构指的就是这些关系,就像我上面给出的图一样。我们再来看看:
例如,上图中的大伯,二伯和爸爸,他们都属于兄弟关系。爷爷有三个儿子,大伯有两个孩子,这种都是一对多的关系。如果要这样存储数据,不仅要存储基本的数据信息,还要存储它们之间现有的关系。
而这种关系即是数据之间的逻辑结构。
总之,数据之间的逻辑结构大致可以分为三种类型,即:
其实吧,给到你一些数据,你基本上都能判断出这些数据是什么关系,也就是说,数据的逻辑结构不难辨认。
到了这里,你有没有发现,这三种逻辑结构的数据,正好可以用我们上面介绍的三大类的数据结构去存储,想一下,也就是下面三种:
有没有发现,万变不离其中啊,只是我们了解了逻辑结构这个知识点后,你会觉得这块的只是更加的完整。
物理结构是什么?
我们在上面知道了逻辑结构是什么,所以我们可以分析数据之间的逻辑结构,看看应该使用哪个数据结构来存储数据。这看似已经万事大吉,没啥事了,但是,实则不然,其实吧,说到这里,牵涉到的知识点又不少,我这里只给你说重点,详细的以后单独拿出来唠叨唠叨。
请先记住非常重要的一句话:
数据结构的存储方式只有两种:数组(顺序存储)和链表(链式存储)
啥意思嘞?其实吧,数组和链表是数据结构中的数据结构,其他的数据结构都可以用数组和链表来实现,你比如拿栈来说吧,可以用数组来实现栈,这就叫做顺序栈,也可以用链表来实现栈这个就叫做链式栈。
所以啊,每种数据结构的存储其实都可以分为顺序存储(用数组实现)和链式存储(用链表实现)
你比如说要使用队列这个数据结构来存储数据,那实际上,就可以分为顺序队列实现和链式队列实现,也就是看你实际内存中怎样去存储这些数据,因此,你可以看出,数组和链表是数据结构中的基石啊!
那么,新的问题就来了,既然对于每个数据结构都可以有顺序存储和链式存储,那么即时我依据数据的逻辑结构选择了一个数据结构,那么我怎么来确定是要顺序存储还是要链式存储呢?
这个问题的关键所在就是要分析数据的物理结构了?
数据的物理结构是什么?如果你以前没有想过这个问题,你会感到困惑,但也很简单:
数据的物理结构就是指的数据在内存中的存储是连续存储,也就是集中在一块的意思,还是零散的分散存储。
也就是说,对于一些数据,我们可以分析它们之间的逻辑结构,知道数据之间有什么样的关系。我们可以确定使用什么样的数据结构,但也需要分析数据的物理结构。
可是,你有没有发现问题,我们怎么知道数据的物理结构是啥呢?
这里要看两点,来让我们决定数据的物理结构,分别是:
什么意思?以内存空间的状态为例。首先,我们需要知道,连续存储需要连续的内存空间。例如,如果我们想存储10m大小的数据,也就需要10m的连续的内存空间,但是如果没有的话那肯定是用不了连续存储了,那只能分散存储,否则存储不成功啊。
然后看看数据的用途。连续存储和分散存储的主要区别之一是,它会影响后续的数据操作。对于连续存储,它具有很高的数据遍历效率。因此,如果你存储的这些数据后续的操作中遍历比较频繁,那肯定优先选择连续存储,当然,如果你后续的数据操作中会进行比较多的更新操作的话,那就优先选择分散存储了,因为它效率更高。
所以我们根据内存的空间状态和数据的用途来确定数据的物理结构是连续存储还是分散存储,然后再选择对应的存储方式,也就是:
更详细的其他数据结构,查看其他章节