您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

数据结构到底是个啥?轻松学习八类数据结构

时间:2020-05-06 13:31:55  来源:  作者:

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

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

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

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

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

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

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

然后我就顺利毕业了……

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

数据结构是个啥玩意啊?

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

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

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

蛮好的

 

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

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

int a = 1024;

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

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

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

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

 

数据结构到底是个啥?轻松学习八类数据结构

 

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

再来说数据结构

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

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

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

可能是这样

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

数据结构到底是个啥?轻松学习八类数据结构

 

也有可能是这样!!!

 

数据结构到底是个啥?轻松学习八类数据结构

 

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

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

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

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

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

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

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

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

 

数据结构到底是个啥?轻松学习八类数据结构

 

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

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

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

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

数据结构都有哪些嘞?

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

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

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

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

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

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

啥是逻辑结构?

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

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

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

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

 

数据结构到底是个啥?轻松学习八类数据结构

 

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

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

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

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

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

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

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

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

物理结构是什么?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



Tags:数据结构   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
1 概述数据结构和内部编码 无传统关系型数据库的 Table 模型schema 所对应的db仅以编号区分。同一 db 内,key 作为顶层模型,它的值是扁平化的。即 db 就是key的命名空间。 key...【详细内容】
2021-11-01  Tags: 数据结构  点击:(28)  评论:(0)  加入收藏
Redis常用的数据结构有 string list set zset hashstringstring 是 Redis 的基本的数据类型,一个 key 对应一个 value。string 类型是二进制安全的,Redis的string可以包含任...【详细内容】
2021-10-12  Tags: 数据结构  点击:(36)  评论:(0)  加入收藏
遵从所有教材以及各类数据结构相关的书书籍,我们先从线性表开始入门。今天这篇文章更偏概念,是关于有线性表的一个知识点的汇总。上文说过,物理结构是用于确定数据以何种方式存...【详细内容】
2021-07-19  Tags: 数据结构  点击:(94)  评论:(0)  加入收藏
1. 线性表线性表是一类最简单、最常用的数据结构。简单来说,一个线性表是n个元素的有限序列,其中n≥0,通常表示为(a1,a2,...,an)。其特点是,在非空的数据元素集合中:(1)存在唯一的一个...【详细内容】
2021-06-09  Tags: 数据结构  点击:(139)  评论:(0)  加入收藏
Mysql索引数据结构下面列举了常见的数据结构 二叉树 红黑树 Hash表 B-Tree(B树)Select * from t where t.col=5我们在执行一条查询的Sql语句时候,在数据量比较大又不加索引的情...【详细内容】
2021-06-07  Tags: 数据结构  点击:(90)  评论:(0)  加入收藏
Redis五种数据结构如下: 1.String 字符串类型是redis中最基本的数据类型,一个key对应一个value。String类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。如数字,...【详细内容】
2021-04-14  Tags: 数据结构  点击:(208)  评论:(0)  加入收藏
一、栈栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈...【详细内容】
2021-04-06  Tags: 数据结构  点击:(266)  评论:(0)  加入收藏
序列是python中最基本的数据结构。所谓的序列,指的是可以连续存放多个值的内存空间,序列中的每个元素都会有一个数字,即它的位置或索引。通过这个索引就能找到序列中的元素 。...【详细内容】
2021-02-24  Tags: 数据结构  点击:(197)  评论:(0)  加入收藏
不要虚度每一天,你的经验就是这样积累出来,然后用在了你的事情上面。 一:摘要概述很多 redis 的使用者都可以清晰明白的道出Redis中常用的对象如string、list、hash、set、zset...【详细内容】
2021-01-18  Tags: 数据结构  点击:(167)  评论:(0)  加入收藏
速介绍8种常用数据结构数据结构是一种特殊的组织和存储数据的方式,可以使我们可以更高效地对存储的数据执行操作。数据结构在计算机科学和软件工程领域具有广泛而多样的用途...【详细内容】
2020-12-18  Tags: 数据结构  点击:(93)  评论:(0)  加入收藏
▌简易百科推荐
本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程。本文不过度关注细节,因此只是分别从arena层次、bin层次、chunk层次进行图解,而不涉及有关指针的具体操作。前...【详细内容】
2021-12-28  linux技术栈    Tags:glibc   点击:(3)  评论:(0)  加入收藏
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(2)  评论:(0)  加入收藏
程序是如何被执行的  程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(10)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(20)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(25)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(25)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条