数据结构
1 一些概念
数据 = 数据元素 + 数据的结构(数据结构)
1.1 数据元素
1.2 数据结构
结构,是指 事物自身各种要素之间的相互关联和相互作用的方式
,包括构成事物要素的数量比例、排列次序、结合方式和因发展而引起的变化,这是事物的结构。
因此数据的结构就是数据元素之间的相互关联和相互作用的方式。
1.3 逻辑结构和物理结构
当设计一个数据结构时,我们首先紧会考虑它的逻辑结构,之后为了实现这种逻辑结构,我们需要考虑它在计算机中的物理存储方式。
因此,从逻辑或物理的角度可以对数据结构进行分类。
1.3.1 逻辑结构
事物之间的关系可以分为:
- 无关系
- 一对一
- 一对多
- 多对多
因此,从这个角度逻辑结构分为:
- 集合结构 (无关系)
- 线型结构 (一对一)
- 树型结构 (一对多)
- 图型结构 (多对多)
1.3.2 物理结构
物理结构指计算机为了体现逻辑结构,物理上存储数据的方式。
物理结构分为:
- 顺序存储
- 链式存储
1.3.3 顺序存储
使用一段连续的存储空间来对数据进行存储。
1.3.4 链式存储
可以使用任意的存储空间对数据进行存储,但是会 存储额外的信息来体现他们之间的关系
。
2 线性表(线型结构)
2.1 顺序存储
使用一段连续的内存空间来存储线性结构。
2.1.1 优缺点
2.2 链式存储
前面的 顺序结构优缺点
中已经可以看到其在 插入删除
时由于需要保持内存的连续性,带来了性能开销。
因此,引入链式存储。
2.2.1 定义
使用连续或连续的空间,保存数据本身,再使用额外的空间保存地址(用来维护相互间的关系)
2.2.2 节点结构
每个节点由两部分构成
- 存储数据的数据域
- 存储后继节点的地址域
/* 单链表存储结构 */ |
2.2.3 性能
对链表的操作主要包括两部分,
- 查询到指定节点
- 插入或删除节点
查询节点的性能为O(n), 而插入或删除为O(1).
2.2.4 头指针
指向线性表中第一个节点的指针即为头指针。
- 在线性表的链式存储结构中,头指针是指链表指向第一个结点的指针,若链表有头结点,则头指针就是指向链表头结点的指针。
- 头指针具有标识作用,故常用头指针冠以链表的名字。
- 无论链表是否为空,头指针均不为空。头指针是链表的必要元素。
2.2.5 头结点
出于统一操作逻辑,优化算法的目的,会在单链表的第一个结点(有效元素)之前附设一个结点,称之为头结点
- 头结点是为了操作的统一与方便而设立的,放在第一个元素结点之前,其数据域一般无意义(当然有些情况下也可存放链表的长度、用做监视哨等等)。
- 有了头结点后,对在第一个元素结点前插入结点和删除第一个结点,其操作与对其它结点的操作统一了。
- 首元结点也就是第一个元素的结点,它是头结点后边的第一个结点。
- 头结点不是链表所必需的。
3 树
3.1 定义
树(Tree)是n(n≥0)个结点的有限集T,T为空时称为空树,否则它满足如下两个条件: (1)有且仅有一个特定的称为根(Root)的结点; (2)其余的结点可分为m(m≥0)个互不相交的子集Tl,T2,…,Tm,其中每个子集本身又是一棵树,并称其为根的子树(Subree)。
一棵非空树是由若干棵子树构成的,而子树又可由若干棵更小的子树构成
3.2 节点的degree(度)
节点所有的子树数
3.3 树的degree
最大的节点的度即为树的度