auto commit
This commit is contained in:
parent
28ea91499b
commit
fd5fb99cc9
22
notes/算法.md
22
notes/算法.md
|
@ -312,13 +312,11 @@ public class Queue<Item> {
|
|||
|
||||
# 三、union-find
|
||||
|
||||
<font size=4> **概览** </font> <br>
|
||||
|
||||
用于解决动态连通性问题,能动态连接两个点,并且判断两个点是否连通。
|
||||
|
||||
<div align="center"> <img src="../pics//dc752c5b-bb59-4616-bf9c-21276690a24d.png" width="400"/> </div><br>
|
||||
|
||||
<font size=4> **API** </font> <br>
|
||||
|
||||
| 方法 | 描述 |
|
||||
| ---: | :--- |
|
||||
|
@ -327,8 +325,6 @@ public class Queue<Item> {
|
|||
| int find(int p) | 查找 p 所在的连通分量 |
|
||||
| boolean connected(int p, int q) | 判断 p 和 q 节点是否连通 |
|
||||
|
||||
<font size=4> **基本数据结构** </font> <br>
|
||||
|
||||
```java
|
||||
public class UF {
|
||||
private int[] id;
|
||||
|
@ -354,7 +350,7 @@ public class UF {
|
|||
|
||||
但是 union 操作代价却很高,需要将其中一个连通分量中的所有节点 id 值都修改为另一个节点的 id 值。
|
||||
|
||||
<div align="center"> <img src="../pics//8f0cc500-5994-4c7a-91a9-62885d658662.png" width="300"/> </div><br>
|
||||
<div align="center"> <img src="../pics//8f0cc500-5994-4c7a-91a9-62885d658662.png" width="350"/> </div><br>
|
||||
|
||||
```java
|
||||
public int find(int p) {
|
||||
|
@ -377,7 +373,7 @@ public void union(int p, int q) {
|
|||
|
||||
但是 find 操作开销很大,因为同一个连通分量的节点 id 值不同,id 值只是用来指向另一个节点。因此需要一直向上查找操作,直到找到最上层的节点。
|
||||
|
||||
<div align="center"> <img src="../pics//5d4a5181-65fb-4bf2-a9c6-899cab534b44.png" width="300"/> </div><br>
|
||||
<div align="center"> <img src="../pics//5d4a5181-65fb-4bf2-a9c6-899cab534b44.png" width="350"/> </div><br>
|
||||
|
||||
```java
|
||||
public int find(int p) {
|
||||
|
@ -827,9 +823,9 @@ public Key delMax() {
|
|||
|
||||
交换之后需要进行下沉操作维持堆的有序状态。
|
||||
|
||||
<div align="center"> <img src="../pics//7a80661f-115e-48e0-8a79-837ef7d436c8.png" width="300"/> </div><br>
|
||||
<div align="center"> <img src="../pics//d78c77a1-ebc8-47f0-8d36-69a98bb4de20.png" width="300"/> </div><br>
|
||||
|
||||
<div align="center"> <img src="../pics//a01243f1-f5d7-4bee-b16e-1f921d2f58e8.png" width="300"/> </div><br>
|
||||
<div align="center"> <img src="../pics//144cb0ae-48cf-486b-9e4c-6c6c2c559eeb.png" width="300"/> </div><br>
|
||||
|
||||
```java
|
||||
public static void sort(Comparable[] a){
|
||||
|
@ -858,7 +854,15 @@ public static void sort(Comparable[] a){
|
|||
|
||||
### 1. 排序算法的比较
|
||||
|
||||
<div align="center"> <img src="../pics//e4ca3383-910a-4936-8ac2-9e8fd31b736b.png" width="800"/> </div><br>
|
||||
| 算法 | 稳定 | 原地排序 | 时间复杂度 | 空间复杂度 | 备注 |
|
||||
| :---: | :---: | :---: | :---: | :---: | :---: |
|
||||
| 选择排序 | no | yes | N<sup>2</sup> | 1 | |
|
||||
| 插入排序 | yes | yes | N \~ N<sup>2</sup> | 1 | 时间复杂度和初始顺序有关 |
|
||||
| 希尔排序 | no | yes | N 的若干倍乘于递增序列的长度 | 1 | |
|
||||
| 快速排序 | no | yes | NlogN | logN | |
|
||||
| 三向切分快速排序 | no | yes | N \~ NlogN | logN | 适用于有大量重复主键|
|
||||
| 归并排序 | yes | no | NlogN | N | |
|
||||
| 堆排序 | no | yes | NlogN | 1 | | |
|
||||
|
||||
快速排序是最快的通用排序算法,它的内循环的指令很少,而且它还能利用缓存,因为它总是顺序地访问数据。它的运行时间近似为 \~cNlogN,这里的 c 比其他线性对数级别的排序算法都要小。使用三向切分之后,实际应用中可能出现的某些分布的输入能够达到线性级别,而其它排序算法仍然需要线性对数时间。
|
||||
|
||||
|
|
BIN
pics/144cb0ae-48cf-486b-9e4c-6c6c2c559eeb.png
Normal file
BIN
pics/144cb0ae-48cf-486b-9e4c-6c6c2c559eeb.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 23 KiB |
BIN
pics/d78c77a1-ebc8-47f0-8d36-69a98bb4de20.png
Normal file
BIN
pics/d78c77a1-ebc8-47f0-8d36-69a98bb4de20.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 21 KiB |
Loading…
Reference in New Issue
Block a user