auto commit
41
notes/算法.md
@ -22,7 +22,7 @@
|
||||
* [优先队列](#优先队列)
|
||||
* [应用](#应用)
|
||||
* [五、查找](#五查找)
|
||||
* [符号表](#符号表)
|
||||
* [二分查找实现有序符号表](#二分查找实现有序符号表)
|
||||
* [二叉查找树](#二叉查找树)
|
||||
* [2-3 查找树](#2-3-查找树)
|
||||
* [红黑二叉查找树](#红黑二叉查找树)
|
||||
@ -893,23 +893,13 @@ public static Comparable select(Comparable[] a, int k) {
|
||||
|
||||
# 五、查找
|
||||
|
||||
符号表是一种存储键值对的数据结构,支持两种操作:插入一个新的键值对;根据给定键得到值。
|
||||
符号表是一种存储键值对的数据结构,主要支持两种操作:插入一个新的键值对、根据给定键得到值。
|
||||
|
||||
## 符号表
|
||||
|
||||
### 1. 无序符号表
|
||||
|
||||
<div align="center"> <img src="../pics//8a116e69-3d57-4987-a215-0197dd044a14.png" width="600"/> </div><br>
|
||||
|
||||
### 2. 有序符号表
|
||||
|
||||
<div align="center"> <img src="../pics//299a8cd3-7cfa-45d0-8821-4aa577de4692.png" width="600"/> </div><br>
|
||||
|
||||
有序指的是支持 min() max() 等根据键的大小关系来实现的操作。
|
||||
符号表分为有序和无序两种,有序符号表主要指支持 min()、max() 等根据键的大小关系来实现的操作。
|
||||
|
||||
有序符号表的键需要实现 Comparable 接口。
|
||||
|
||||
### 3. 二分查找实现有序符号表
|
||||
## 二分查找实现有序符号表
|
||||
|
||||
使用一对平行数组,一个存储键一个存储值。其中键的数组为 Comparable 数组,值的数组为 Object 数组。
|
||||
|
||||
@ -976,17 +966,17 @@ public class BinarySearchST<Key extends Comparable<Key>, Value> {
|
||||
|
||||
## 二叉查找树
|
||||
|
||||
**二叉树** 定义为一个空链接,或者是一个有左右两个链接的节点,每个链接都指向一颗子二叉树。
|
||||
**二叉树** 是一个空链接,或者是一个有左右两个链接的节点,每个链接都指向一颗子二叉树。
|
||||
|
||||
<div align="center"> <img src="../pics//0c723f4c-e13d-42f7-aeb2-1f160c7cc4b6.png" width="300"/> </div><br>
|
||||
<div align="center"> <img src="../pics//f9f9f993-8ece-4da7-b848-af9b438fad76.png" width="200"/> </div><br>
|
||||
|
||||
**二叉查找树** (BST)是一颗二叉树,并且每个节点的值都大于其左子树中的所有节点的值而小于右子树的所有节点的值。
|
||||
|
||||
<div align="center"> <img src="../pics//1c012d74-6b9d-4f25-a016-7ad4f1f1521898780376.png" width="400"/> </div><br>
|
||||
<div align="center"> <img src="../pics//8ae4550b-f0cb-4e4d-9e2b-c550538bf230.png" width="200"/> </div><br>
|
||||
|
||||
BST 有一个重要性质,就是它的中序遍历结果递增排序。
|
||||
|
||||
<div align="center"> <img src="../pics//5c0bb285-b917-446b-84a2-9810ee41521898714517.png" width="300"/> </div><br>
|
||||
<div align="center"> <img src="../pics//05e41947-3cbc-4f02-a428-96765ec916ff.png" width="200"/> </div><br>
|
||||
|
||||
基本数据结构:
|
||||
|
||||
@ -1019,6 +1009,8 @@ public class BST<Key extends Comparable<Key>, Value> {
|
||||
}
|
||||
```
|
||||
|
||||
(为了方便绘图,二叉树的空链接不画出来。)
|
||||
|
||||
### 1. get()
|
||||
|
||||
- 如果树是空的,则查找未命中;
|
||||
@ -1044,7 +1036,7 @@ private Value get(Node x, Key key) {
|
||||
|
||||
当插入的键不存在于树中,需要创建一个新节点,并且更新上层节点的链接使得该节点正确链接到树中。
|
||||
|
||||
<div align="center"> <img src="../pics//78570a06-0781-4f9d-9093-70a87111521898809910.jpg" width="400"/> </div><br>
|
||||
<div align="center"> <img src="../pics//107a6a2b-f15b-4cad-bced-b7fb95258c9c.png" width="200"/> </div><br>
|
||||
|
||||
```java
|
||||
public void put(Key key, Value val) {
|
||||
@ -1063,9 +1055,13 @@ private Node put(Node x, Key key, Value val) {
|
||||
|
||||
### 3. 分析
|
||||
|
||||
二叉查找树的算法运行时间取决于树的形状,而树的形状又取决于键被插入的先后顺序。最好的情况下树是完全平衡的,每条空链接和根节点的距离都为 logN。在最坏的情况下,树的高度为 N。
|
||||
二叉查找树的算法运行时间取决于树的形状,而树的形状又取决于键被插入的先后顺序。最好的情况下树是完全平衡的,每条空链接和根节点的距离都为 logN。
|
||||
|
||||
<div align="center"> <img src="../pics//9653b0c6-4232-4299-9f5c-79a616abafb8.png" width="300"/> </div><br>
|
||||
<div align="center"> <img src="../pics//4d741402-344d-4b7c-be01-e57184bcad0e.png" width="200"/> </div><br>
|
||||
|
||||
在最坏的情况下,树的高度为 N。
|
||||
|
||||
<div align="center"> <img src="../pics//be7dca03-12ec-456b-8b54-b1b3161f5531.png" width="200"/> </div><br>
|
||||
|
||||
### 4. floor()
|
||||
|
||||
@ -1074,7 +1070,6 @@ floor(key):小于等于键的最大键
|
||||
- 如果键小于根节点的键,那么 floor(key) 一定在左子树中;
|
||||
- 如果键大于根节点的键,需要先判断右子树中是否存在 floor(key),如果存在就找到,否则根节点就是 floor(key)。
|
||||
|
||||
<div align="center"> <img src="../pics//12b458dd-526d-46e2-acca-cf3b501d580e.png" width="400"/> </div><br>
|
||||
|
||||
```java
|
||||
public Key floor(Key key) {
|
||||
@ -1130,7 +1125,7 @@ private Node min(Node x) {
|
||||
|
||||
令指向最小节点的链接指向最小节点的右子树。
|
||||
|
||||
<div align="center"> <img src="../pics//392fb173-9713-433c-b37b-ea63ba76eae4.png" width="400"/> </div><br>
|
||||
<div align="center"> <img src="../pics//26020e1a-06ab-4114-a6b3-e428de690c7e.png" width="500"/> </div><br>
|
||||
|
||||
```java
|
||||
public void deleteMin() {
|
||||
|
BIN
pics/05e41947-3cbc-4f02-a428-96765ec916ff.png
Normal file
After Width: | Height: | Size: 9.0 KiB |
BIN
pics/107a6a2b-f15b-4cad-bced-b7fb95258c9c.png
Normal file
After Width: | Height: | Size: 6.0 KiB |
BIN
pics/26020e1a-06ab-4114-a6b3-e428de690c7e.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
pics/4d741402-344d-4b7c-be01-e57184bcad0e.png
Normal file
After Width: | Height: | Size: 6.0 KiB |
BIN
pics/8ae4550b-f0cb-4e4d-9e2b-c550538bf230.png
Normal file
After Width: | Height: | Size: 7.0 KiB |
BIN
pics/be7dca03-12ec-456b-8b54-b1b3161f5531.png
Normal file
After Width: | Height: | Size: 8.0 KiB |
BIN
pics/f9f9f993-8ece-4da7-b848-af9b438fad76.png
Normal file
After Width: | Height: | Size: 6.0 KiB |