前言
数据结构如同房子的框架。它为数据的有序组织提供了组织架构,算法在此基础上蓬勃发展
- 学习算法之前,我们需要先了解有哪些数据结构,并且知道他们之间的关系。
一、数据结构分类
- 常见的数据结构包括数组、链表、栈、队列、树、堆、图还有哈希表。
- 我们可以从“逻辑结构”和“物理结构”两个维度进行分类。
1. 逻辑结构:线性与非线性
逻辑结构可分为“线性”和“非线性”两大类。
- 线性结构比较直观,指数据在逻辑关系上呈线性排列
- 非线性结构则相反,呈非线性排列。
线性数据结构 | 非线性数据结构 |
---|---|
数组、链表、栈、队列 | 树、堆、图 |
哈希表还要特殊一点,它即属于线性结构也属于非线性结构
非线性数据结构可以进一步划分为树形结构和网状结构。
- 树形结构:树、堆、哈希表,元素之间是一对多的关系。
- 网状结构:图,元素之间是多对多的关系。
2. 物理结构:连续与分散
- 当算法程序运行时,正在处理的数据主要存储在内存中。我们可以将内存想象成一个巨大的 Excel 表格,其中每个单元格都可以存储一定大小的数据。
- 系统通过内存地址来访问目标位置的数据。计算机根据特定规则为表格中的每个单元格分配编号,确保每个内存空间都有唯一的内存地址。有了这些地址,程序便可以访问内存中的数据。
- 内存是所有程序的共享资源,当某块内存被某个程序占用时,则通常无法被其他程序同时使用了。因此在数据结构与算法的设计中,内存资源是一个重要的考虑因素。比如,算法所占用的内存峰值不应超过系统剩余空闲内存;如果缺少连续大块的内存空间,那么所选用的数据结构必须能够存储在分散的内存空间内。
- 物理结构反映了数据在计算机内存中的存储方式,分为
: 连续空间存储(数组)
: 分散空间存储(链表) - 物理结构从底层决定了数据的访问、更新、增删等操作方法,两种物理结构在时间效率和空间效率方面呈现出互补的特点。
问题1
- 为什么哈希表同时包含线性数据结构和非线性数据结构?
- 哈希表底层是数组,而为了解决哈希冲突,我们可能会使用“链式地址”(后续“哈希冲突”章节会讲):数组中每个桶指向一个链表,当链表长度超过一定阈值时,又可能被转化为树(通常为红黑树)。
- 从存储的角度来看,哈希表的底层是数组,其中每一个桶槽位可能包含一个值,也可能包含一个链表或一棵树。因此,哈希表可能同时包含线性数据结构(数组、链表)和非线性数据结构(树)。