mirror of
https://github.com/krahets/hello-algo.git
synced 2024-12-27 14:36:29 +08:00
44 lines
2.6 KiB
Markdown
44 lines
2.6 KiB
Markdown
|
---
|
||
|
comments: true
|
||
|
---
|
||
|
|
||
|
# 3.2. 数据结构分类
|
||
|
|
||
|
数据结构主要可根据「逻辑结构」和「物理结构」两种角度进行分类。
|
||
|
|
||
|
## 3.2.1. 逻辑结构:线性与非线性
|
||
|
|
||
|
**「逻辑结构」反映了数据之间的逻辑关系**。数组和链表的数据按照顺序依次排列,反映了数据间的线性关系;树从顶至底按层级排列,反映了祖先与后代之间的派生关系;图由结点和边组成,反映了复杂网络关系。
|
||
|
|
||
|
我们一般将逻辑结构分为「线性」和「非线性」两种。“线性”这个概念很直观,即表明数据在逻辑关系上是排成一条线的;而如果数据之间的逻辑关系是非线性的(例如是网状或树状的),那么就是非线性数据结构。
|
||
|
|
||
|
- **线性数据结构**:数组、链表、栈、队列、哈希表;
|
||
|
- **非线性数据结构**:树、图、堆、哈希表;
|
||
|
|
||
|
![classification_logic_structure](classification_of_data_structure.assets/classification_logic_structure.png)
|
||
|
|
||
|
<p align="center"> Fig. 线性与非线性数据结构 </p>
|
||
|
|
||
|
## 3.2.2. 物理结构:连续与离散
|
||
|
|
||
|
!!! note
|
||
|
|
||
|
若感到阅读困难,建议先看完下个章节「数组与链表」,再回过头来理解物理结构的含义。
|
||
|
|
||
|
**「物理结构」反映了数据在计算机内存中的存储方式**。从本质上看,分别是 **数组的连续空间存储** 和 **链表的离散空间存储**。物理结构从底层上决定了数据的访问、更新、增删等操作方法,在时间效率和空间效率方面呈现出此消彼长的特性。
|
||
|
|
||
|
![classification_phisical_structure](classification_of_data_structure.assets/classification_phisical_structure.png)
|
||
|
|
||
|
<p align="center"> Fig. 连续空间存储与离散空间存储 </p>
|
||
|
|
||
|
**所有数据结构都是基于数组、或链表、或两者组合实现的**。例如栈和队列,既可以使用数组实现、也可以使用链表实现,而例如哈希表,其实现同时包含了数组和链表。
|
||
|
|
||
|
- **基于数组可实现**:栈、队列、哈希表、树、堆、图、矩阵、张量(维度 $\geq 3$ 的数组)等;
|
||
|
- **基于链表可实现**:栈、队列、哈希表、树、堆、图等;
|
||
|
|
||
|
基于数组实现的数据结构也被称为「静态数据结构」,这意味着该数据结构在在被初始化后,长度不可变。相反地,基于链表实现的数据结构被称为「动态数据结构」,该数据结构在被初始化后,我们也可以在程序运行中修改其长度。
|
||
|
|
||
|
!!! tip
|
||
|
|
||
|
数组与链表是其他所有数据结构的“底层积木”,建议读者一定要多花些时间了解。
|