数据结构的基本概念
这一节只在选择题里出现,考法几乎固定:给一个名词,判断它是逻辑结构、存储结构,还是一个完整的数据结构。 教材【复习提示】的原话是「本章内容是数据结构概述」,第 1 章真正的重点在 1.2 复杂度分析。
机制
1.1.1 六个术语
| 术语 | 定义 |
|---|---|
| 数据 | 信息的载体,是所有能输入计算机并被程序识别和处理的符号的集合 |
| 数据元素 | 数据的基本单位,通常作为一个整体进行考虑和处理 |
| 数据项 | 构成数据元素的不可分割的最小单位 |
| 数据对象 | 具有相同性质的数据元素的集合,是数据的一个子集(如整数集 |
| 数据类型 | 一个值的集合和定义在此集合上的一组操作的总称 |
| 数据结构 | 相互之间存在一种或多种特定关系的数据元素的集合 |
「基本单位」和「最小单位」是两个词。 数据元素是基本单位,数据项是最小单位。例如一条学生记录是一个数据元素,它由学号、姓名、性别等数据项组成。
数据类型分三类:
- 原子类型:值不可再分。
- 结构类型:值可以再分解为若干成分(分量)。
- 抽象数据类型(ADT):一个数学模型及定义在该模型上的一组操作。它定义了数据的取值范围、结构形式,以及对数据操作的集合。
ADT 可以定义一个完整的数据结构。 它通常用(数据对象,数据关系,基本操作集)这样的三元组表示,同时描述了逻辑结构和抽象运算。
1.1.2 数据结构三要素
数据结构包括三方面内容:逻辑结构、存储结构、数据的运算,缺一不可。三者的关系是:
- 逻辑结构独立于存储结构:它从数据元素之间的逻辑关系描述数据,与计算机无关。
- 存储结构不能独立于逻辑结构:它是逻辑结构在计算机中的映射,由计算机语言实现,依赖于计算机语言。
- 算法的设计取决于逻辑结构,算法的实现依赖于存储结构。
逻辑结构的分类
flowchart TD L["数据的逻辑结构"] --> LIN["线性结构"] L --> NON["非线性结构"] LIN --> G1["一般线性表"] LIN --> G2["受限线性表<br/>栈和队列、串"] LIN --> G3["线性表推广<br/>数组"] NON --> S["集合"] NON --> T["树形结构<br/>一般树、二叉树"] NON --> GR["图状结构<br/>有向图、无向图"]
四类基本关系:
| 结构 | 元素之间的关系 |
|---|---|
| 集合 | 除「同属一个集合」外,别无其他关系 |
| 线性结构 | 一对一 |
| 树形结构 | 一对多 |
| 图状 / 网状结构 | 多对多 |
集合在教材的分类图里属于非线性结构。 栈、队列、串、数组都是线性结构。
存储结构的四种方式
存储结构(物理结构)是数据结构在计算机中的表示,既要表示数据元素,也要表示元素之间的关系。
| 方式 | 做法 | 优点 | 缺点 |
|---|---|---|---|
| 顺序存储 | 逻辑上相邻的元素,物理位置也相邻;关系由存储单元的邻接关系体现 | 随机存取;每个元素占用最少的存储空间 | 只能使用一整块相邻的存储单元,可能产生较多外部碎片 |
| 链式存储 | 不要求物理相邻,借助指针表示元素之间的逻辑关系 | 不会出现碎片,能充分利用所有存储单元 | 指针占用额外空间;只能顺序存取 |
| 索引存储 | 存储元素的同时建立附加的索引表,索引项为(关键字,地址) | 检索速度快 | 索引表占用额外空间;增删数据时也要修改索引表,花费较多时间 |
| 散列存储 | 根据关键字直接计算存储地址,也称哈希(Hash)存储 | 检索、增加和删除结点的操作都很快 | 散列函数不好会产生冲突,解决冲突增加时间和空间开销 |
数据的运算
- 运算的定义针对逻辑结构,指出运算的功能。
- 运算的实现针对存储结构,指出运算的具体操作步骤。
同一逻辑结构、同一运算,换一种存储方式,效率就可能不同。例如在线性表中插入元素:顺序存储平均要移动近一半的元素,为
边界
| 说法 | 判断 | 说明 |
|---|---|---|
| 「数据项是数据的基本单位」 | ❌ | 数据元素是基本单位,数据项是最小单位 |
| 「数据对象就是数据」 | ❌ | 数据对象是性质相同的数据元素的集合,是数据的子集 |
| 「有序表是一种存储结构」 | ❌ | 有序表只规定关键字有序这一逻辑关系,可以顺序存储也可以链式存储,属于逻辑结构 |
| 「顺序表、哈希表、单链表都是逻辑结构」 | ❌ | 三者同时描述逻辑结构、存储结构和运算,是三种完整的数据结构 |
| 「集合是线性结构」 | ❌ | 集合的元素之间除同属一个集合外别无关系,教材归入非线性结构 |
| 「栈、队列、字符串是非线性结构」 | ❌ | 都是线性结构;树和图才是典型的非线性结构 |
| 「存储结构独立于逻辑结构」 | ❌ | 方向反了:逻辑结构独立于存储结构,存储结构是逻辑结构在计算机上的映射 |
| 「逻辑结构唯一决定存储结构」 | ❌ | 同一逻辑结构可以有多种存储方式 |
| 「数据结构仅由逻辑结构和存储结构决定」 | ❌ | 三要素缺一不可,还有数据的运算 |
| 「存储数据时只需存储各元素的值」 | ❌ | 还要存储元素之间的关系 |
| 「两种不同的数据结构,逻辑结构或物理结构一定不同」 | ❌ | 二叉树和二叉排序树的逻辑结构、存储结构都可以相同,区别在运算的定义(查找的平均时间分别为 |
| 「链式存储容易产生碎片」 | ❌ | 链式存储不会出现碎片;顺序存储才可能产生较多外部碎片 |
| 「链式存储可以随机存取」 | ❌ | 只能顺序存取 |
错题复盘:有序表属于哪一类(1.1.3 第 3 题)
四个选项是顺序表、哈希表、有序表、单链表,问哪个属于逻辑结构,答案是有序表。 另外三个名字里都带着存储方式(「顺序」「哈希」「链」),所以是完整的数据结构。 有序表只说了关键字有序,没说怎么存,因此只是逻辑结构。
错题复盘:数据结构的四个说法(1.1.3 第 4 题)
正确的是「数据的逻辑结构独立于其存储结构」。另外三个选项分别犯了三种错: 把依赖方向说反(存储结构独立于逻辑结构);把「有多种选择」说成「唯一」(逻辑结构唯一决定存储结构);漏掉运算(仅由逻辑结构和存储结构决定)。
考点
- 基本单位(数据元素)与最小单位(数据项)。
- 名词归类:有序表是逻辑结构;顺序表、哈希表、单链表是完整的数据结构。
- ADT 可以定义一个完整的数据结构。
- 三要素缺一不可;逻辑结构独立于存储结构,反之不成立。
- 四种存储方式的优缺点,尤其是「顺序存储有外部碎片、链式存储无碎片」。
链接
- 🏠 返回总览:数据结构第 1~4 章总览
- ➡️ 下一节:1.2 算法和算法评价
- 🔗 顺序存储与链式存储的完整对比:速查:顺序表与链表
- 🔗 索引存储的实例:7.2.1 顺序查找与分块查找(分块查找的索引表)
- 🔗 散列存储:7.5.1 散列表的基本概念与散列函数
- 📖 名词库:第 1~4 章名词库