精华内容
下载资源
问答
  • 数据结构真的搞得我头大,这都是啥啊不怕你笑话,我在大学四年都搞不懂数据结构,这是个什么东西?我真的那么蠢吗?非常尴尬)当我在大学的时候,我总觉得这件事太抽象了,无法理解。我越学就越跟不上,学到一半就...

    应该有不少伙伴都学过数据结构吧?

    这数据结构真的搞得我头大,这都是啥啊

    不怕你笑话,我在大学四年都搞不懂数据结构,这是个什么东西?我真的那么蠢吗?非常尴尬)

    当我在大学的时候,我总觉得这件事太抽象了,无法理解。我越学就越跟不上,学到一半就掉队了。基本上就是属于放弃治疗了。后来我知道这本书中写的是伪代码。我说怎么能把我看得一楞一楞的?就这样,在大学四年的时间里,我愣是没有搞懂数据结构.

    然后嘞,那些搞懂的,顺利参加校招,拿到满意offer,进入大厂,迎娶白富美……而我呢?

    面试官:“数据结构有了解吗?”

    我:“啥?你说啥?数据结构是个啥?”

    然后我就顺利毕业了……

    扎心不,老铁?你是不是也是这样啊,正在读大学,数据结构也是一脸懵逼,或者毕业了,还是不知道数据结构到底是个啥,说出去怪尴尬,没事,看了今天这篇文章,保准你可以出去大声喊“我……终于……知道……数据结构是个啥啦”(拉长音……)

    数据结构是个啥玩意啊?

    当我第一次接触“数据结构”时,我觉得它有点抽象,但我不认为它很难理解。嗯,应该是这样的。谁知道,我学得越多,就越糊涂。让我们看看这个数据结构是如何定义的:

    数据结构是相互之间存在一种或多种特定关系的数据元素的集合,换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。

    我不知道你看到这个定义时的感受。但我当时是有点困惑,现在的我看着这个定义,

    蛮好的

    聊聊数据在计算机中的存储

    为了更好地理解数据结构,你需要首先了解计算机中数据的存储。举个简单的例子。例如,我们需要存储一个数字,比如1024。如何储存?我们知道代码(Java)通常是这样写的:

    int a = 1024;

    那就是定义一个整型。写完后,它就保存在我们的电脑上。事实上市保存在我们电脑的硬盘上。只有当程序加载到内存中时,它才能被CPU读取和运行。所以,这个1024实际上需要加载到内存中。这里我们需要注意的是,这个1024是我们编写的程序中的一个整型变量。你需要明白的是,我们说它保存在内存中,是因为我们想运行这个程序。

    一旦运行此程序,此程序中包含的数据将加载到内存中,就像这里的1024一样被保存到内存中。怎么怎么保存呢?这里你还要记住这么一句话:

    计算机中的数据都是以二进制的形式保存的

    因此嘞,这个1024是十进制,要转换成二进制保存在内存中,内存有一定的大小,你要保存一个整数,你是不是得占用内存的一些空间啊,假如是这样:

    8ee8f7f2a9317da9f25f6632f430661e.png

    你看,这样这个1024就被存在了内存中,当然,你得明白,这个1024其实被转换成了二进制形式,我这样只是为了便于表示说明。

    再来说数据结构

    在我们了解了数据是如何存储在计算机中之后,我们可以再来看看数据结构。定义我们之前看过了,怎么去理解嘞。顾名思义,数据结构就是数据和结构。结构可以理解为关系,即数据之间的关系

    这样说还是有点困惑?你可以这样理解。首先,你应该知道数据结构。它是一门学科。这是干什么的?说白了,就是研究数据该怎么存储?

    你可能说了,还研究怎么存储,难道存储不都是一样的吗,虽然这个问题有点chun,但是嘞,确实是个让小白疑惑的问题,数据的存储当然是不同的。例如,如果我们要存储五个整数{1、2、3、4、5},那么如何将它们存储在内存中

    可能是这样

    在内存中是排成一排的,一个挨着一个,

    63a41af65d998e341efbadd6e814db29.png

    也有可能是这样!!!

    e31e5b6e759fabd7513e65d2244e6714.png

    就是在内存中没啥顺序,零散的存放,所以啊你看,对于数据,可以按照不同的方式去存储,是给你连续挨着存放,还是存放在哪就存放在哪啊,你可能要问啦,哪这咋整,这个嘛,就得看数据本身以及其他相关要求,看看你这个数据以后准备怎么用,然后考虑怎么存放比较合适。

    所以啊,数据结构啊,就是来管理数据在内存中的存储的,比如,有一些数据要在内存总存储,那就得看数据结构,数据结构让你怎么存放你就得怎么存放,让你连续存放,你就不能撒花似的哪都是的。

    另外啊,你还需要知道,这里的数据结构是个统称,就好比水果,它有香蕉苹果和橘子,数据结构也是一样啊,它是个总称,有数组,链表,栈和队列等等,这些都属于数据结构,就好比,香蕉苹果和橘子都是水果,这个好理解吧!

    然后嘞,这些数据结构啊,每个都有它们自己的一些特点,这些特点就是规定如果数据选择了它这种数据结构来存储,就要按照它的要求在内存中存放,比如你选择了数组,那么你这些数据就要在内存中连续存储,一个挨着一个,不能乱,而如果你选择了链表这种存储结构,那在内存中就不要求你非得连续存储,随意,有空地你就可以存储。

    所以你看,不同的数据结构有它特定的用途……

    到了这里,你差不多就理解了数据结构是个啥了吧,也就是说啊,数据结构就是研究数据怎么存储嘞,然后数据结构是个总称,好比水果,其下有数组,链表,栈和队列这些数据结构,好比水果有香蕉苹果和橘子,其实嘞,你就可以把数据结构想象成一个容器,容器是干啥的嘞,盛东西的啊,这里就是存储数据的,而这些容器形状各异,你选择了不同的容器(数据结构),那么就意味着数据的存储形式是不同的。

    说了这么多,就这些吗?当然不是。我们可以想象,我们上面提到的五个数据之间是没有联系的。最多,当数据连续存储时,它们彼此相邻。这样,就形成了一对一的关系,就像排队一样。我在你前面,你在我后面。

    但还有另一种数据。比如我们要存储一个家谱中的数据信息,比如这样:

    603712b94c3dd5d4ae551168eaf1ddba.png

    你怎么把这些数据存储到内存中呢?这些不同于那些冷冰冰的数字。把它们保存在内存中就万事大吉了。当我们保存这种家谱数据时,我们实际上不仅保存了数据,而且保存了数据之间的关系。

    经过以上的介绍,你一定了解个大概了。然后只需要选择一个合适得数据结构来存储它,说的不错。我们可以分析家谱数据,发现这些数据有一对多的关系。例如,爷爷有三个儿子,叔叔有两个孩子。数据结构中有一个名为tree(数) 的结构,可以存储此类数据。

    上面提到的一对一和一对多都是表示数据之间的关系,其实就是数据结构中的结构。有人可能会问,有多对多的关系吗?答案一定是有的,那么这种关系如何储存呢?没关系。数据结构中还有一个叫做图德数据结构,就是专门针对多对多的数据的。

    所以你看,数据结构是个啥,不就是管着数据该怎么存储嘛?

    数据结构都有哪些嘞?

    那么,你肯定好奇,那么,数据结构都有哪些啊?数据结构总的来说有如下三大类:

    • 线性表,也就是数组、链表、栈和队列;
    • 树结构,包括普通树,二叉树,红黑树等等;
    • 图存储结构,这玩意有点难;

    接下来我对这些数据结构做一下简单的介绍。

    • 线性表
    • 树结构
    • 图结构
    • 等等

    在我的专栏有详细介绍,我就不多说了

    实际上,对于数据的存储该选择什么样的数据结构,那就要取决于数据的逻辑结构和物理结构,再次声明下,这点的理解很重要,以下我说的每个字都不要漏掉哦

    啥是逻辑结构?

    不知道你们之前有没有想过这个问题,数据的逻辑结构是个啥?可能你有点迷糊,但是说起来真的很简单:

    数据的逻辑结构就是指的数据之间存在的关系

    我想经过上面的讲解,你这里立马就知道,这里指的关系就是上面说的什么一对一,一对多和多对多了,不错,就是这些,这里的数据的逻辑结构指的就是这么些个关系,就好比我上面给的那个图,我们再来看一下:

    我想经过以上的解释,你会马上知道这里的关系是指一对一,一对多,多对多。不错,就是这些。这里的数据的逻辑结构指的就是这些关系,就像我上面给出的图一样。我们再来看看:

    43cd95cc0f608aeef7ad781acf0fd87a.png

    例如,上图中的大伯,二伯和爸爸,他们都属于兄弟关系。爷爷有三个儿子,大伯有两个孩子,这种都是一对多的关系。如果要这样存储数据,不仅要存储基本的数据信息,还要存储它们之间现有的关系。

    而这种关系即是数据之间的逻辑结构。

    总之,数据之间的逻辑结构大致可以分为三种类型,即:

    一对一:就是那种你挨着我,我挨着你的数据,比如数组一对多:就是我们上面画的家谱图那样多对多:这个比如说地图,或者一些四通八达的路,能明白我的意思吧

    其实吧,给到你一些数据,你基本上都能判断出这些数据是什么关系,也就是说,数据的逻辑结构不难辨认。

    到了这里,你有没有发现,这三种逻辑结构的数据,正好可以用我们上面介绍的三大类的数据结构去存储,想一下,也就是下面三种:

    1. 线性表:一对一
    2. 树结构:一对多
    3. 图结构:多对多

    有没有发现,万变不离其中啊,只是我们了解了逻辑结构这个知识点后,你会觉得这块的只是更加的完整。

    物理结构是什么?

    我们在上面知道了逻辑结构是什么,所以我们可以分析数据之间的逻辑结构,看看应该使用哪个数据结构来存储数据。这看似已经万事大吉,没啥事了,但是,实则不然,其实吧,说到这里,牵涉到的知识点又不少,我这里只给你说重点,详细的以后单独拿出来唠叨唠叨。

    请先记住非常重要的一句话:

    数据结构的存储方式只有两种:数组(顺序存储)和链表(链式存储)

    啥意思嘞?其实吧,数组和链表是数据结构中的数据结构,其他的数据结构都可以用数组和链表来实现,你比如拿栈来说吧,可以用数组来实现栈,这就叫做顺序栈,也可以用链表来实现栈这个就叫做链式栈。

    所以啊,每种数据结构的存储其实都可以分为顺序存储(用数组实现)和链式存储(用链表实现)

    你比如说要使用队列这个数据结构来存储数据,那实际上,就可以分为顺序队列实现和链式队列实现,也就是看你实际内存中怎样去存储这些数据,因此,你可以看出,数组和链表是数据结构中的基石啊!

    那么,新的问题就来了,既然对于每个数据结构都可以有顺序存储和链式存储,那么即时我依据数据的逻辑结构选择了一个数据结构,那么我怎么来确定是要顺序存储还是要链式存储呢?

    这个问题的关键所在就是要分析数据的物理结构了?

    数据的物理结构是什么?如果你以前没有想过这个问题,你会感到困惑,但也很简单:

    数据的物理结构就是指的数据在内存中的存储是连续存储,也就是集中在一块的意思,还是零散的分散存储。

    也就是说,对于一些数据,我们可以分析它们之间的逻辑结构,知道数据之间有什么样的关系。我们可以确定使用什么样的数据结构,但也需要分析数据的物理结构。

    可是,你有没有发现问题,我们怎么知道数据的物理结构是啥呢?

    这里要看两点,来让我们决定数据的物理结构,分别是:

    1. 内存的空间状态
    2. 数据的用途

    什么意思?以内存空间的状态为例。首先,我们需要知道,连续存储需要连续的内存空间。例如,如果我们想存储10m大小的数据,也就需要10m的连续的内存空间,但是如果没有的话那肯定是用不了连续存储了,那只能分散存储,否则存储不成功啊。

    然后看看数据的用途。连续存储和分散存储的主要区别之一是,它会影响后续的数据操作。对于连续存储,它具有很高的数据遍历效率。因此,如果你存储的这些数据后续的操作中遍历比较频繁,那肯定优先选择连续存储,当然,如果你后续的数据操作中会进行比较多的更新操作的话,那就优先选择分散存储了,因为它效率更高。

    所以我们根据内存的空间状态数据的用途来确定数据的物理结构是连续存储还是分散存储,然后再选择对应的存储方式,也就是:

    1. 物理结构为连续存储就选择顺序存储
    2. 物理结构为分散存储就选择链式存储

    更详细的其他数据结构,查看其他章节

    展开全文
  • 数据结构真的搞得我头大,这都是啥啊不怕你笑话,我在大学四年都搞不懂数据结构,这是个什么东西?我真的那么蠢吗?非常尴尬)当我在大学的时候,我总觉得这件事太抽象了,无法理解。我越学就越跟不上,学到一半就...

    应该有不少伙伴都学过数据结构吧?

    这数据结构真的搞得我头大,这都是啥啊

    不怕你笑话,我在大学四年都搞不懂数据结构,这是个什么东西?我真的那么蠢吗?非常尴尬)

    当我在大学的时候,我总觉得这件事太抽象了,无法理解。我越学就越跟不上,学到一半就掉队了。基本上就是属于放弃治疗了。后来我知道这本书中写的是伪代码。我说怎么能把我看得一楞一楞的?就这样,在大学四年的时间里,我愣是没有搞懂数据结构.

    然后嘞,那些搞懂的,顺利参加校招,拿到满意offer,进入大厂,迎娶白富美……而我呢?

    面试官:“数据结构有了解吗?”

    我:“啥?你说啥?数据结构是个啥?”

    然后我就顺利毕业了……

    扎心不,老铁?你是不是也是这样啊,正在读大学,数据结构也是一脸懵逼,或者毕业了,还是不知道数据结构到底是个啥,说出去怪尴尬,没事,看了今天这篇文章,保准你可以出去大声喊“我……终于……知道……数据结构是个啥啦”(拉长音……)

    数据结构是个啥玩意啊?

    当我第一次接触“数据结构”时,我觉得它有点抽象,但我不认为它很难理解。嗯,应该是这样的。谁知道,我学得越多,就越糊涂。让我们看看这个数据结构是如何定义的:

    数据结构是相互之间存在一种或多种特定关系的数据元素的集合,换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。

    我不知道你看到这个定义时的感受。但我当时是有点困惑,现在的我看着这个定义,

    蛮好的

    聊聊数据在计算机中的存储

    为了更好地理解数据结构,你需要首先了解计算机中数据的存储。举个简单的例子。例如,我们需要存储一个数字,比如1024。如何储存?我们知道代码(Java)通常是这样写的:

    int a = 1024;

    那就是定义一个整型。写完后,它就保存在我们的电脑上。事实上市保存在我们电脑的硬盘上。只有当程序加载到内存中时,它才能被CPU读取和运行。所以,这个1024实际上需要加载到内存中。这里我们需要注意的是,这个1024是我们编写的程序中的一个整型变量。你需要明白的是,我们说它保存在内存中,是因为我们想运行这个程序。

    一旦运行此程序,此程序中包含的数据将加载到内存中,就像这里的1024一样被保存到内存中。怎么怎么保存呢?这里你还要记住这么一句话:

    计算机中的数据都是以二进制的形式保存的

    因此嘞,这个1024是十进制,要转换成二进制保存在内存中,内存有一定的大小,你要保存一个整数,你是不是得占用内存的一些空间啊,假如是这样:

    60b7a1c94a593cb3e12e484821b2c79a.png

    你看,这样这个1024就被存在了内存中,当然,你得明白,这个1024其实被转换成了二进制形式,我这样只是为了便于表示说明。

    再来说数据结构

    在我们了解了数据是如何存储在计算机中之后,我们可以再来看看数据结构。定义我们之前看过了,怎么去理解嘞。顾名思义,数据结构就是数据和结构。结构可以理解为关系,即数据之间的关系

    这样说还是有点困惑?你可以这样理解。首先,你应该知道数据结构。它是一门学科。这是干什么的?说白了,就是研究数据该怎么存储?

    你可能说了,还研究怎么存储,难道存储不都是一样的吗,虽然这个问题有点chun,但是嘞,确实是个让小白疑惑的问题,数据的存储当然是不同的。例如,如果我们要存储五个整数{1、2、3、4、5},那么如何将它们存储在内存中

    可能是这样

    在内存中是排成一排的,一个挨着一个,

    6c729febab0a0c6dea6f99d81b5c2bc7.png

    也有可能是这样!!!

    b97ea887abbec63c7b72cb1156deb52a.png

    就是在内存中没啥顺序,零散的存放,所以啊你看,对于数据,可以按照不同的方式去存储,是给你连续挨着存放,还是存放在哪就存放在哪啊,你可能要问啦,哪这咋整,这个嘛,就得看数据本身以及其他相关要求,看看你这个数据以后准备怎么用,然后考虑怎么存放比较合适。

    所以啊,数据结构啊,就是来管理数据在内存中的存储的,比如,有一些数据要在内存总存储,那就得看数据结构,数据结构让你怎么存放你就得怎么存放,让你连续存放,你就不能撒花似的哪都是的。

    另外啊,你还需要知道,这里的数据结构是个统称,就好比水果,它有香蕉苹果和橘子,数据结构也是一样啊,它是个总称,有数组,链表,栈和队列等等,这些都属于数据结构,就好比,香蕉苹果和橘子都是水果,这个好理解吧!

    然后嘞,这些数据结构啊,每个都有它们自己的一些特点,这些特点就是规定如果数据选择了它这种数据结构来存储,就要按照它的要求在内存中存放,比如你选择了数组,那么你这些数据就要在内存中连续存储,一个挨着一个,不能乱,而如果你选择了链表这种存储结构,那在内存中就不要求你非得连续存储,随意,有空地你就可以存储。

    所以你看,不同的数据结构有它特定的用途……

    到了这里,你差不多就理解了数据结构是个啥了吧,也就是说啊,数据结构就是研究数据怎么存储嘞,然后数据结构是个总称,好比水果,其下有数组,链表,栈和队列这些数据结构,好比水果有香蕉苹果和橘子,其实嘞,你就可以把数据结构想象成一个容器,容器是干啥的嘞,盛东西的啊,这里就是存储数据的,而这些容器形状各异,你选择了不同的容器(数据结构),那么就意味着数据的存储形式是不同的。

    说了这么多,就这些吗?当然不是。我们可以想象,我们上面提到的五个数据之间是没有联系的。最多,当数据连续存储时,它们彼此相邻。这样,就形成了一对一的关系,就像排队一样。我在你前面,你在我后面。

    但还有另一种数据。比如我们要存储一个家谱中的数据信息,比如这样:

    85d54fcc4681c82b4db46f548a25d0c7.png

    你怎么把这些数据存储到内存中呢?这些不同于那些冷冰冰的数字。把它们保存在内存中就万事大吉了。当我们保存这种家谱数据时,我们实际上不仅保存了数据,而且保存了数据之间的关系。

    经过以上的介绍,你一定了解个大概了。然后只需要选择一个合适得数据结构来存储它,说的不错。我们可以分析家谱数据,发现这些数据有一对多的关系。例如,爷爷有三个儿子,叔叔有两个孩子。数据结构中有一个名为tree(数) 的结构,可以存储此类数据。

    上面提到的一对一和一对多都是表示数据之间的关系,其实就是数据结构中的结构。有人可能会问,有多对多的关系吗?答案一定是有的,那么这种关系如何储存呢?没关系。数据结构中还有一个叫做图德数据结构,就是专门针对多对多的数据的。

    所以你看,数据结构是个啥,不就是管着数据该怎么存储嘛?

    数据结构都有哪些嘞?

    那么,你肯定好奇,那么,数据结构都有哪些啊?数据结构总的来说有如下三大类:

    • 线性表,也就是数组、链表、栈和队列;
    • 树结构,包括普通树,二叉树,红黑树等等;
    • 图存储结构,这玩意有点难;

    接下来我对这些数据结构做一下简单的介绍。

    • 线性表
    • 树结构
    • 图结构
    • 等等

    在我的专栏有详细介绍,我就不多说了

    实际上,对于数据的存储该选择什么样的数据结构,那就要取决于数据的逻辑结构和物理结构,再次声明下,这点的理解很重要,以下我说的每个字都不要漏掉哦

    啥是逻辑结构?

    不知道你们之前有没有想过这个问题,数据的逻辑结构是个啥?可能你有点迷糊,但是说起来真的很简单:

    数据的逻辑结构就是指的数据之间存在的关系

    我想经过上面的讲解,你这里立马就知道,这里指的关系就是上面说的什么一对一,一对多和多对多了,不错,就是这些,这里的数据的逻辑结构指的就是这么些个关系,就好比我上面给的那个图,我们再来看一下:

    我想经过以上的解释,你会马上知道这里的关系是指一对一,一对多,多对多。不错,就是这些。这里的数据的逻辑结构指的就是这些关系,就像我上面给出的图一样。我们再来看看:

    0dbbdcea2cc9c3f8fd7b058ef23d4eed.png

    例如,上图中的大伯,二伯和爸爸,他们都属于兄弟关系。爷爷有三个儿子,大伯有两个孩子,这种都是一对多的关系。如果要这样存储数据,不仅要存储基本的数据信息,还要存储它们之间现有的关系。

    而这种关系即是数据之间的逻辑结构。

    总之,数据之间的逻辑结构大致可以分为三种类型,即:

    一对一:就是那种你挨着我,我挨着你的数据,比如数组一对多:就是我们上面画的家谱图那样多对多:这个比如说地图,或者一些四通八达的路,能明白我的意思吧

    其实吧,给到你一些数据,你基本上都能判断出这些数据是什么关系,也就是说,数据的逻辑结构不难辨认。

    到了这里,你有没有发现,这三种逻辑结构的数据,正好可以用我们上面介绍的三大类的数据结构去存储,想一下,也就是下面三种:

    1. 线性表:一对一
    2. 树结构:一对多
    3. 图结构:多对多

    有没有发现,万变不离其中啊,只是我们了解了逻辑结构这个知识点后,你会觉得这块的只是更加的完整。

    物理结构是什么?

    我们在上面知道了逻辑结构是什么,所以我们可以分析数据之间的逻辑结构,看看应该使用哪个数据结构来存储数据。这看似已经万事大吉,没啥事了,但是,实则不然,其实吧,说到这里,牵涉到的知识点又不少,我这里只给你说重点,详细的以后单独拿出来唠叨唠叨。

    请先记住非常重要的一句话:

    数据结构的存储方式只有两种:数组(顺序存储)和链表(链式存储)

    啥意思嘞?其实吧,数组和链表是数据结构中的数据结构,其他的数据结构都可以用数组和链表来实现,你比如拿栈来说吧,可以用数组来实现栈,这就叫做顺序栈,也可以用链表来实现栈这个就叫做链式栈。

    所以啊,每种数据结构的存储其实都可以分为顺序存储(用数组实现)和链式存储(用链表实现)

    你比如说要使用队列这个数据结构来存储数据,那实际上,就可以分为顺序队列实现和链式队列实现,也就是看你实际内存中怎样去存储这些数据,因此,你可以看出,数组和链表是数据结构中的基石啊!

    那么,新的问题就来了,既然对于每个数据结构都可以有顺序存储和链式存储,那么即时我依据数据的逻辑结构选择了一个数据结构,那么我怎么来确定是要顺序存储还是要链式存储呢?

    这个问题的关键所在就是要分析数据的物理结构了?

    数据的物理结构是什么?如果你以前没有想过这个问题,你会感到困惑,但也很简单:

    数据的物理结构就是指的数据在内存中的存储是连续存储,也就是集中在一块的意思,还是零散的分散存储。

    也就是说,对于一些数据,我们可以分析它们之间的逻辑结构,知道数据之间有什么样的关系。我们可以确定使用什么样的数据结构,但也需要分析数据的物理结构。

    可是,你有没有发现问题,我们怎么知道数据的物理结构是啥呢?

    这里要看两点,来让我们决定数据的物理结构,分别是:

    1. 内存的空间状态
    2. 数据的用途

    什么意思?以内存空间的状态为例。首先,我们需要知道,连续存储需要连续的内存空间。例如,如果我们想存储10m大小的数据,也就需要10m的连续的内存空间,但是如果没有的话那肯定是用不了连续存储了,那只能分散存储,否则存储不成功啊。

    然后看看数据的用途。连续存储和分散存储的主要区别之一是,它会影响后续的数据操作。对于连续存储,它具有很高的数据遍历效率。因此,如果你存储的这些数据后续的操作中遍历比较频繁,那肯定优先选择连续存储,当然,如果你后续的数据操作中会进行比较多的更新操作的话,那就优先选择分散存储了,因为它效率更高。

    所以我们根据内存的空间状态数据的用途来确定数据的物理结构是连续存储还是分散存储,然后再选择对应的存储方式,也就是:

    1. 物理结构为连续存储就选择顺序存储
    2. 物理结构为分散存储就选择链式存储

    更详细的其他数据结构,查看其他章节

    展开全文
  • 算法这本书真心简洁易懂,dijstra我是看课本怎么看也看不懂,最后看这本书才懂的。真心推荐。大话数据结构工程向算法 Java实现 C实现 C++实现 普林斯顿的算法课程教材,Coursera上面有配套的在线视频。这套书不仅有...

    入门向

    啊哈!算法

    这本书真心简洁易懂,dijkstra我是看课本怎么看也看不懂,最后看这本书才懂的。真心推荐。

    大话数据结构

    工程向

    算法

    普林斯顿的算法课程教材,Coursera上面有配套的在线视频。这套书不仅有三种实现,而且每本书都有相应编程语言的实例,而不是伪代码。适合技术人员阅读。

    数据结构与算法分析

    学术向

    算法导论

    这本书不应该叫导论,应该叫大全。所以适合放在进阶阶段阅读。这本书也比较偏证明,全是伪代码,所以我说它是学术向的,一般技术人员很难用到。如果实在啃不动的话,不要勉强自己,你可能不一定非要读这本书。

    竞赛相关

    算法竞赛入门经典

    竞赛的题型高度模式化,和工程向的问题风格不一样。而且技术人员所需的算法无论是面试时遇到的,还是实际项目中碰到的,都没有那么难。

    面试相关

    剑指Offer

    展开全文
  • 数据结构真的搞得我头大,这都是啥啊不怕你笑话,我在大学四年都搞不懂数据结构,这是个什么东西?我真的那么蠢吗?非常尴尬)当我在大学的时候,我总觉得这件事太抽象了,无法理解。我越学就越跟不上,学到一半就...

    应该有不少伙伴都学过数据结构吧?

    这数据结构真的搞得我头大,这都是啥啊

    不怕你笑话,我在大学四年都搞不懂数据结构,这是个什么东西?我真的那么蠢吗?非常尴尬)

    当我在大学的时候,我总觉得这件事太抽象了,无法理解。我越学就越跟不上,学到一半就掉队了。基本上就是属于放弃治疗了。后来我知道这本书中写的是伪代码。我说怎么能把我看得一楞一楞的?就这样,在大学四年的时间里,我愣是没有搞懂数据结构.

    然后嘞,那些搞懂的,顺利参加校招,拿到满意offer,进入大厂,迎娶白富美……而我呢?

    面试官:“数据结构有了解吗?”

    我:“啥?你说啥?数据结构是个啥?”

    然后我就顺利毕业了……

    扎心不,老铁?你是不是也是这样啊,正在读大学,数据结构也是一脸懵逼,或者毕业了,还是不知道数据结构到底是个啥,说出去怪尴尬,没事,看了今天这篇文章,保准你可以出去大声喊“我……终于……知道……数据结构是个啥啦”(拉长音……)

    数据结构是个啥玩意啊?

    当我第一次接触“数据结构”时,我觉得它有点抽象,但我不认为它很难理解。嗯,应该是这样的。谁知道,我学得越多,就越糊涂。让我们看看这个数据结构是如何定义的:

    数据结构是相互之间存在一种或多种特定关系的数据元素的集合,换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。

    我不知道你看到这个定义时的感受。但我当时是有点困惑,现在的我看着这个定义,

    蛮好的

    聊聊数据在计算机中的存储

    为了更好地理解数据结构,你需要首先了解计算机中数据的存储。举个简单的例子。例如,我们需要存储一个数字,比如1024。如何储存?我们知道代码(Java)通常是这样写的:

    int a = 1024;

    那就是定义一个整型。写完后,它就保存在我们的电脑上。事实上市保存在我们电脑的硬盘上。只有当程序加载到内存中时,它才能被CPU读取和运行。所以,这个1024实际上需要加载到内存中。这里我们需要注意的是,这个1024是我们编写的程序中的一个整型变量。你需要明白的是,我们说它保存在内存中,是因为我们想运行这个程序。

    一旦运行此程序,此程序中包含的数据将加载到内存中,就像这里的1024一样被保存到内存中。怎么怎么保存呢?这里你还要记住这么一句话:

    计算机中的数据都是以二进制的形式保存的

    因此嘞,这个1024是十进制,要转换成二进制保存在内存中,内存有一定的大小,你要保存一个整数,你是不是得占用内存的一些空间啊,假如是这样:

    92a07832669521fe46fcfccc999ee88e.png

    你看,这样这个1024就被存在了内存中,当然,你得明白,这个1024其实被转换成了二进制形式,我这样只是为了便于表示说明。

    再来说数据结构

    在我们了解了数据是如何存储在计算机中之后,我们可以再来看看数据结构。定义我们之前看过了,怎么去理解嘞。顾名思义,数据结构就是数据和结构。结构可以理解为关系,即数据之间的关系

    这样说还是有点困惑?你可以这样理解。首先,你应该知道数据结构。它是一门学科。这是干什么的?说白了,就是研究数据该怎么存储?

    你可能说了,还研究怎么存储,难道存储不都是一样的吗,虽然这个问题有点chun,但是嘞,确实是个让小白疑惑的问题,数据的存储当然是不同的。例如,如果我们要存储五个整数{1、2、3、4、5},那么如何将它们存储在内存中

    可能是这样

    在内存中是排成一排的,一个挨着一个,

    b387f9f306ef480dd3b1689463420e82.png

    也有可能是这样!!!

    6704278105f6c536ffdac739057b7f04.png

    就是在内存中没啥顺序,零散的存放,所以啊你看,对于数据,可以按照不同的方式去存储,是给你连续挨着存放,还是存放在哪就存放在哪啊,你可能要问啦,哪这咋整,这个嘛,就得看数据本身以及其他相关要求,看看你这个数据以后准备怎么用,然后考虑怎么存放比较合适。

    所以啊,数据结构啊,就是来管理数据在内存中的存储的,比如,有一些数据要在内存总存储,那就得看数据结构,数据结构让你怎么存放你就得怎么存放,让你连续存放,你就不能撒花似的哪都是的。

    另外啊,你还需要知道,这里的数据结构是个统称,就好比水果,它有香蕉苹果和橘子,数据结构也是一样啊,它是个总称,有数组,链表,栈和队列等等,这些都属于数据结构,就好比,香蕉苹果和橘子都是水果,这个好理解吧!

    然后嘞,这些数据结构啊,每个都有它们自己的一些特点,这些特点就是规定如果数据选择了它这种数据结构来存储,就要按照它的要求在内存中存放,比如你选择了数组,那么你这些数据就要在内存中连续存储,一个挨着一个,不能乱,而如果你选择了链表这种存储结构,那在内存中就不要求你非得连续存储,随意,有空地你就可以存储。

    所以你看,不同的数据结构有它特定的用途……

    到了这里,你差不多就理解了数据结构是个啥了吧,也就是说啊,数据结构就是研究数据怎么存储嘞,然后数据结构是个总称,好比水果,其下有数组,链表,栈和队列这些数据结构,好比水果有香蕉苹果和橘子,其实嘞,你就可以把数据结构想象成一个容器,容器是干啥的嘞,盛东西的啊,这里就是存储数据的,而这些容器形状各异,你选择了不同的容器(数据结构),那么就意味着数据的存储形式是不同的。

    说了这么多,就这些吗?当然不是。我们可以想象,我们上面提到的五个数据之间是没有联系的。最多,当数据连续存储时,它们彼此相邻。这样,就形成了一对一的关系,就像排队一样。我在你前面,你在我后面。

    但还有另一种数据。比如我们要存储一个家谱中的数据信息,比如这样:

    9e46f03901f1e23a153dd100f93942c3.png

    你怎么把这些数据存储到内存中呢?这些不同于那些冷冰冰的数字。把它们保存在内存中就万事大吉了。当我们保存这种家谱数据时,我们实际上不仅保存了数据,而且保存了数据之间的关系。

    经过以上的介绍,你一定了解个大概了。然后只需要选择一个合适得数据结构来存储它,说的不错。我们可以分析家谱数据,发现这些数据有一对多的关系。例如,爷爷有三个儿子,叔叔有两个孩子。数据结构中有一个名为tree(数) 的结构,可以存储此类数据。

    上面提到的一对一和一对多都是表示数据之间的关系,其实就是数据结构中的结构。有人可能会问,有多对多的关系吗?答案一定是有的,那么这种关系如何储存呢?没关系。数据结构中还有一个叫做图德数据结构,就是专门针对多对多的数据的。

    所以你看,数据结构是个啥,不就是管着数据该怎么存储嘛?

    数据结构都有哪些嘞?

    那么,你肯定好奇,那么,数据结构都有哪些啊?数据结构总的来说有如下三大类:

    • 线性表,也就是数组、链表、栈和队列;
    • 树结构,包括普通树,二叉树,红黑树等等;
    • 图存储结构,这玩意有点难;

    接下来我对这些数据结构做一下简单的介绍。

    • 线性表
    • 树结构
    • 图结构
    • 等等

    在我的专栏有详细介绍,我就不多说了

    实际上,对于数据的存储该选择什么样的数据结构,那就要取决于数据的逻辑结构和物理结构,再次声明下,这点的理解很重要,以下我说的每个字都不要漏掉哦

    啥是逻辑结构?

    不知道你们之前有没有想过这个问题,数据的逻辑结构是个啥?可能你有点迷糊,但是说起来真的很简单:

    数据的逻辑结构就是指的数据之间存在的关系

    我想经过上面的讲解,你这里立马就知道,这里指的关系就是上面说的什么一对一,一对多和多对多了,不错,就是这些,这里的数据的逻辑结构指的就是这么些个关系,就好比我上面给的那个图,我们再来看一下:

    我想经过以上的解释,你会马上知道这里的关系是指一对一,一对多,多对多。不错,就是这些。这里的数据的逻辑结构指的就是这些关系,就像我上面给出的图一样。我们再来看看:

    3bef23df63d01177c900acd2d5594f51.png

    例如,上图中的大伯,二伯和爸爸,他们都属于兄弟关系。爷爷有三个儿子,大伯有两个孩子,这种都是一对多的关系。如果要这样存储数据,不仅要存储基本的数据信息,还要存储它们之间现有的关系。

    而这种关系即是数据之间的逻辑结构。

    总之,数据之间的逻辑结构大致可以分为三种类型,即:

    一对一:就是那种你挨着我,我挨着你的数据,比如数组一对多:就是我们上面画的家谱图那样多对多:这个比如说地图,或者一些四通八达的路,能明白我的意思吧

    其实吧,给到你一些数据,你基本上都能判断出这些数据是什么关系,也就是说,数据的逻辑结构不难辨认。

    到了这里,你有没有发现,这三种逻辑结构的数据,正好可以用我们上面介绍的三大类的数据结构去存储,想一下,也就是下面三种:

    1. 线性表:一对一
    2. 树结构:一对多
    3. 图结构:多对多

    有没有发现,万变不离其中啊,只是我们了解了逻辑结构这个知识点后,你会觉得这块的只是更加的完整。

    物理结构是什么?

    我们在上面知道了逻辑结构是什么,所以我们可以分析数据之间的逻辑结构,看看应该使用哪个数据结构来存储数据。这看似已经万事大吉,没啥事了,但是,实则不然,其实吧,说到这里,牵涉到的知识点又不少,我这里只给你说重点,详细的以后单独拿出来唠叨唠叨。

    请先记住非常重要的一句话:

    数据结构的存储方式只有两种:数组(顺序存储)和链表(链式存储)

    啥意思嘞?其实吧,数组和链表是数据结构中的数据结构,其他的数据结构都可以用数组和链表来实现,你比如拿栈来说吧,可以用数组来实现栈,这就叫做顺序栈,也可以用链表来实现栈这个就叫做链式栈。

    所以啊,每种数据结构的存储其实都可以分为顺序存储(用数组实现)和链式存储(用链表实现)

    你比如说要使用队列这个数据结构来存储数据,那实际上,就可以分为顺序队列实现和链式队列实现,也就是看你实际内存中怎样去存储这些数据,因此,你可以看出,数组和链表是数据结构中的基石啊!

    那么,新的问题就来了,既然对于每个数据结构都可以有顺序存储和链式存储,那么即时我依据数据的逻辑结构选择了一个数据结构,那么我怎么来确定是要顺序存储还是要链式存储呢?

    这个问题的关键所在就是要分析数据的物理结构了?

    数据的物理结构是什么?如果你以前没有想过这个问题,你会感到困惑,但也很简单:

    数据的物理结构就是指的数据在内存中的存储是连续存储,也就是集中在一块的意思,还是零散的分散存储。

    也就是说,对于一些数据,我们可以分析它们之间的逻辑结构,知道数据之间有什么样的关系。我们可以确定使用什么样的数据结构,但也需要分析数据的物理结构。

    可是,你有没有发现问题,我们怎么知道数据的物理结构是啥呢?

    这里要看两点,来让我们决定数据的物理结构,分别是:

    1. 内存的空间状态
    2. 数据的用途

    什么意思?以内存空间的状态为例。首先,我们需要知道,连续存储需要连续的内存空间。例如,如果我们想存储10m大小的数据,也就需要10m的连续的内存空间,但是如果没有的话那肯定是用不了连续存储了,那只能分散存储,否则存储不成功啊。

    然后看看数据的用途。连续存储和分散存储的主要区别之一是,它会影响后续的数据操作。对于连续存储,它具有很高的数据遍历效率。因此,如果你存储的这些数据后续的操作中遍历比较频繁,那肯定优先选择连续存储,当然,如果你后续的数据操作中会进行比较多的更新操作的话,那就优先选择分散存储了,因为它效率更高。

    所以我们根据内存的空间状态数据的用途来确定数据的物理结构是连续存储还是分散存储,然后再选择对应的存储方式,也就是:

    1. 物理结构为连续存储就选择顺序存储
    2. 物理结构为分散存储就选择链式存储

    更详细的其他数据结构,查看其他章节

    展开全文
  • 数据结构----严蔚敏

    千次阅读 2009-10-14 17:08:00
    但缺点是很多都是伪代码,对编程初学者来说有一些难度,甚至有些考研的同学来看这本书有很多还看不懂,并且里面也有些容易迷惑人的地方。出于对自己数据结构知识的巩固和给那些考研的同学学习这本书一个参考,我决定...
  • 很清楚这个东西很重要,但就是学不会,我们学校使用的教材是严蔚敏的数据结构,大家都说这是一本很经典的书,我一直感觉不到它经典到哪,究其原因是看不懂,书中使用了大量的伪代码,全尼玛讲的思想,看着都头疼。...
  • 数据结构之栈迷宫求解

    千次阅读 2016-09-03 15:55:33
    了解下书上的思路,不过那个伪代码写的例子怎么也看不懂。难道是因为我看的是盗版  头文件  #pragma once #include #define STACK_INIT_SIZE 100 #define STACK_INCREMENT 50 const int Xrange = 12; const int...
  • 数据结构课程设计解题报告 前言

    千次阅读 2016-06-24 00:02:43
    其次,我会逐渐给出每题的伪代码,当前已经完成了部分题的分析(A,B同A,C,D,I,G)其一,80行以上代码至少我一般是看不下去的,但是20~30的伪代码,甚至是5~15行的中文的步骤分析, 读起来轻松自如 其二,是...
  • 堆注重的是堆顶,小顶堆的堆顶一定是最小的,大顶堆的堆顶一定是最大的,这种数据结构被应用于优先级队列,每次队列出优先级最高的那个,而注重其余元素的顺序和他们入队的先后次序。 优先级队列常被应用到任务...
  • 全站采用静态支持,既避免了人工静态的繁琐操作、数据不及时的弊端,又达到人工静态对搜索引擎收录的同样有利效果。 模板机制、轻松改版 全新的模板引擎机制,界面完全与核心程序分离。网站界面均可轻松通过...
  • 看了看数据结构的书籍·,我想还是算了吧,数据结构书里面写的有点复杂,而且感觉有点抽象,以至于我不能理解,以后还是要学会看伪代码的,不然以后高端一点的书籍都会·看不懂, 我先看下别人的博客,现在来总结...
  • 拓扑排序算法

    2013-07-22 10:21:19
    对许多数据结构教材实在不满意,至少我是看不懂…… 至于拓扑排序算法,教材上那些伪代码真真教人头晕。只写了几个struct结构,我根本看不出这是邻接表。 如果给出一个清晰明了的图,一切不就简单了? 总之,...
  • C语言指针学习二

    2015-04-30 11:35:00
    指针的重要性:  ①指针的可以表示一些复杂的数据结构:  比如链表,树(如家谱,操作文件夹父目录与子目录),图(如告诉你你几个城市点,求出最短路径),..., ...你可能根本就看不懂人家的伪代码,跟别谈自
  • 顺序表基本操作

    2015-07-21 10:06:54
    献给那些刚开始学数据结构 看不懂书上的伪代码的同学 强烈建议初学者必学结构体 指针 可以去图书馆借参考书 #include<stdio.h> #include<stdlib.h> #define N 1000 typedef struct...
  • 我与算法的缘分

    千次阅读 2015-07-01 16:07:35
    大一上学期,我对算法一点概念都没有,当时老师让我们用伪代码写算法,我基本上都是从网上找答案或者直接空着写。给我印象最深的一个算法是计算两个分数相加,其中涉及求最大公约数,用的是辗转相除法。那时觉得这...
  • 问题是,下面这个宏在下就看不懂了 ``` #define CPU_MASK_NONE \ (cpumask_t) { { \ [0 ... BITS_TO_LONGS(NR_CPUS)-1] = 0UL \ } } ``` 在下想请教各位大神,上面宏定义中的三个点"..."是什么意思啊?整个宏...
  • 在编程中,在程序排版、注释、命名和可读性等问题上都有一定的规范,虽然编写可读性良好的代码并不是必然的要求(世界上还有难懂代码比赛,谁的代码最不好读!),但好的代码风格实际上是为自己将来维护和使用...
  • php高级开发教程说明

    2008-11-27 11:39:22
    这个循环也许用了1 0 0行代码,但是为一个优化的循环选择设计一个优化的算法很容易耗费一 整天的时间,这个小小的循环也许是设计阶段最庞大的部分,但另一方面,你可以在到一天 的时间内策划好数千行的代码。 ...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    本书着重介绍语言本身,比较少涉及应用,不错的入门书,从头讲起,不怕明白。 <<page 1>> page begin==================== 目 目目 目 录 录录 录 第一部分 C#语言概述.4 第一章 第一章第一章 第...
  • 算法导论中文版

    2016-10-26 10:13:58
    算法以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂;说明和解释力求浅显易懂,不失深度和数学严谨性。 --------------------------------------------------------------- 目录 Introduction to ...
  • 《算法导论第二版》课后习题与思考题答案合集

    千次下载 热门讨论 2012-05-14 08:16:14
    算法以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂。说明和解释力求浅显易懂,不失深度和数学严谨性。  《算法导论(原书第2版)》一书自第1版出版以来,已经成为世界范围内广泛使用的大学教材和专业...
  • C#微软培训资料

    2014-01-22 14:10:17
    18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...
  • ZYCH自由策划企业网站管理系统为智能ASP网站管理程序,是基于自由策划企业网站系列的升级版,结合以往版本的功能优势,解决了频道模板能自由添加删减的问题,系统开发代码编写工整,方便读,系统采用程序模板...
  • 以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂。说明和解释力求浅显易懂,不失深度和数学严谨性。 本书自第1版出版以来,已经成为世界范围内广泛使用的大学教材和专业人员的标准参考书。第2版增加了...
  • Egret 的 童话 与 现实

    2021-01-03 14:33:25
    我是因为『同行相轻』才别人的引擎顺眼的 ———— 那么,请你坚持自我,继续保持这种观点吧。像你这么狭隘的人 未来会很珍贵的。 - 我和Egret存在任何竞争关系。相反,它的本意是来帮助我...
  • <ul><li><a href="https://segmentfault.com/a/1190000004494678">CSS哲学命题</a></li><li><a href="http://www.cnblogs.com/ys-ys/p/5092760.html">CSS 巧用 :before和:after</a></li><li><a href=...

空空如也

空空如也

1 2
收藏数 28
精华内容 11
热门标签
关键字:

数据结构伪代码看不懂

数据结构 订阅