数据结构类型
数据的逻辑结构:
数据的逻辑结构指元素之间的逻辑关系(和现实无关)。
分类一:线性结构和非线性结构
线性结构:有且只有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前驱和一个直接后继。
线性表就是一个典型的线性结构,它有四个基本特征:
1.集合中必存在唯一的一个"第一个元素";
2.集合中必存在唯一的一个"最后的元素";
3.除最后元素之外,其它数据元素均有唯一的"直接后继";
4.除第一个元素之外,其它数据元素均有唯一的"直接前驱"。
生活中的案例:冰糖葫芦、排队上地铁
非线性结构:
相对应于线性结构,非线性结构的逻辑特征是一个结点元素可能对应多个直接前驱和多个直接后继。
常见的非线性结构有:
树(二叉树等),图(网等)。
树:一个结点可以对应多个直接后继,但每个结点只能对应一个直接前驱(一对多)
图(网):一个结点可以对应多个直接后继和直接前驱(多对多)
树:生活案例
单位组织架构、族谱
技术案例:文件系统
图:生活案例
交通线路图、地铁线路图
分类2:集合结构、线性结构、树状结构、网络结构
逻辑结构有四种基本类型:集合结构、线性结构、树状结构和网络结构。
表和树是最常用的两种高效数据结构,许多高效的算法能够用这两种数据结构来设计实现。
1.集合结构:
就是数学中所学的集合,集合中的元素有三个特征:
1).确定性(集合中的元素必须是确定的)
2).唯一性(集合中的元素互不相同。例如:集合A={1,a},则a不能等于1)
3).无序性(集合中的元素没有先后之分。例如:集合{3,4,5}和{3,5,4}算作同一个集合)
该结构的数据元素之间的关系是"属于同一个集合",此外无其他关系。
因为集合中元素关系很弱,数据结构中不对该结构进行研究。
2.线性结构:
数据结构中线性结构指的是数据元素之间存在着"一对一"的线性关系的数据结构。
3.树状结构:
除了一个数据元素(元素01)以外每个数据元素有且仅有一个直接前驱元素,但是可以有多个直接后继元素。
特点是数据元素之间是1对多的联系
4.网络结构:
每个数据元素可以有多个直接前驱元素,也可以有多个直接后继元素。特点是数据元素之间是多对多的联系
举例说明:
一个班的学生是什么逻辑结构?
答:一个班的学生是一个集合
排队做某项事情时就是线性结构
学生会成员上下级关系就是树状结构
同学之间的座位关系就是网状结构
数据的存储结构
数据的存储结构主要包括数据元素本身的存储以及数据元素之间关系表示,是数据的逻辑结构在计算机中的表示
常见的存储结构有顺序存储,链式存储,索引存储,以及散列存储
1.顺序存储结构:
把逻辑上相邻的节点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现
由此得到的存储结构为顺序存储结构,通常顺序存储结构是借助于计算机程序设计语言(例如C/C++)的数组来描述的。
数据元素的存储对应于一块连续的存储空间,数据元素之间的前驱和后继关系通过数据元素在存储器中的相对位置来反映。
优点:
1.节省存储空间,因为分配给数据的存储单元全用来存放结点的数据(不考虑C/C++语言中数组需要指定大小的情况),结点之间的逻辑没有占用额外的存储空间。
2.采用这种方法时,可以实现对节点的随机存取,即每一个节点对应一个序号,由该序号直接计算出来节点的存储地址。
缺点:
1.插入和删除操作需要移动元素,效率较低。
2.必须提前分配固定数量的空间,如果存储元素少,可能导致空间的浪费。
2.链式存储结构:
数据元素的存储对应的是不连续的存储空间,每个存储节点对应一个需要存储的数据元素
1.每个结点是由数据域和指针域组成。元素之间的逻辑关系通过存储结点之间的链接关系反映出来。
(每个结点中需要存储本结点的数据和下一个结点数据的指针/地址)
2.逻辑上相邻的结点物理上不必相邻
缺点:
1.比顺序存储结构的存储密度小(每个结点都由数据域和指针域组成,所以相同空间内假设全存满的话顺序比链式存储更多)。
2.查找结点时链式存储要比顺序存储慢。
优点:
1.插入、删除灵活(不必移动结点、只要改变结点中的指针)。
2.有元素才会分配结点空间,不会有闲置的结点。
3.索引存储结构:
除建立存储结点信息外,还建立附加的索引表来标识结点的地址。
比如图书、字典的目录。
4. 散列存储结构:
根据每个结点的关键字直接计算出该结点的存储地址HashSet、HashMap
一种神奇的结构,添加、查询速度快。就像数组中按索引查找。
注意:
同一种逻辑结构可以对应多种存储结构
同样的运算,在不同的存储结构中,其实现过程是不同的(运算依赖于存储结构)