【java算法与数据结构】必备知识点汇总

2020-12-23 18:27

阅读:672

标签:目标   成本   包含   data   后续遍历   矩阵   das   长度   树的遍历   

码字不易,喜欢请点赞!!!
1.数据结构基础
2.线性表(顺序存储、链式存储)

元素之间是有顺序的:第一个元素无前驱,最后一个元素无后继,其他元素都有前驱和后继
顺序存储结构:用一段地址连续的存储单元一次存储线性表的数据元素(存取时间复杂度为O(1),插入或删除时间复杂度为O(N),适合数据量不大并且存取操作多的数据)
优缺点:

链式结构:元素信息+后继元素的地址(读取、插入、删除:时间复杂度O(N))
头指针:链表第一个结点的存储位置;
尾结点:后继不存在,即最后一个结点的指针为空;
头结点:第一个结点前设一个结点,可以不存储任何信息,也可以存储长度等附加信息

优缺点:

3.栈

4.队列、循环队列

5.串

子串查找:KMP算法
6.树

节点的度:节点的分支数目

树的度:树内各个节点的度的最大值

叶节点、终端节点:度为0的点

树的深度:树中节点的最大层次


二叉树:n个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根节点和两颗互不相交、分别称为根节点的左子树和右子树的二叉树组成。

二叉树的5种形态:


满二叉树:


完全二叉树


二叉树的性质

二叉树的第i层,最多有2i−1 2^{i-1}2
i−1
结点

深度为k的二叉树,最多有2k−1 2^k-12
k
−1个节点

具有n个结点的完全二叉树的深度为[logn2]+1 [log_2^n]+1[log
2
n
?
]+1([x]表示对x下取整)

二叉树T,叶子节点数为n0 n_0n
0
?
,度为2的节点数为n2 n_2n
2
?
,则n0 n_0n
0
?
= n2 n_2n
2
?
+ 1
因为节点数n = n0 n_0n
0
?
+ n1 n_1n
1
?
+ n2 n_2n
2
?
= 2n2 n_2n
2
?
+ n1 n_1n
1
?
+ 1
所以:n0 n_0n
0
?
= n2 n_2n
2
?
+ 1


对于完全二叉树的节点i:


二叉树的存储

一维数组存储:使用一维数组按照顺序存储,对于不存在的节点使用空来占位

二叉链表:lchild+data+rchild形式


二叉树的遍历:前序遍历、中序遍历、后序遍历、层序遍历(逐层遍历)

已知前序和中序,可以确定一颗二叉树

已知后序和中序,可以确定一颗二叉树

已知前序和后序,不可以确定一颗二叉树

树、森林、二叉树的转换

树转换成二叉树

1.加线:兄弟节点之间加一条线
2.去线:对每个节点只保留第一个子节点的连线,删除其他子节点的连线
3.层次调整:第一个子节点为左孩子,兄弟节点转成第一个子节点的右孩子
1
2
3
eg:


森林转成二叉树
#森林由多棵树组成,将森林中每一颗树都视为兄弟,按照兄弟的办法来处理
1.将每棵树转成二叉树
2.将后面的树的根节点作为前面的树的根节点的右孩子
1
2
3
eg:


二叉树转成树
#树转成二叉树的逆过程
1.加线:左孩子的所有右孩子,与左孩子的父节点连接起来。
2.去线:删除原二叉树中的所有右孩子连线。
3.层次调整:旋转
1
2
3
4
eg:


二叉树转成森林
#如果根节点有右孩子,则是森林,没有孩子,则是一棵树
1.先将根节点的右孩子线删除,拆成多颗二叉树
2.然后对每个二叉树执行拆分成树的操作
1
2
3
eg:


树与森林的遍历

树的遍历:先根遍历、后根遍历

 

森林的遍历:前序遍历、后续遍历

前序遍历结果:ABCDEFGHJI
后序遍历结果:BCDAFEJHIG


哈夫曼树

简介


1.节点的带权路径:节点到根之间的路径长度与节点权值的乘积
2.树的带权路径:树中所有节点的带权路径之和
3.哈夫曼树:带权路径长度WPL最小的二叉树,称为哈夫曼树,也叫最优二叉树
1
2
3
二叉树a的WPL=51+152+403+304+104=315
二叉树b的WPL=53+153+402+302+102=220
这个结果意味着,如果有10000个学生需要计算,那么二叉树a的判断方法需要计算31500次,而二叉树b的方法需要计算22000次。

哈夫曼树构造

 

7.图

定义


无向边:顶点之间没有方向,称这条边为无向边,用无序偶对(vi,vj) (v_i,v_j)(v
i
?
,v
j
?
)来表示

有向边:顶点之间有方向,称这条边为有向边,也称为弧,用有序偶对<vi,vj> <v_i,v_j>i
?
,v
j
?
>来表示,如果图中任意两个顶点的边都是有向边,则称该图为有向图,要区分开弧尾vj v_jv
j
?
和弧头vi v_iv
i
?

无向图:如果任意两个顶点之间都存在边,则称该图为无向完全图,含有n个顶点的无向完全图有n(n−1)/2 n(n−1)/2n(n−1)/2条边。

有向图:如果任意两个顶点间都存在方向互为相反的两条弧,则称为有向完全图。含有n个顶点的有向完全图有n(n−1) n(n−1)n(n−1)条边。

连通图:无向图中,如果两个顶点之间有路径,说明两顶点是连通的,如果对于图中任意两个顶点都是连通的,则称该无向图是连通图。

极大连通子图称为连通分量:需要是1.子图;2.子图是连通的;3.连通子图含有极大顶点数;4.具有极大顶点数的连通子图包含依附这些顶点的所有边。

度:无向图顶点的边数叫度,有向图的顶点分为出度和入度。

生成树、森林:无向图中连通且n个顶点有n-1条边叫生成树;有向图中一个顶点入度为0,其余顶点入度为1称为有向树;一个有向图由若干个有向树构成生成森林。

图的存储结构
由于图的结构比较复杂,任意两点之间都可能存在联系,因此不能用简单的顺序存储结构来表示。

邻接矩阵

邻接矩阵的存储方式:两个数组来表示图;
一个一维数组存储图中顶点的信息;
一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。
1
2
3

 


邻接表
临近矩阵的问题:对边数相对顶点数较少的图,这种结构是对存储空间的极大浪费,太稀疏。
1


邻接表:将数组与链表结合起来
1
无向图:

有向图:

带权有向图:


十字链表
在有向图中,邻接表是有缺陷的,关心了出度问题,要想知道入度,就必须遍历整个图;
反之逆邻接表解决了入度却不能解决出度;
那能否将邻接表与逆邻接表结合起来呢?
答案是肯定的,于是就有了一种新的有向图的存储方法:十字链表法。
1
2
3
4


邻接多重表

边集数组
边集数组是由两个一维数组构成。一个是存储顶点的信息;另一个是存储边的信息,这个边数组每个数据元素有一条边的起点下标(begin)、终点下标(end)和权(weight)组成。


图的遍历:深度优先搜索、广度优先搜素

深度优先搜索:

广度优先遍历:类似于树的层序遍历

深度优先更适合目标比较明确,以找到目标为主的情况,广度优先更适合在不断扩大遍历访问时找到最优解的情况。

最小生成树

定义:给定一个无向图,如果他的某个子图中,任意两个顶点都能互相连通并且是一棵树,那么这棵树就叫做生成树,如果边上有权值,那么使得边权和最小的生成树叫做最小生成树。即构成连通网的最小代价生成树称为最小生成树。

实际问题:我们要在n个城市中建立一个通信网络,则连通这n个城市需要布置n-1一条通信线路,这个时候我们需要考虑如何在成本最低的情况下建立这个通信网?

普里姆算法—Prim算法:适合稠密图
【算法思想】:Prime算法是一种贪心算法,它最初将无向连通图G中所有顶点V分成两个顶点集合VA和VB。在计算过程中VA中的点为已经选好连接入生成树的点,否则属于VB。最开始的时候VA只包含任意选取的图G中的一个点u,其余的点属于VB,每次添加一个VB中的点到VA,该点是集合VB到集合VA中距离最小的一个点。直到V个顶点全部属于VA,算法结束。显然出发点不同,最小生成树的形态就不同,但边权和的最小值是唯一的。
eg:

【java算法与数据结构】必备知识点汇总

标签:目标   成本   包含   data   后续遍历   矩阵   das   长度   树的遍历   

原文地址:https://www.cnblogs.com/go1188/p/13212993.html


评论


亲,登录后才可以留言!