打卡前请喝一碗鸡汤
当30岁还在为10块打车纠结
下雨没人送伞
下班再晚没人询问
你就会明白
爱不爱没什么用
谋生才是体面
正文内容
1、什么是数据结构?
数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。
看不懂它在说什么?别急,我来帮你搞懂它。想要理解它,我们首先要了解几个关于数据结构的核心概念及其关系。
1.1数据
定义:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。
分类:
数值类型数据:整型(整数)、实型(在c语言中也称浮点型,实际上就是小数)等,这类数据可被计算机程序进行计算。
非数值类型数据:比如字符、声音、图像、视频等,这类数据需要被某些算法转化为数值类型(二进制)才可被计算机程序处理。
注意:
我们这里所说的数据,必须具备两个前提:
定义:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。
比如说一本书可以作为数据,那这一本书的书目信息就是书这个数据中的一个数据元素。还有在人类这个数据中,一个人就是一个数据元素…
1.3数据项
定义:一个数据元素可以由若干个数据项组成, 是数据不可分割的最小单位 。
比如一本书的书目信息为一个数据元素,而书目信息的每一项(如书名、作者名等)为一个数据项。还有人这样的数据,可以有眼、耳、鼻 手、脚这些数据项 也可以有姓名、年龄、性别、出生地址、联系电话等数据项 。
1.4数据对象
定义:是性质相同的数据元素的集合,是数据的子集。
等等,什么性质相同的数据元素?嘿嘿嘿,比如我们都是大学生,都有疯狂期末,都有逃课机会…
又比如我们都是孤寡贵族(我不是针对谁…),性质特征就不具体描述了,懂的都懂。
好了,现在我们可以详细说说什么是数据结构了。
数据结构拆开来就是数据+结构,既然我们已经知道数据是什么,那么结构简单来说,就是一种关系,比如说一个学校的组织架构,里面包含了直属、附属、同级等多种关系。
**而不同数据元素之间不是独立的,而是存在特定的关系,所以我们将这些关系称为结构。**
2、研究数据结构的意义?
就拿刚刚举的那个学校组织架构来说吧,试想一下,一个学校有那么多的数据(包括人、书、各种设备等等),如果没有一个清晰的组织架构来对各部分事务负责,那么不得全乱套。
同样的道理,在计算机程序的设计过程中,涉及各种数据,如果没有把各种数据合理分类、存储、组织并加以运用不同的处理方式(算法),那么整个程序就可能会显得很低效、很不稳定等等。
所以我们就需要为程序找到合适的数据结构、并不断优化数据结构才可让程序执行得更高效可靠。
这其实就是那句【程序设计=数据结构+算法】的真正部分含义。
3、数据结构的分类
从视觉角度、我们可以把数据结构分为逻辑结构和物理结构两大类。
3.1逻辑结构
定义:
是指数据对象中数据元素之间的相互关系。
分类:
**集合结构:**各个数据元素是“平等”的,它们的共同属性是“同属于一个集合”。数据结构中的集合关系就类似于数学中的集合,如下图所示。
2、线性结构:线性结构是一个有序数据元素的集合,如下图所示。。常用的线性结构有:线性表,栈,队列,双队列,串(一维数组)。【以后再细讲】
**3、树形结构:**树形结构中的数据元素之间存在一种一对多的层次关系,如下图所示。
**4、图形结构:**图形结构的数据元素是多对多的关系。
再次强调:逻辑结构是针对具体问题的数据元素的描述关系,而待会要讲的物理结构是针对数据元素在计算机存储器当中的实际关系。
3.2物理结构(又称存储结构)
定义:
是指数据的逻辑结构在计算机中的存储形式,大白话来说就是数据元素在计算机存储器的互相之间的实际关系。
注意,这里的存储器主要针对的是内存而言,像硬盘、软盘、光盘等外部存储器的数据组织通常用文件结构来描述。
分类:
1、顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关
系和物理关系是一致的,如下图所示。
大白话说就是,比如你排队测核酸,逻辑关系上来说,先排到前面的就先测核酸;物理关系上来说,确实是你先占到了队伍的前面一块空间,你就先测核酸,这就是所谓的逻辑关系和物理关系一致。
2、链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。数据元素的存储关系并不能反映其逻辑关系,因此需要用一个**指针(就是一个变量,变量也就是一个存东西的空间)**存放数据元素的地址,这样通过地址就可以找到相关联数据元素的位置,如下图所示。
用刚刚的测核酸例子再通俗说一下,就是你排队的时候,总有某些人会插队,又或者你突然想离开上厕所,又或者你觉得队伍前面太长了,而你又想干饭了…
这该怎么解决呢?参照银行服务的例子你就明白,我们去银行办业务的时候,一般都会取个小票,上面显示你是xxxx号,这时候,你可以坐哪都行、站着也不反对,只要听到播音念到你的xxxx号时,你就可以到窗口办理业务。
这时候,它的整个逻辑关系和物理关系是不一致的,因为逻辑关系上就是就是你拿到的号码越前,你就能越早办理业务,而物理关系上,你处的位置(空间)是任意的。这就是链式存储结构的特点**。**
4、数据类型
定义:
是指一组性质相同的值的集合及定义在此集合上的一些操作的总称,目的就是用来说明变量或表达式的取值范围和所能进行的操作。
大白话来说就是,数值的大小范围不同,有的是亿万级别的数据量、有的是千百级别的、更小的就是个位级别的。而计算机的存储空间(特指内存)又是有限空间的。
假设没有数据类型,你去开辟一块空间都是一样大小的,你要是用这个本来能装亿万级别的数据量的空间,用来装个位数级别的数据量,岂不是狠狠的浪费资源?
于是科学的方法就是开辟空间的时候就对空间进行数据类型说明,用来定义它的取值范围和所能进行的操作。
分类:
在C语言中,按照取值的不同,数据类型可以分为两类:
原子类型:是不可以再分解的基本类型,包括整型、实型、字符型等。
结构类型:由若干个类型组合而成,是可以再分解的。例如,整型数组是由若干整
型数据组成的。
再次验证一下数据类型的意义:在C语言中变量声明int a,b,这就意味着,在给变量a和b赋值时不能超出int的取值范围,变量a和b之间的运算只能是int类型所允许的运算。
5、抽象数据类型(Abstract Data Type,ADT)
定义:
是指一个数学模型及定义在该模型上的一组操作。抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关。
为了通俗理解这个定义,我们首先拆解一下【抽象数据类型】这个名词。
抽象:抽象是指抽取出事物具有的普遍性的本质。它是抽出问题的特征而忽略非本质的
细节,是对具体事物的一个概括。抽象是一种思考问题的方式,它隐藏了繁杂的细节,只保留实现目标所必需的信息。
说白了,就是你说你是个【典型大学生】,拥有疯狂期末,拥有逃课机会,拥有光明正大谈恋爱的机会(前提是你得有对象,我不是针对谁…)等等。这些都是一些普遍特征,但是特征的背后到底是怎么实现的,我们不透露。
数据类型的定义我们在前面讲述过了。
结合来说,抽象数据类型是由若干基本数据类型(例如整形、浮点型、以及字符型)组合之后形成的一种新的数据类型,这种类型由用户定义,功能操作比基本数据类型更多,一般包括结构体和类。
其实说白了,抽象数据类型就是把一些有一定关联的基本数据类型打包,然后当做新的数据类型使用。
作用:
比如你要实现对一个人的信息管理,如果你只用基本数据类型那么你需要定义很多数据类型的变量比如名字、性别、出生地、生日之类的,并且操作起来不方便。
如果用抽象数据来实现就简单了,直接把这些信息放包装在一个新的数据类型中,然后就可以直接定义这样的一个变量就可以了。C++中的类更好的实现了封装功能,这就是类。类使得抽象数据类型的可操作性更强了,真正实现了面向对象。
最后再看看【抽象数据类型】的标准书写规范,你就豁然开朗了。
从图中可以看出,一个抽象数据类型,首先得有个名称,然后定义组成抽象数据类型的数据元素之间的逻辑关系,再定义可对这个抽血数据类型可执行的操作和操作后的结果描述…
最后再让我们用图解总结本期内容吧
本期图解总结
ok各位,这就是本期想和你分享的内容,如果你喜欢或觉得对你有帮助的话,可以点个赞,转发一下,你的大大支持,是我持续创作的动力,我们下期再见!
内容参考与引用:
大话数据结构||程杰:https://book.douban.com/subject/6424904/
如何理解数据结构中的抽象数据类型?:https://blog.csdn.net/Gnewocean/article/details/82388462