持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情
基本概念和术语
1.数据
数据是信息的载体,是描述客观事物的能被输入到计算机中并且被计算机程序识别和处理的符号的集合,是对现实世界的数字化,是计算机程序加工的原材料。如果把数据看作集合,那么集合中包含所有的能被表示的数据,包括能被原子类型和结构体类型表示的所有的数据。
2.数据对象
数据对象是具有相同性质的数据元素集合,是数据的一个子集。如果把数据对象看作集合,那么集合中包含的是类型和关系运算完全相同的数据的集合,是数据的子集。
3.数据元素
数据元素是数据的基本单位,通常作为一个整体考虑。一个数据元素可以有多个数据项组成,相当于结构体。数据元素就不能够看作集合了,数据元素是数据对象中描述的一个单个的独立个体,可以是结构体或原子类型。
4.数据项
数据项是构成数据元素的不可分割的最小单位。数据项可以被看作是不可再分的原子类型。
四者之间的关系
5.数据类型
一个集合、定义在此集合上的操作的统称
- 1)原子类型:值不可再分的数据类型,如整型,浮点型,字符型等
- 2)结构类型:值可以分为若干分量的数据类型,可看作结构体
- 3)抽象数据类型:抽象数据组织与之相关的操作(定义与数据类型的定义相似,都是一个数据的集合以及在集合上的关系运算,只不过数据是抽象化的数据)。其中抽象数据组织包括数据对象、数据关系(即数据的逻辑结构)。抽象的意义在于数据类型的数学抽象。
结构类型还可以分为固定聚合类型和可变聚合类型
- 固定聚合类型:值由特定数量的分量以某种顺序聚合在一起,如复数。
- 可变聚合类型:分量的值不能够确定,如线性表。
抽象数据类型的格式
ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT 抽象数据类型名
可以看出抽象数据类型((ADT)描述了数据的逻辑结构和抽象运算,通常用(数据对象,数据关系,基本操作集)这样的三元组来表示,从而构成一个完整的数据结构定义。
6.数据结构
数据结构是互相直接存在一种或多种特定关系的数据元素的集合,这种数据元素互相之间的关系称为结构。实质是数据的组织形式。
数据结构的三方面的内容
- 1)逻辑结构
- 2)存储结构(物理结构)
- 3)数据的运算
这里的第三方面也和数据类型的定义相关,因为数据结构操作的主体是数据,而数据必然有数据类型确定。只要是存在数据类型就必然要有数据的运算。
算法的设计依赖于逻辑结构,算法的实现依赖于存储结构
1)逻辑结构
数据元素之间的逻辑关系,独立于计算机之外,与存储结构无关
逻辑结构包括线性结构和非线性结构
- 线性结构:线性结构一般用于线性表,其中也包含受限制的线性表如:有序表(关键字有序的线性表)、栈和队列。
- 非线性结构:树、图、集合
2)存储结构
存储结构是值数据结构在计算机中的表示(又称映像),即数据的存储结构,也称物理结构。存储结构依赖于计算机语言,存储结构主要有顺序结构、链式结构、索引结构和散列结构
- 1)顺序结构:逻辑上相邻的元素存储在物理上相邻的存储单元中。元素之间的关系由存储单元的邻接关系来体现。
- 2)链式存储:不要求逻辑上相邻的元素在物理位置上也相邻,用只是元素存储地址的指针来表示元素直接的逻辑关系。
- 3)索引存储:存储元素信息的同时还应该建立索引表。
- 4)散列存储:根据元素的关键字直接计算出该元素的存储地址,又称哈希存储。
在存储数据时,不仅要存储数据元素的值,而且要存储数据元素之间的关系。
顺序存储的有点是可以随机存取,每个元素占用最小存储空间,但是只能使用相邻的一整块存储单元,因此可能产生较多的外部碎片。
链式存储不会产生碎片化现象,能够充分利用所有的存储单元,但是引入了额外的存储空间,并且只能顺序存储。链式存储设计时,各个不同结点的存储空间可以不连续,但结点内的存储单元地址必须连续。
索引表中每项被称为索引项,索引项的一般形式是(关键字,地址)。优点是检索速度快,缺点是附加的索引表需要占用额外的存储空间,增加数据和删除数据也需要修改索引表,花费较多时间。
散列存储优点是检索、增加、删除结点操作都很快,缺点若散列函数不好,则可能出现元素存储单元的冲突,而解决冲突会增加时间和空间开销。
3)数据的运算
施加在数据上的原酸包括运算的定义和实现。运算的定义针对逻辑结构,指出运算的功能;运算的实现针对与存储结构,指出运算的具体操作步骤。
注意
逻辑结构采用抽象表达方式,独立与存储结构,而数据的存储方式有多种不同的选择;而数据二点存储结构是逻辑结构在计算机上的映射,不能独立于逻辑结构存在。比如:线性表可以用顺序表和链表两种方式表示,特别注意在有些题目中把循环队列看作顺序表表示的队列(实际上也可以用链式表示),同时数据结构三要素缺一不可。
对于两种不同的数据结构,逻辑结构或物理结构不一定不相同:应该注意到,数据的运算也是数据结构的一个重要方面。对于两种不同的数据结构,它们的逻辑结构和物理结构完全有可能相同。比如二叉树和二叉排序树,之叉排序树可以采用二叉树的逻辑表示和存储方式,前者通常用于表示层次关系,而后者通常用于排序和查找。虽然它们的运算都有建立树、插入结点、删除结点和查找结点等功能,但对于二叉树和二叉排序树,这些运算的定义是不同的,以查找结点为例,二叉树的时间复杂度为O(n),而二叉排序树的时间复杂度为O(log2n)。