# 数据结构是什么?
对于数据结构这个概念,至今尚未有一个被一致公认的定义,不同的人在使用这个词时所表达的意思有所不同。
-
“数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系。这些联系可以通过定义相关的函数来给出。”
--- Sartaj Sahni,《数据结构、算法与应用》 -
“数据结构是ADT(抽象数据类型 Abstract Data Type)的物理实现。”
--- Clifford A.Shaffer,《数据结构与算法分析》 -
“数据结构(data structure)是计算机中存储、组织数据的方式。通常情况下,精心选择的数据结构可以带来最优效率的算法。”
--- 中文维基百科
到底什么是数据结构?
- 数据对象在计算机中的组织方式,包括:
逻辑结构
物理存储结构:逻辑结构在机器的内存里面怎么放 - 数据对象必定与一系列加在其上的操作相关联
- 完成这些操作所用的方法就是算法
所有的数据都是由数据元素构成,数据元素是数据的基本单位。数据元素也称元素、结点、顶点、记录。一个数据元素可以由若干个数据项(也可称为字段、域、属性)组成,数据项是数据的不可分割的最小单位。
数据结构存在的目的:
让我们操作里面的数据,快速。
- 方便我们增加
- 方便我们快速查找到(查是删改的前提)
- 节省空间(存储)
当然,操作的时候,不光与数据结构有关,与算法的精妙程度也有关系。
今天主要总结一下逻辑结构和存储结构。
## 抽象数据类型(Abstract Data Type)
描述数据结构有一个很好的方法 - 抽象数据类型
两个关键词:抽象
、数据类型
-
数据类型(包含两部分内容)
- 数据对象集
- 数据集合相关联的操作集
C语言中是单独处理的,在高级语言中,通常会用
类
将数据集跟和它相关的操作集封装在一起 -
抽象:描述数据类型的方法不依赖于具体实现
- 与存放数据的机器无关
- 与数据存储的物理结构无关
- 与实现操作的算法和编程语言均无关
只描述数据对象集和相关操作集“是什么”
,并不涉及“如何做到”
的问题
# 什么是逻辑结构?
简单说,逻辑结构就是数据之间的关系。
按数据之间的关系来说,逻辑结构大概可以分为两种:
- 线性结构
- 线性表:顺序表、链表(线性链表、循环链表、双向链表)
- 栈(顺序栈、链栈)
- 队列(顺序队列、链队列(循环链等))
...
- 非线性结构
- 集合
- 树(二叉树)
- 图(网)
...
## 线性结构
有且只有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前驱和一个直接后继。它们共同的特点就是数据之间的线性关系,除了头结点和尾结点之外,每个结点都有唯一的前驱和唯一的后继,也就是所谓的一对一的关系。
不同的线性表之间的区别:
线性表在元素的关系上是一样的,都是"线性"关系,不同的线性表区别主要体现在不同的特性上。
比如:队列的先进先出、栈的后进先出等。
以链栈,链队列为例:
逻辑结构同为线性表,存储结构也相同,都是链式存储的,每个结点都是由数据域和指针域组成,每个结点也都有唯一的前驱和唯一的后继(除头尾结点外)。
那么它们看起来就很相似,区别呢?
区别就在于给他们定义的特殊操作,它们都有"出"和"入"两种操作,一个是"先进先出",而一个是"后进先出"。
## 非线性结构
对应于线性结构,非线性结构也就是每个结点可以有不止一个直接前驱和直接后继。
# 什么是存储结构(/物理结构)?
逻辑结构指的是数据间的关系,而存储结构是逻辑结构的存储映像。
常见的存储结构:
- 顺序存储 -- (应用:数组)
- 链式存储 -- (应用:指针)
- 索引存储
- 散列存储(哈希表)
## 顺序存储
把逻辑上相邻的节点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现。由此得到的存储结构为顺序存储结构。
通常顺序存储结构是借助于数组来描述的。
优点:节省空间,可以实现随机存取;
缺点:插入、删除时需要移动元素,效率低。
## 链式存储
在计算机中用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。
特点是
元素逻辑上相邻,但在物理上可以不相邻
,所以每个数据元素包括了一个数据域和一个指针域,数据域用来存放数据,而指针域用来指向其后继结点的位置。
优点:
- 插入、删除灵活 (不必移动节点,只要改变节点中的指针)
缺点:
- 不能随机存取,查找速度慢。
- 比顺序存储结构的存储密度小 (每个节点都由数据域和指针域组成,所以相同空间内假设全存满的话顺序比链式存储更多)。
## 索引存储
除建立存储结点信息外,还建立附加的索引表来标识结点的地址。索引表由若干索引项组成。
特点:索引存储结构是用结点的索引号来确定结点存储地址,其优点是检索速度快,缺点是增加了附加的索引表,会占用较多的存储空间。
## 散列存储
散列存储,又称hash存储,是一种力图将数据元素的存储位置与关键码之间建立确定对应关系的查找技术。
散列法存储的基本思想是:由节点的关键码值决定节点的存储地址。散列技术除了可以用于查找外,还可以用于存储。
特点:散列是数组存储方式的一种发展,相比数组,散列的数据访问速度要高于数组,因为可以依据存储数据的部分内容找到数据在数组中的存储位置,进而能够快速实现数据的访问。
理想的散列访问速度是非常迅速的,而不像在数组中的遍历过程,采用存储数组中内容的部分元素作为映射函数的输入,映射函数的输出就是存储数据的位置,这样的访问速度就省去了遍历数组的实现,因此时间复杂度可以认为为O(1),而数组遍历的时间复杂度为O(n)。
# 逻辑结构和存储结构的区别
- 文件的逻辑结构:是用户可见结构,即从用户观点出发观察到的文件组织。
用途:为了描述数据之间的联系 -
文件的物理结构:文件的存储结构,即文件在外存的存储组织形式。涉及存储介质、外存分配方式。
用途:关注于如何能使数据的增删改查更简单快捷。 文件组织结构.png
通俗点说:用户要看到的数据就是这个结构(字符流式、记录式等)的, 而存储介质怎么存(连续、链式、 索引),是连续存,还是拆开了(RAID),用户是不管的。
网友评论