一、数据结构的概念
1.数据结构的定义
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
2.数据结构的分类
大体上数据结构的分类可分为逻辑层面和物理层面(计算机层面),即:数据结构=逻辑结构+存储结构。再包含对存储结构的运算/操作(增删改查、排序等)就是数据结构的完整含义。
数据结构包含下图内容:
二、数据的逻辑结构
1.逻辑结构的定义
数据的逻辑结构是指数据元素之间的逻辑关系。逻辑结构一般分为线性结构和非线性结构。
2.线性结构
线性结构:有且只有一个头结点和一个尾结点,并且所有结点都最多只能有一个前驱结点和一个后继结点。其特征是:在一个具有线性结构的非空有限
数据
集合中,
a.存在唯一个头元素和唯一的尾元素;
b.除头元素之外,集合中其他元素均只有一个前驱元素;
c.除尾元素之外,集合中其他元素均只有一个后继元素;
线性表即是一个典型的线性结构
3.非线性结构
相对应于线性结构,非线性结构的逻辑特征是一个结点元素可能对应多个直接前驱和多个直接后继。常见的非线性结构有:树(二叉树)、图等。
4.逻辑结构的其他分类
逻辑结构的另一种分类将其分为四种基本类型:集合结构、线性结构、树状结构、网状结构。
a.集合结构:即数学中的集合,包含确定性、唯一性、无序性三个特征。数据元素之间的关系仅仅只是属于同一个集合,没有其他联系。
b.线性结构:指数据元素之间存在的“一对一”的线性关系的数据结构。
c.树状结构:除根元素之外,其他元素有且仅有一个前驱结点,但是可以有多个后继结点,及数据元素之间是“一对多”的干系。
d.网状结构:每个元素都有多个前驱节点和多个后继结点,数据元素之间是“多对多”的关系。
三、数据的存储结构
1.数据的存储结构
数据的存储结构主要包括:数据元素本身的存储,以及元素之间关系的的表示,其实数据逻辑关系在物理(计算机)层面的展示。常见的数据存储结构包含有顺序存储、链式存储、索引存储、散列存储。
2.顺序存储
定义:把逻辑上相邻的结点存储在计算机上相邻的存储单元之中,数据元素之间的关系由存储单元的之间的相邻关系来表示,由此得到的存储结构即为顺序存储结构。最常见的顺序存储结构即为数组array。
在顺序存储中,数据元素的存储在一块连续的存储空间中,数据元素的前驱和后置关系通过元素在空间上的相对位置来反映,其优点是:
a.节省存储空间,不需要额外空间的来反映元素之间的对应关系,元素之间的关系通过在存储空间的相对位置来反映。
b.对空间上的数据元素存取方便,可通过计算直接定位要存取的元素的位置。
缺点:
a.插入和删除操作需要移动元素,效率较低。
b.存储空间固定,存储元素少,可能造成空间浪费;存储元素过多,则无法扩容,需要另外准备一块足够的存储空间。
3.链式存储
定义:数据元素存储在不连续的存储空间上,每个结点对应一个需要存储的数据元素。结点由数据元素和指针域(一般为前驱或后继结点地址)组成,元素之间的逻辑关系由各个结点之间的链接关系表示。其特点是,每个结点的所在存储空间不必相邻。
优点:
a.插入、删除结点灵活简单,只需改变指针域即可。
b.空间利用率高,不会有闲置结点,有元素才会分配结点空间,无需关注扩容和空间浪费问题。
缺点:
a.每个元素占用空间相对顺序存储高,需要存储元素之间的关系(指针域)。
b.查询元素时相对较慢,只能遍历查找
4.索引存储
定义:在存储数据元素的同时,还建立附加的索引表。索引表通常由若干个索引项组成,索引项的一般形式为:(key,address);关键字key是指唯一能标识一个或一组数据元素的数据项。
索引表一般分为稠密索引和稀疏索引:
a.稠密索引:每个数据节点在索引表中都有一个索引项。
b.稀疏索引:一组数据节点在索引表中只对应一个索引项。
例如:字典的目录,图书。
优点:
优点是检索速度快;缺点是增加了附加的索引表,会占用较多的存储空间。另外,在增加和删除数据时要修改索引表,因而会花费较多的时间
5.散列存储
定义:可以根据结点的关键字直接计算出结点的存储地址,又称hash存储,java中hashmap,hashset均是基于散列。
优点:
是检索、增加和删除结点的操作都很快;缺点是如果散列函数不好可能出现元素存储单元的冲突,而解决冲突会增加时间和空间开销。