数据结构基本概念
数据结构基本概念
1.基本概念和术语
1.1数据(Data)
-
是能输入计算机且能被计算机处理的各种符号的集合。
-
是信息的载体。
-
是对客观事物符号化的表示。
-
能够被计算机识别、存储和加工。
包括:数值型数据:整数、实数等; 非数值型的数据:文字、图像、图形、声音等;
1.2 数据元素(Data element)
- 是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理;
- 也简称为元素,或称为记录、结点或者顶点;
- 一个数据元素由若干个数据项组成;
1.3 数据项 (Data Item)
- 构成数据元素的不可分割的最小单位。
【注】数据、数据元素、数据项三者之间的关系:数据 > 数据元素 > 数据项
1.4 数据对象 (Data Object)
-
是性质相同的数据元素的集合,是数据的一个子集
【注】数据元素与数据对象: -
数据元素——组成数据的基本单位
与数据的关系:是集合的个体。
-
数据对象——性质相同的数据元素的集合
与数据的关系:集合的子集。
1.5 数据结构 (Data Structure)
数据结构这门课着重关注的是数据元素之间的关系,和对这些数据元素的操作,而不是关心集体的数据项的内容。
- 数据元素不是孤立存在的,它们之间存在着某种关系,数据元素相互之间的关系称为结构(Strcture)。
- 是指相互之间存在一种或多种特定关系的数据元素集合。
- 或者说,数据结构是带结构的数据元素的集合。
【注】
-
同样的数据元素,可以组成不同的数据结构;
-
不同的数据元素,可以组成相同的数据结构。
数据结构包括以下三个方面的内容: 1. 数据元素之间的逻辑关系,也称为逻辑结构 2. 数据元素及其关系在计算机内存中的表示(又称为映像),成为数据的物理结构或者数据的存储结构 3. 数据的运算和实现,即对数据元素可以施加的操作以及这些操作在相应的存储结构上的实现
数据结构的两个层次
1.逻辑结构
- 描述数据元素之间的逻辑关系
- 与数据的存储无关,独立于计算机
- 是从具体问题抽象出来的数据模型
2.物理结构(存储结构)
- 数据元素及其关系在计算机存储器中的结构(存储方式)
- 是数据结构在计算机中的表示
3.逻辑结构与存储结构的关系:
- 存储关系是逻辑关系的映像与元素本身的映像
- 逻辑结构是数据结构的抽象,存储结构是数据结构的实现
- 两者综合起来建立了数据元素之间的结构关系
1.5.1逻辑结构
逻辑结构的种类:
划分方式一:
- 线性结构
- 非线性结构
划分方式二:
- 集合结构
- 线性结构
- 树形结构
- 图状结构或者网状结构
1.5.1.1 线性结构
有且只有一个开始和一个终端结点,并且所有节点都最多只有一个直接前驱和一个直接后继。
例如:线性表、栈、队列、串
1.5.1.2 非线性结构
一个结点可能有多个直接前驱和直接后继
例如:树、图
1.5.1.3 集合结构
结构中的数据元素之间除了同属于一个集合的关系外,无任何其他关系
集合结构:由若干个元素组成,没有前驱后继关系,也没有父子关系。
通常用于处理不同的数据类型,如包含整数、字符或者任意对象的集合。
1.5.1.4 线性结构
结构中的数据元素之间存在着一对一的线性关系
线性结构:由若干个数据元素组成,有明显的前驱后继关系,
例如数组、链表、栈和队列。
其中,数组是连续的内存空间,链表是离散的内存空间。
- 除了第一个元素,所有元素都有唯一前驱
- 除了最后一个元素,所有元素都有唯一后继
1.5.1.5 树形结构
结构中的数据元素之间存在着一对多的层次关系
树状结构:由若干个节点组成,节点之间有明显的父子关系,根节点是整棵树的入口,叶子节点是没有子节点的节点。
常见的树状结构有二叉树、堆、红黑树等等。
1.5.1.6 图状结构或网状结构
结构中的数据元素之间存在着多对多的任意关系
图结构:由若干个顶点和边组成,边可以是有向或无向的。每个顶点可以有一些相关的属性信息。
图结构包括稠密图和稀疏图。
稠密图指边数接近于节点数平方,而稀疏图指边数远小于节点数平方。
1.5.2 存储结构
1.5.2.1顺序存储结构:
-
用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系有元素的存储位置来表示
C语言中用数组来实现顺序存储结构
顺序存储:顺序存储是将数据元素按照其逻辑顺序连续地存储在一块连续的内存空间中。
常见的顺序存储结构包括数组和顺序表。
数组的元素在内存中是连续存储的,通过索引访问元素速度较快,但插入和删除操作需要移动元素,效率较低。
1.5.2.2 链式存储结构:
-
用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示
C语音中用指针来实现链式存储结构
链式存储:链式存储是通过使用指针或引用来连接数据元素,每个元素保存着指向下一个元素的指针。
常见的链式存储结构包括单链表、双链表和循环链表。
链式存储结构能够动态地分配内存,插入和删除元素效率较高,但访问元素需要遍历链表从头到尾,效率较低。
1.5.2.3 索引存储结构;
1.在存储节点信息的同时,还建立附加的索引表
2索引表中的每一项成为一个索引项
3.索引项的一般形式为:(关键字,地址)
4.关键字是能唯一标识一个结点的那些数据项
- 若每个节点在索引表中都有一个索引项,则该索引表称之为稠密索引(Dense Index)。
- 若一组结点在索引表中只对应一个索引项,则该索引表称之为稀疏索引(Sparse Index)。
索引存储:索引存储是在数据记录外部建立附加的索引表,索引表中的每个记录包含两部分:索引项和数据地址。通过索引项可以快速定位到对应的数据。
常见的索引存储结构包括有序索引、散列索引和倒排索引。
索引存储结构通过维护索引表来提高数据的检索速度。
1.5.2.4 散列存储结构或哈希存储结构:
- 根据结点的关键字直接计算出该节点的存储地址。
散列存储:散列存储是根据关键字直接计算出数据元素的存储位置,通过查找关键字和对应存储位置进行快速访问。
常见的散列存储结构包括散列表和哈希表。
散列存储结构通过散列函数将关键字映射到存储位置,可以实现快速的插入、删除和查找操作。
1.6 数据类型和抽象数据类型
1.在使用高级程序设计语言编写程序时,必须对程序中出现的每个变量、常量或表达式,明确说明他们所属的数据类型
2.一些最基础的数据结构可以用户数据类型来实现,如数组、字符串等
3.而另一些常用的数据结构,如栈、队列、树、图等,不能直接用数据类型来表示
4.高级语言中的数据类型明显的或隐含的规定了在程序执行期间变量和表达的所有可能得取值范围,以及在这些数值范围上所允许进行的操作
数据类型的作用:
- 约束变量或常量的取值范围
- 约束变量或常量的操作
1.6.1 数据类型(Data Type)
定义:数据类型是一组性质相同的值的集合以及定义于这个值集合上的一组操作的总称
数据类型=值的集合+值集合上的一组操作
-
原子类型:其值不可再分的数据类型
例如:int类型、bool类型等
-
结构类型:其值可以在分解为若干个成分(分量)的数据类型
例如:
// 定义一个具体的结构类型,表示一个坐标信息 struct Coordinate{ int x; //横坐标 int y; //纵坐标
}
1.6.2 抽象数据类型 (Abatract Data Type,ADT)
定义:是指一个数学模型以及定义在此数学模型上的一组操作
-
由用户定义,从问题抽象出数据模型(逻辑结构)
-
还包括定义在数据模型上的一组抽象运算(相关操作)
-
不考虑计算机内的具体存储结构与运算的具体实现算法
抽象数据类型的形式定义: 抽象数据类型可用(D,S,P)三元组表示 其中:D是数据对象;S是D上的关系集;P是对D的基本操作集
一个抽象数据类型的定义格式如下:
ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT 抽象数据类型名
其中:
数据对象、数据关系的定义用伪代码描述
基本操作的定义格式为:
- 基本操作名(参数表)
- 初始条件:<初始条件描述>
- 操作结果:<操作结果描述>
基本操作定义格式说明:
-
参数表: 赋值参数只为操作提供输入值
引用参数以&打头,除可提供输入之外,还将返回操作结果
-
初始条件:描述操作执行之前数据结构和参数应满足的条件
若不满足,则操作失败,并返回相对应出错信息。若初始条件为空,则省略之。
-
操作结果:说明操作正常完成之后,数据结构的变化状况和应返回的结果。