JavaSE-数据结构
数据结构
1. 什么是数据结构
数据结构含义
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,进行选择的数据结构可以带来更加高效的运行或储存效率。数据结构往往同高效的检索算法和索引技术有关。简单来说就是在程序设定中,为了方便,把数据按照某种形式组织起来,而这个某种形式就是数据结构。
2. 数据结构的分类
数据结构的分类
- 逻辑结构:数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后关系,而与它们在计算机中的储存位置无关。表示的只是数据与数据间的关系。
- 物理结构:物理结构又叫做存储结构,指数据的逻辑结构在计算机储存空间的存放形式。也是真正在计算机储存。表示的是内存的储存关系。
3. 逻辑结构
逻辑结构
分为两类:
- 线性结构
数组、队列、栈、线性表、串
-
解析:有且只有一个开始节点和一个终端节点,并且所有节点最多只有一个直接前驱和一个直接后继。
-
特点:
- 集合中必存在唯一一个 “首位元素”。
- 集合中必存在唯一一个 “末位元素”。
- 除最后一个元素外,其他元素都有 “直接后继”。
- 除第一个元素外,其他元素都有 “直接前驱”。
-
案例:排队
- 非线性结构
树形结构
-
解析:一个节点元素,对应多个直接前驱和多个直接后继。
-
特点:
- 具有层次关系
-
案例:族谱
图形结构
-
解析:多对多关系。
-
特点:多对多。
-
案例:地铁路线图。
4. 物理结构(存储结构)
物理结构
真正计算机储存的结构。
- 顺序储存
-
解析:把逻辑上相邻的节点存储在物理位置相邻的存储单元中。
-
案例:银行排队
- 链式储存
-
解析:把逻辑上相邻的节点存储在物理位置不相邻的存储单元中,每个节点是由数据域和指针域组成。
-
案例:银行区号区轮号
- 索引储存
-
解析:除建立储存节点信息外,还建立附加的 索引表 来标识节点的地址。
-
案例:书的目录、导航
- 散列储存(哈希表)
5. 逻辑结构对应的存储结构实现
6. 线性表
逻辑结构
线性表逻辑结构对应顺序储存结构为顺序表,对应链式储存为链表。
物理结构
顺序表
顺序表
假如放的都是int类型的数据,起始地址就是1000 ,一个int 数据占4 个字节,所以对应的地址就是:
因此就可以进行一步到位的查找:
0 下标:地址 1000+0*4
1 下标:地址 1000+1*4
…
n 下标:地址 1000+n*4
总结
- 优点:按照索引查询效率高。
- 缺点:对于删除和增加的情况来说效率就低。
链表
链表
- 单向链:每个节点只有一个指针域,指向下一节点。
- 双向链:每个节点有两个指针域,一个指向上一节点,一个指向下一节点。
- 循环链:首尾相连。
总结
- 优点:插入和删除的效率高。
- 缺点:查询效率慢,各个节点地址无规律可循。
7. 栈和队列
栈和队列,实际上是操作受限的线性表,既然是线性表,那么用顺序表和链表都可以实现。
什么是限制?
栈:特点:先进后出,后进先出
-
实际应用
(1)内存分析:形参,局部变量放入栈中。放入那个区域的数据结构就是按照栈来做的
(2)浏览器会将用户访问过的网址组织成一个栈
(3)文本编辑器的 ctrl + z(撤销) 和 ctrl + y(恢复)
队列:特点:先进先出,后进后出
-
双端队列
(1)前后端都能进出
(2)进行限制
(3)队列转栈
8. 树
树的基本概念
基本概念
树是n(n>=0)个结点的有限集
1. 空树:不包含任何结点。n=0
2. 非空树:会有特定的根结点和叶子结点。n>0
树的度和结点的度
结点拥有的子树的数量就是结点的度。
树内各结点的度的最大值就是树的度。
终端结点,分支结点,内部结点
结点度为0 的节点称为终端结点。
结点度不为0 的结点称为分支结点。
除根结点之外的分支结点也称为内部结点。
结点的层次和深度
从根开始结点的层次数,从1开始,称为结点的层次。
从根开始结点的最大的层次称为节点的深度。
m叉树
该树的最大叉树是几,就是几叉树。
二叉树
二叉树的概念
每个结点的度均不超过2的树称为二叉树。
满二叉树
每层内部结点都达到最大数称为满二叉树。
特点:
1. 随着层次(k)的变化,结点数呈现2^(k-1)
2. 每一层结点个数都是其上面全部层数的结点数+1
完全二叉树
若在一个完全二叉树中,在最下层的右侧起去掉相邻的若干结点得到的树称为完全二叉树。
满二叉树一定是完全二叉树,而完全二叉树不一定是满二叉树。
二叉树的存储结构
二叉树的物理结构(存储结构)有两种:
1. 顺序存储
2. 链式储存
对于满二叉树,完全二叉树用顺序存储结构。
但是一般情况下的二叉树都是不满不完全的所以尽量使用链式储存结构。
二叉链表
缺点:查找是只能从根结点进行查找,想要一步到位则使用三叉链表来解决问题。
三叉链表:
二叉树的遍历
-
中序遍历:左结点—> 根结点—> 右结点
结果应为:b–>g–>d–>h–>a–>e–>c–>f
-
先序遍历:根结点—> 左结点—> 右结点
结果应为:a–>b–>d–>g–>h–>c–>e–>f
-
后续遍历:左结点—> 右结点—> 根结点
结果应为:g–>h–>d–>b–>e–>f–>c–>a
解题:
后序遍历:左右中
中序遍历:左中右
1. 判断根结点
由于后续排序最后一个元素就是根结点,所以根结点就是元素1。
2. 判断左右子树
由于中序排序所以,1的左边子树包含4,5,右子树包含3,2,6,7。
3. 处理左子树
由于后续排序5 在4 的左边所以4为左右子树的根结点,根据中序排序5 在4 的右边所以4 的右子树就是5 。
4. 处理右子树
由于这是一个二叉树,所以根据后续排序2 就是右子树的根结点,根据中序排序3 就是2 的左子树。再根据后续排序6 就是右子树的根结点,再根据中序排序7 就是6 的子树。
结果:
二叉搜索树
特点:
1. 可是空树
2. 具有一定特性的二叉树
(1)若它的子树不为空,则左子树上所有结点的值均小于根结点的值。
(2)若它的子树不为空,则右子树上所有结点的值均大于根结点的值。
(3)左右树分别是二叉排序树。
(4)进行中序遍历时有序。
平衡二叉树
特点:
1. 左右两个子树的高度差(平衡因子)的绝对值不超过1。
非平衡二叉树
特点:
1. 左右两个子树的高度差(平衡因子)的绝对值超过1。
红黑树
特点:
1. 每个结点或是黑色或是红色。
2. 根结点是黑色。
3. 每个叶子节点(NIL)是黑色。【注意:这里是叶子结点,是指为空(NIL或NULL)的叶子节点】。
4. 如果一个结点是红色的,则它的子节点必须是黑色的。
5. 从一个结点到该结点的子孙结点的所有路径上包含相同数目的黑节点。
红黑代表什么?为什么要有红色和黑色??后面再讲~太难
9. 图
图的存储结构
可以采用顺序存储结构和链式存储结构,更多采用链式存储结构。
实际上底层结构就是【数组】 + 【链表】
什么是图的权
在实际应用中,图不但需要表示元素之间是否存在某种关系,而且图的边往往与具有一定实际意义的数有关,即每条边都有它相关的实数,称为【权】,例如:
加权图数组表示含义:a 到b 有3 公里,a 到e 至少需要多少公里?