Skip to content

Commit ef6e666

Browse files
committed
更新数据结构与算法
1 parent 9a31143 commit ef6e666

File tree

2 files changed

+1008
-26
lines changed

2 files changed

+1008
-26
lines changed

计算机基础/数据结构与算法/数据结构.md

Lines changed: 88 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -79,25 +79,50 @@
7979

8080
### AVL树
8181

82-
平衡二叉搜索树,它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1。下面了解一下**左旋与右旋**的概念。
82+
**平衡二叉搜索树**,它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1。
83+
84+
![](http://img.dabin-coder.cn/image/image-20220722233208322.png)
85+
86+
简单了解一下**左旋与右旋**的概念。
8387

8488
左旋与右旋就是为了解决不平衡问题而产生的,我们构建一颗AVL树的过程会出现结点平衡因子(平衡因子就是二叉排序树中每个结点的左子树和右子树的高度差。)绝对值大于1的情况,这时就可以通过左旋或者右旋操作来达到平衡的目的。
8589

86-
1、左左单旋转
90+
四种旋转情况
8791

88-
![](http://img.dabin-coder.cn/image/左左单旋转.png)
92+
![](http://img.dabin-coder.cn/image/四种旋转情况.png)
8993

90-
2、左右双旋转
94+
### 红黑树
9195

92-
![](http://img.dabin-coder.cn/image/左右双旋转.png)
96+
红黑树是对AVL树的优化,只要求部分平衡,用非严格的平衡来换取增删节点时候旋转次数的降低,提高了插入和删除的性能。查找性能并没有提高,查找的时间复杂度是O(logn)。红黑树通过左旋、右旋和变色维持平衡。
9397

94-
3、四种旋转情况
98+
![](http://img.dabin-coder.cn/image/20220619165116.png)
9599

96-
![](http://img.dabin-coder.cn/image/四种旋转情况.png)
100+
对于插入节点,AVL和红黑树都是最多两次旋转来实现平衡。对于删除节点,avl需要维护从被删除节点到根节点root这条路径上所有节点的平衡,旋转的量级为O(logN),而红黑树最多只需旋转3次。
101+
102+
红黑树的特性:
103+
104+
- 每个节点或者是黑色,或者是红色。
105+
- 根节点和叶子节点是黑色,叶子节点为空。
106+
- 红色节点的子节点必须是黑色的。
107+
- 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点,保证没有一条路径会比其他路径长一倍。
108+
109+
优点:相比avl树,红黑树插入删除的效率更高。红黑树维持红黑性质所做的红黑变换和旋转的开销,相较于avl树维持平衡的开销要小得多。
110+
111+
**应用场景**
112+
113+
- Java ConcurrentHashMap & TreeMap
114+
- C++ STL: map & set
115+
- linux进程调度Completely Fair Scheduler,用红黑树管理进程控制块
116+
- epoll在内核中的实现,用红黑树管理事件块
117+
- nginx中,用红黑树管理timer等
97118

98119
### B树
99120

100-
也称B-树,属于多叉树又名平衡多路查找树。规则:
121+
也称B-树,属于多叉树又名平衡多路查找树。
122+
123+
![](http://img.dabin-coder.cn/image/B-树.png)
124+
125+
规则:
101126

102127
- 1<子节点数<=m,m代表一个树节点最多有多少个查找路径
103128
- 每个节点最多有m-1个关键字,非根节点至少有m/2个关键字,根节点最少可以只有1个关键字
@@ -111,44 +136,79 @@ B-树的特性:
111136

112137
B+树是B-树的变体,也是一种多路搜索树。B+的搜索与B-树基本相同,区别是B+树只有达到叶子结点才命中,B-树可以在非叶子结点命中。B+树更适合文件索引系统。
113138

114-
B-和B+树的区别
139+
![](http://img.dabin-coder.cn/image/B+树.jpg)
140+
141+
B-和B+树的区别:
115142

116143
- B+树的非叶子结点不包含data,叶子结点使用链表连接,便于区间查找和遍历。B-树需要遍历整棵树,范围查询性能没有B+树好。
117144
- B-树的非树节点存放数据和索引,搜索可能在非叶子结点结束,访问更快。
118145

119-
### 红黑树
146+
##
120147

121-
红黑树是对AVL树的优化,只要求部分平衡,用非严格的平衡来换取增删节点时候旋转次数的降低,提高了插入和删除的性能。查找性能并没有提高,查找的时间复杂度是O(logn)。红黑树通过左旋、右旋和变色维持平衡
148+
图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为: G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合
122149

123-
对于插入节点,AVL和红黑树都是最多两次旋转来实现平衡。对于删除节点,avl需要维护从被删除节点到根节点root这条路径上所有节点的平衡,旋转的量级为O(logN),而红黑树最多只需旋转3次。
150+
和线性表,树的差异:
124151

125-
特性:
126-
(1) 每个节点或者是黑色,或者是红色。
127-
(2) 根节点和叶子节点是黑色,叶子节点为空。
128-
(4)红色节点的子节点必须是黑色的。
129-
(5) 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点,保证没有一条路径会比其他路径长一倍。
152+
- 线性表中我们把数据元素叫元素,树中将数据元素叫结点,在图中数据元素,我们则称之为顶点(Vertex)。
153+
- 线性表可以没有元素,称为空表;树中可以没有节点,称为空树;但是,在图中不允许没有顶点(有穷非空性)。
154+
- 线性表中的各元素是线性关系,树中的各元素是层次关系,而图中各顶点的关系是用边来表示(边集可以为空)。
130155

131-
![](http://img.dabin-coder.cn/image/20220619165116.png)
156+
![](http://img.dabin-coder.cn/image/20220619165442.png)
132157

133-
优点:相比avl树,红黑树插入删除的效率更高。红黑树维持红黑性质所做的红黑变换和旋转的开销,相较于avl树维持平衡的开销要小得多。
158+
### 相关术语
134159

135-
应用:主要用来存储有序的数据,Java中的TreeSet和TreeMap都是通过红黑树实现的。
160+
- 顶点的度
136161

162+
顶点Vi的度(Degree)是指在图中与Vi相关联的边的条数。对于有向图来说,有入度(In-degree)和出度(Out-degree)之分,有向图顶点的度等于该顶点的入度和出度之和。
137163

164+
- 邻接
138165

139-
##
166+
若无向图中的两个顶点V1和V2存在一条边(V1,V2),则称顶点V1和V2邻接(Adjacent);
140167

141-
图由顶点集(vertex set)和边集(edge set)所组成。
168+
若有向图中存在一条边<V3,V2>,则称顶点V3与顶点V2邻接,且是V3邻接到V2或V2邻接直V3;
142169

143-
![](http://img.dabin-coder.cn/image/20220619165442.png)
170+
- 路径
171+
172+
在无向图中,若从顶点Vi出发有一组边可到达顶点Vj,则称顶点Vi到顶点Vj的顶点序列为从顶点Vi到顶点Vj的路径(Path)。
173+
174+
- 连通
175+
176+
若从Vi到Vj有路径可通,则称顶点Vi和顶点Vj是连通(Connected)的。
177+
178+
- 权(Weight)
179+
180+
有些图的边或弧具有与它相关的数字,这种与图的边或弧相关的数叫做权(Weight)。
181+
182+
### 类型
183+
184+
无向图
144185

145-
图的存储结构有邻接矩阵、邻接表和边集数组三种
186+
如果图中任意两个顶点之间的边都是无向边(简而言之就是没有方向的边),则称该图为无向图(Undirected graphs)
146187

147-
1、邻接矩阵
188+
无向图中的边使用小括号“()”表示; 比如 (V1,V2);
189+
190+
有向图
191+
192+
如果图中任意两个顶点之间的边都是有向边(简而言之就是有方向的边),则称该图为有向图(Directed graphs)。
193+
194+
有向图中的边使用尖括号“<>”表示; 比如/<V1,V2>
195+
196+
完全图
197+
198+
- `无向完全图`: 在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。(含有n个顶点的无向完全图有(n×(n-1))/2条边)
199+
- `有向完全图: 在有向图中,如果任意两个顶点之间都存在方向互为相反的两条弧,则称该图为有向完全图。(含有n个顶点的有向完全图有n×(n-1)条边
200+
201+
### 图的存储结构
202+
203+
1、**邻接矩阵**
204+
205+
图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。
148206

149207
![](http://img.dabin-coder.cn/image/20220619165526.png)
150208

151-
2、邻接表
209+
2、**邻接表**
210+
211+
邻接表由表头节点和表节点两部分组成,图中每个顶点均对应一个存储在数组中的表头节点。如果这个表头节点所对应的顶点存在邻接节点,则把邻接节点依次存放于表头节点所指向的单向链表中。
152212

153213
![](http://img.dabin-coder.cn/image/20220619165617.png)
154214

@@ -192,6 +252,8 @@ public interface Graph
192252
}
193253
```
194254

255+
### 图的遍历
256+
195257
深度优先遍历
196258

197259
```java

0 commit comments

Comments
 (0)