学习建议
概念多,比较无聊。抓大放小,重要的是形成框架,不必纠结于细节概念
基本概念
数据
课本概念
数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。
简要理解
数据就是用来被计算机识别处理的,例如聊天软件收到的一条条信息就可以理解为数据。
数据元素、数据项
课本概念
数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。
一个数据元素可以有若干个数据项组成,数据项是构成数据元素的不可分割的最小单位。
简要理解
我们要根据实际的业务需求来确定数据元素和数据项。
以海底捞的排队取号系统为例:
一波顾客就是数据元素,而海底捞排号中包括的:排队号、取号人数、当前叫号...就都是数据项。
还有一种简单的理解,你可以将其理解为类和属性(不确定这种理解方法是否正确,但是有助于理解数据元素和数据项的关系)
数据结构、数据项
数据结构
课本概念
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
简要理解
结构:各个元素之间的关系。
小学学习汉字时,老师总会教我们汉字的组成结构。
由此我们就可以看出结构其实就是元素之间的关系。
数据对象
课本概念
数据对象是具有相同性质的数据元素的集合,是数据的一个子集。
简要理解
只要数据元素具有相同的性质,即可称为一个数据对象。也就是类中的属性相同。
举例(数据结构/数据对象)
以海底捞排队取号系统为例:
从逻辑上看,A店的排队顾客的信息其实是有一个先后的关系:3号排在4号前面,4号排在5号前面...
但是如果B店也有顾客在排队,那么这些B店的顾客排队信息和A店的顾客排队信息就没有关系了。但是两个门店的排队顾客信息可以看作是一个数据对象,因为他们具有相同的性质。
三要素
逻辑结构
数据元素之间的逻辑关系是什么?
集合(基本不讨论)
课本概念
同数学中的集合概念相同:各个元素同属一个集合,别无其他关系。
简要理解
当我们吃烤肉的时候,烤盘上有各种各样的食物。
这些食物就是属于这个烤盘集合。但是他们之间并没有其他逻辑关系。
线性结构(第二、三章)
课本概念
数据元素之间是一对一的关系。除了第一个元素,所有元素都有唯一前驱;除了最后一个元素,所有元素都有唯一后继。
简要理解
前驱:前面的元素
后继:后面的元素
烤串将食物串在一起就是一种线性结构。
树形结构(第四章)
课本概念
数据元素之间是一对多的关系。
简要理解
我们的族谱其实使用的就是树形结构
你奶奶生了你爸爸,但是不代表你奶奶之能生你爸爸。你奶奶也可以生很多孩子。这在上上代还是比较常见的现象,每家普遍都有三四个孩子。
图状结构(网状结构)(第五章)
课本概念
数据元素之间是多对多的关系。
简要理解
微信好友关系其实就是一种图状结构
如果你要添加好友,就是在你们两个节点之间增加一条线。如果你要和你的前女友断绝关系、删除好友,那么就相当于你们之间的线要消失。
物理结构(存储结构)
如何用计算机表示数据元素的逻辑关系?
当我们用计算机去实现的时候才会考虑。
顺序存储
课本概念
逻辑上相邻的元素存储在物理位置上也相邻的存储单元中。元素之间的关系由存储单元的邻接关系来体现。
简要理解
顺序:a--b--c--d--e--f
由于a和b在逻辑上(在线性结构中)是相邻的元素,所以a和b在内存中存储的位置也应该是相邻的。
a存储在:1000
b存储在:1001
用物理的相邻来表示逻辑的相邻。
链式存储(非顺序存储)
课本概念
逻辑上相邻的元素,在物理位置上可以相邻。借助指示元素存储地址的指针来表示元素之间的逻辑关系。
简要理解
以顺序存储的例子继续。a和b在逻辑上相邻,但是在链式存储中a和b在内存中的物理地址不需要相邻。只需要在a中存储b的物理存储地址即可(也就是将a的指针指向b)
索引存储(非顺序存储)
课本概念
在存储元素信息的通式,还建立附加的索引表。索引表的每项称为索引项,索引项的一般形式是(关键字,地址)
简要理解
除了存放数据外,还需要开辟一个空间专门来存放元素的顺序和地址。通过查该表可以找到数据在内存中的位置。
可以理解为就是一张快递小哥的地址表,快递小哥可以根据该地址表快速的找到你家在哪里,并且把快递送到你的手上。
散列存储(非顺序存储)
课本概念
根据元素的关键字直接计算出该元素的存储地址,又称哈希(Hash)存储
简要理解
由于现在解释散列存储难以解释清楚,所以我们在后续第六章的散列表中再展开。
数据存储的影响
顺序存储 & 非顺序存储
顺序存储
各个数据元素在物理地址上必须是连续的。
非顺序存储
各个数据元素在物理地址上可以是离散的。
数据存储结构的影响
数据存储结构会影响存储空间分配的方便程度
举例
如果我采用顺序存储,我有n个元素,我想在第2个位置插入一个元素。那么我就要将原来的第2个元素及后面的所有元素都想后移动一位,需要移动n-1次。
而非顺序存储结构,例如链式存储,在第2个位置插入一个元素,只需要将第1个元素的指针指向新插入的元素,将新插入的元素指针指向原来的第2个元素。只需要操作2次。
数据存储结构会影响数据运算的速度
举例
我们想要找出第三个元素。
在顺序存储下:我们直接就知道第三个元素的地址,直接通过该地址去查找即可。因为数据存储在内存中的位置是相邻的,我们可以计算出第三个元素的地址。
在非顺序存储下:非顺序存储下的元素是离散存储的,我们并不知道其在内存中的具体位置。要想知道第三个元素的地址,就得知道第二个元素的地址。要想知道第二个元素的地址,就得知道第一个元素地址。
数据的运算
课本概念
施加在数据上的运算包括运算的定义和实现。运算的定义是针对逻辑结构的指出运算的功能;运算的实现是针对存储结构的,指出运算的具体操作步骤。
简要理解
运算的定义是针对逻辑结构的指出运算的功能:
我们需要通过不同的逻辑结构来确定,对这种逻辑结构的数据需要进行哪些运算。
海底捞的排队取号系统实质上是一个队列(暂时听不懂也没事,后续会详细讲解)对于一个队列需要的运算就有:
- 对头元素出列
- 新元素入队
- 输出队列长度
- ...
运算的实现是针对存储结构的:
海底捞的排队取号系统,对于在队尾插入一个新元素的操作,不同的存储结构就需要不同的实现方式:
顺序存储:将新加入的号放在最后一个好的相邻的物理地址处
非顺序存储:新加入的号可以在内存中随意存储,只需将最后一个元素的指针指向新加入的号即可。
数据类型、抽象数据类型
数据类型
课本概念
数据类型是一个值的集合和定义在此集合上的一组操作的总称。
分类
原子类型
其值不可再分的数据类型。
举例:bool类型、int类型、float类型...
结构类型
其值可以再分解为若干成分(分量)的数据类型。
可以理解为,就是有一个或多个原子类型组合而成的一种新的类型。
C语言中的结构体就是结构类型
抽象数据类型(Abstract Data Type , ADT)
课本概念
是抽象数据组织及与之相关的操作。
简要理解
用数学化的语言定义数据的逻辑结构和运算(数据的运算)与具体的实现无关。
当我们定义了一个ADT的时候就相当于确定了逻辑结构和数据的运算,也就是定义了一个数据结构。
总结
探讨一种数据结构时(学习数据结构的顺序)
- 定义逻辑结构(先关注逻辑结构是什么)
- 定义数据的运算(再了解应该实现什么样的运算)
- 确定某种存储结构,实现数据结构,并实现一些对数据结构的基本运算(最后确定某一种存储结构,再使用代码实现)
结束语
绪论中描述了大量的概念,有些概念可能对于初学数据结构的小伙伴们理解起来有些困难,大家不必过于纠结,绪论只是做一个简单的介绍。如有困惑请不要害怕!随着深入的学习,这些概念会在你的脑子里越来越清晰!绪论最重要的是搞懂我们后续该如何学习数据结构。也就是最后总结的(探讨一种数据结构时)
希望该篇博客能够帮助到小伙伴们!
本人菜鸟一枚,仅仅分享学习笔记和经验。若有错误欢迎指出!共同学习、共同进步 🙂
6人评论了“数据结构绪论”
牛逼啊!
1234
感谢支持:)
Your article helped me a lot, is there any more related content? Thanks!
Your point of view caught my eye and was very interesting. Thanks. I have a question for you.
Thank you for your sharing. I am worried that I lack creative ideas. It is your article that makes me full of hope. Thank you. But, I have a question, can you help me?