# ALG
## éå½
### æ¦è¿°
ç®æ³ï¼è§£é¢æ¹æ¡çåç¡®è宿´çæè¿°ï¼æ¯ä¸ç³»åè§£å³é®é¢çæ¸
æ°æä»¤ï¼ä»£è¡¨çç¨ç³»ç»çæ¹æ³è§£å³é®é¢ççç¥æºå¶
éå½ï¼ç¨åºè°ç¨èªèº«çç¼ç¨æå·§
éå½ï¼
* ç´æ¥éå½ï¼èªå·±çæ¹æ³è°ç¨èªå·±
* é´æ¥éå½ï¼èªå·±çæ¹æ³è°ç¨å«çæ¹æ³ï¼å«çæ¹æ³åè°ç¨èªå·±
éå½å¦ææ§å¶ç䏿°å½ï¼ä¼å½¢æéå½çæ»å¾ªç¯ï¼ä»èå¯¼è´æ å
åæº¢åºé误
åè书ç±ï¼https://book.douban.com/subject/35263893/
***
### ç®æ³
#### æ ¸å¿ææ³
éå½çä¸è¦ç´ ï¼ç论ï¼ï¼
1. éå½çç»ç»ç¹
2. éå½çå
¬å¼
3. éå½çæ¹åï¼å¿
须走åç»ç»ç¹
```java
// f(x)=f(x-1)+1; f(1)=1; f(10)=?
// 1.éå½çç»ç»ç¹ï¼ f(1) = 1
// 2.éå½çå
¬å¼ï¼f(x) = f(x - 1) + 1
// 3.éå½çæ¹åï¼å¿
须走åç»ç»ç¹
public static int f(int x){
if(x == 1){
return 1;
}else{
return f(x-1) + 1;
}
}
```
***
#### å
¬å¼è½¬æ¢
```java
// å·²ç¥ï¼ f(x) = f(x + 1) + 2, f(1) = 1ãæ±ï¼f(10) = ?
// å
¬å¼è½¬æ¢
// f(x-1)=f(x-1+1)+2 => f(x)=f(x-1)+2
//ï¼1ï¼éå½çå
¬å¼ï¼ f(n) = f(n-1)- 2 ;
//ï¼2ï¼éå½çç»ç»ç¹ï¼ f(1) = 1
//ï¼3ï¼éå½çæ¹åï¼å¿
须走åç»ç»ç¹ã
public static int f(int n){
if(n == 1){
return 1;
}else{
return f(n-1) - 2;
}
}
```
#### 注æäºé¡¹
以ä¸ç论åªè½é对äº**è§å¾åéå½**ï¼å¦ææ¯éè§å¾åæ¯ä¸è½å¥ç¨ä»¥ä¸å
¬å¼çï¼
éè§å¾åéå½çé®é¢ï¼æä»¶æç´¢ï¼å¤é
é®é¢ã
***
### åºç¨
#### ç´ååæ¡
ç´å第ä¸å¤©æäºè¥å¹²ä¸ªæ¡åï¼å½å³åäºä¸åï¼è§å¾å¥½ä¸è¿ç¾ï¼ç¶ååå¤åäºä¸ä¸ªã第äºå¤©ååäºåä¸å¤©å©ä¸çä¸åï¼è§å¾å¥½ä¸è¿ç¾ï¼ç¶ååå¤åäºä¸ä¸ªã以忝天齿¯å¦æ¤ãçå°ç¬¬å天ååçæ¶ååç°åªæ1个æ¡åï¼é®ç´å第ä¸å¤©æ»å
±æäºå¤å°ä¸ªæ¡åï¼
```java
/*
ï¼1ï¼å
¬å¼ï¼ f(x+1)=f(x)-f(x)/2-1; ==> 2f(x+1) = f(x) - 2 ==> f(x)=2f(x+1)+2
ï¼2ï¼ç»ç»ç¹ï¼f(10) = 1
ï¼3ï¼éå½çæ¹åï¼èµ°åäºç»ç»ç¹
*/
public static int f(int x){
if(x == 10){
return 1;
} else {
return 2*f(x+1)+2
}
}
```
***
#### é彿±å
```java
//ï¼1ï¼éå½çç»ç¹æ¥ï¼f(1) = 1
//ï¼2ï¼éå½çå
¬å¼ï¼ f(n) = f(n-1) + n
//ï¼3ï¼éå½çæ¹åå¿
须走åç»ç»ç¹ï¼
public static int f(int n){
if(n == 1 ) return 1;
return f(n-1) + n;
}
```
****
#### æ±è¯ºå¡
```java
public class Hanoi {
public static void main(String[] args) {
hanoi('X', 'Y', 'Z', 3);
}
// å°n个ååæ²»çä»xç§»å¨å°zï¼y为è¾
婿±
private static void hanoi(char x, char y, char z, int n) {
if (n == 1) {
System.out.println(x + "â" + z); // ç´æ¥å°xçåç§»å¨å°z
} else {
hanoi(x, z, y, n - 1); // åæ²»å¤çn-1个åï¼å
å°n-1个ååå©zç§»å°y
System.out.println(x + "â" + z); // ç¶åå°xæä¸é¢çåï¼æå¤§çï¼ç§»å¨å°z
hanoi(y, x, z, n - 1); // æåå°n-1个åä»yç§»å¨å°zï¼x为è¾
婿±
}
}
}
```
æ¶é´å¤æåº¦ O(2^n)
****
#### å¤é
é®é¢
éè§å¾åéå½é®é¢ï¼å¤é
2 å
1 ç¶ï¼4 个çåå¯ä»¥æ¢ 1 ç¶ï¼2 个空ç¶å¯ä»¥æ¢ 1 ç¶
```java
public class BeerDemo{
// å®ä¹ä¸ä¸ªéæåéåå¨å¯ä»¥åé
çæ»æ°
public static int totalNum;
public static int lastBottleNum;
public static int lastCoverNum;
public static void main(String[] args) {
buyBeer(10);
System.out.println("æ»æ°ï¼"+totalNum);
System.out.println("å©ä½çåï¼"+ lastCoverNum);
System.out.println("å©ä½ç¶åï¼"+ lastBottleNum);
}
public static void buyBeer(int money){
int number = money / 2;
totalNum += number;
// ç®åºå½åå©ä½çå
¨é¨çååç¶åæ°ï¼æ¢ç®æéé¢ç»§ç»è´ä¹°ã
int currentBottleNum = lastBottleNum + number ;
int currentCoverNum = lastCoverNum + number ;
// æä»ä»¬æ¢ç®æéé¢
int totalMoney = 0 ;
totalMoney += (currentBottleNum/2)*2; // é¤2代表å¯ä»¥æ¢å 个ç¶åï¼ä¹2代表æ¢ç®æé±ï¼ç§ï¼
lastBottleNum = currentBottleNum % 2 ;// åä½//ç®åºå©ä½çç¶å
totalMoney += (currentCoverNum / 4) * 2;
lastCoverNum = currentCoverNum % 4 ;
// ç»§ç»æ¿é±ä¹°é
if(totalMoney >= 2){
buyBeer(totalMoney);
}
}
}
```
***
## æåº
### åæ³¡æåº
åæ³¡æåºï¼Bubble Sortï¼ï¼ä¸¤ä¸ªæ°æ¯è¾å¤§å°ï¼è¾å¤§çæ°ä¸æ²ï¼è¾å°çæ°åèµ·æ¥
ç®æ³æè¿°ï¼æ¯æ¬¡ä»æ°ç»ç第ä¸ä¸ªä½ç½®å¼å§ä¸¤ä¸¤æ¯è¾ï¼æè¾å¤§çå
ç´ ä¸è¾å°çå
ç´ è¿è¡å±å±äº¤æ¢ï¼æç»æå½åæå¤§çä¸ä¸ªå
ç´ åå
¥å°æ°ç»å½åçæ«å°¾
å®ç°æè·¯ï¼
1. ç¡®å®æ»å
±éè¦åå è½®ï¼æ°ç»çé¿åº¦-1
2. æ¯è½®ä¸¤ä¸¤æ¯è¾å 次
```java
// 0 1ä½ç½®æ¯è¾ï¼å¤§çæ¾åé¢ï¼ç¶å1 2ä½ç½®æ¯è¾ï¼å¤§çç»§ç»æ¾åé¢ï¼ä¸è½®å¾ªç¯æåä¸ä½æ¯æå¤§å¼
public class BubbleSort {
public static void main(String[] args) {
int[] arr = {55, 22, 2, 5, 1, 3, 8, 5, 7, 4, 3, 99, 88};
int flag;//æ è®°æ¬è¶æåºæ¯å¦åçäºäº¤æ¢
//æ¯è¾iåi+1ï¼ä¸éè¦åæ¯æåä¸ä¸ªä½ç½®
for (int i = 0; i < arr.length - 1; i++) {
flag = 0;
//æåiä½ä¸éè¦æ¯ï¼å·²ç»æåºå¥½
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = 1;//åçäºäº¤æ¢
}
}
//没æåç交æ¢ï¼è¯æå·²ç»æåºï¼ä¸éè¦ç»§ç»æåºï¼èçæ¶é´
if(flag == 0) {
break;
}
}
System.out.println(Arrays.toString(arr));
}
}
```
åæ³¡æåºæ¶é´å¤æåº¦ï¼æåæ
åµ
* å
ç´ æ¯è¾ç次æ°ä¸ºï¼`(N-1)+(N-2)+(N-3)+...+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2`
* å
ç´ äº¤æ¢ç次æ°ä¸ºï¼`(N-1)+(N-2)+(N-3)+...+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2`
* æ»æ§è¡æ¬¡æ°ä¸ºï¼`(N^2/2-N/2)+(N^2/2-N/2)=N^2-N`
æç
§å¤§ O æ¨å¯¼æ³åï¼ä¿ç彿°ä¸çæé«é¶é¡¹é£ä¹æç»å泡æåºçæ¶é´å¤æåº¦ä¸º O(N^2)
***
### éæ©æåº
#### ç®åéæ©
éæ©æåºï¼Selection-sortï¼ï¼ä¸ç§ç®åç´è§çæåºç®æ³
ç®æ³æè¿°ï¼é¦å
卿ªæåºåºå䏿¾å°æå°ï¼å¤§ï¼å
ç´ ï¼åæ¾å°æåºåºåçèµ·å§ä½ç½®ï¼ç¶ååä»å©ä½æªæåºå
ç´ ä¸ç»§ç»å¯»æ¾æå°ï¼å¤§ï¼å
ç´ ï¼ç¶åæ¾å°å·²æåºåºåçæ«å°¾ã以æ¤ç±»æ¨ï¼ç´å°ææå
ç´ åæåºå®æ¯
å®ç°æè·¯ï¼
1. æ§å¶éæ©å è½®ï¼æ°ç»çé¿åº¦ - 1
2. æ§å¶æ¯è½®ä»å½åä½ç½®å¼å§æ¯è¾å 次
```java
public class SelectSort {
public static void main(String[] args) {
int[] arr = {55, 22, 2, 5, 1, 3, 8, 5, 7, 4, 3, 99, 88};
for (int i = 0; i < arr.length - 1; i++) {
//è·åæå°ç´¢å¼ä½ç½®
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[minIndex] > arr[j]) {
minIndex = j;
}
}
//交æ¢å
ç´
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
System.out.println(Arrays.toString(arr));
}
}
```
éæ©æåºæ¶é´å¤æåº¦ï¼
* æ°æ®æ¯è¾æ¬¡æ°ï¼`(N-1)+(N-2)+(N-3)+...+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2`
* æ°æ®äº¤æ¢æ¬¡æ°ï¼`N-1`
* æ¶é´å¤æåº¦ï¼`N^2/2-N/2+ï¼N-1ï¼=N^2/2+N/2-1`
æ ¹æ®å¤§ O æ¨å¯¼æ³åï¼ä¿çæé«é¶é¡¹ï¼å»é¤å¸¸æ°å åï¼æ¶é´å¤æåº¦ä¸º O(N^2)
***
#### å æåº
å æåºï¼Heapsortï¼æ¯æå©ç¨å è¿ç§æ°æ®ç»ææè®¾è®¡çä¸ç§æåºç®æ³ï¼å ç»ææ¯ä¸ä¸ªè¿ä¼¼å®å
¨äºåæ çç»æï¼å¹¶åæ¶æ»¡è¶³åç»ç¹çé®å¼æç´¢å¼æ»æ¯å°äºï¼æè
大äºï¼ç¶èç¹
ä¼å
éåï¼å æåºæ¯æ¬¡ä¸æµ®è¿ç¨é½ä¼å°æå¤§æè
æå°å¼æ¾å¨å é¡¶ï¼åºç¨äºä¼å
éåå¯ä»¥å°ä¼å
级æé«çå
ç´ æµ®å°å é¡¶
å®ç°æè·¯ï¼
1. å°åå§å¾
æåºå
³é®ååºåï¼R1,R2â¦.Rnï¼æå»ºæå¤§é¡¶å ï¼å¹¶éè¿ä¸æµ®å¯¹å è¿è¡è°æ´ï¼æ¤å 为åå§çæ åºåºï¼**å 顶为æå¤§æ°**
2. å°å é¡¶å
ç´ R[1] 䏿åä¸ä¸ªå
ç´ R[n] 交æ¢ï¼æ¤æ¶å¾å°æ°çæ åºåºï¼R1,R2,â¦â¦Rn-1ï¼åæ°çæåºåº Rnï¼ä¸æ»¡è¶³ R[1,2â¦n-1]<=R[n]
3. 交æ¢åæ°çå é¡¶ R[1] å¯è½è¿åå çæ§è´¨ï¼å æ¤éè¦å¯¹å½åæ åºåºï¼R1,R2,â¦â¦Rn-1ï¼è°æ´ä¸ºæ°å ï¼ç¶å忬¡å° R[1] 䏿 åºåºæåä¸ä¸ªå
ç´ äº¤æ¢ï¼å¾å°æ°çæ åºåºï¼R1,R2â¦.Rn-2ï¼åæ°çæåºåºï¼Rn-1,Rnï¼ï¼ä¸æé夿¤è¿ç¨ç´å°æåºåºçå
ç´ ä¸ªæ°ä¸º n-1ï¼åæ´ä¸ªæåºè¿ç¨å®æ
floorï¼åä¸åæ´
```java
public class HeapSort {
public static void main(String[] args) {
int[] arr = {55, 22, 2, 5, 1, 3, 8, 5, 7, 4, 3, 99, 88};
heapSort(arr, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
//high为æ°ç»æå¤§ç´¢å¼
private static void heapSort(int[] arr, int high) {
//建å ï¼éæåºï¼å ä¸ºå æåºå®ä¹ç交æ¢é¡ºåºæ¯ä»å½åç»ç¹å¾ä¸äº¤æ¢ï¼éåºæå¯ä»¥é¿å
å¤ä½ç交æ¢
//iåå§å¼æ¯æåä¸ä¸ªèç¹çç¶èç¹ï¼å¦æåæ°æ¯æ°ç»é¿åº¦lenï¼å i = len / 2 -1
for (int i = (high - 1) / 2; i >= 0; i--) {
//è°æ´å½æ°
sift(arr, i, high);
}
//ä»å°¾ç´¢å¼å¼å§æåº
for (int i = high; i > 0; i--) {
//尿大çèç¹æ¾å
¥æ«å°¾
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
//ç»§ç»å¯»æ¾æå¤§çèç¹
sift(arr, 0, i - 1);
}
}
//è°æ´å½æ°ï¼è°æ´arr[low]çå
ç´ ï¼ä»ç´¢å¼lowå°highçèå´è°æ´
private static void sift(int[] arr, int low, int high) {
//æåè°æ´å
ç´
int temp = arr[low];
int i = low, j = low * 2 + 1;//jæ¯å·¦èç¹
while (j <= high) {
//夿æ¯å¦æå³å©åï¼å¹¶ä¸æ¯è¾å·¦å³å©åä¸è¾å¤§çèç¹
if (j < high && arr[j] < arr[j + 1]) {
j++; //æåå³å©å
}
if (temp < arr[j]) {
arr[i] = arr[j];
i = j; //ç»§ç»åä¸è°æ´
j = 2 * i + 1;
} else {
//temp > arr[j]ï¼è¯´æä¹å¤§äºjçå©åï¼æ¢æµç»æ
break;
}
}
//å°è¢«è°æ´çèç¹æ¾å
¥æç»çä½ç½®
arr[i] = temp;
}
}
```
å æåºçæ¶é´å¤æåº¦æ¯ O(nlogn)
***
### æå
¥æåº
#### ç´æ¥æå
¥
æå
¥æåºï¼Insertion Sortï¼ï¼å¨è¦æåºçä¸ç»æ°ä¸ï¼åå®å n-1 个æ°å·²ç»æå¥½åºï¼ç°å¨å°ç¬¬ n ä¸ªæ°æå°è¿ä¸ªæåºæ°åä¸ï¼ä½¿å¾è¿ n 个æ°ä¹æ¯æå¥½é¡ºåºçï¼å¦æ¤åå¤å¾ªç¯ï¼ç´å°å
¨é¨æå¥½é¡ºåº
```java
public class InsertSort {
public static void main(String[] args) {
int[] arr = {55, 22, 2, 5, 1, 3, 8, 5, 7, 4, 3, 99, 88};
for (int i = 1; i < arr.length; i++) {
for (int j = i; j > 0; j--) {
// æ¯è¾ç´¢å¼jå¤çå¼åç´¢å¼j-1å¤çå¼ï¼
// å¦æç´¢å¼j-1å¤ç弿¯ç´¢å¼jå¤çå¼å¤§ï¼åäº¤æ¢æ°æ®ï¼
// 妿ä¸å¤§ï¼é£ä¹å°±æ¾å°åéçä½ç½®äºï¼éåºå¾ªç¯å³å¯ï¼
if (arr[j - 1] > arr[j]) {
int temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
```
æå
¥æåºæ¶é´å¤æåº¦ï¼
* æ¯è¾ç次æ°ä¸ºï¼`(N-1)+(N-2)+(N-3)+...+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2`
* 交æ¢ç次æ°ä¸ºï¼`(N-1)+(N-2)+(N-3)+...+2+1=((N-1)+1)(N-1)/2=N^2/2-N/2`
* æ»æ§è¡æ¬¡æ°ä¸ºï¼`(N^2/2-N/2)+(N^2/2-N/2)=N^2-N`
æç
§å¤§ O æ¨å¯¼æ³åï¼ä¿ç彿°ä¸çæé«é¶é¡¹é£ä¹æç»æå
¥æåºçæ¶é´å¤æåº¦ä¸º O(N^2)
***
#### å¸å°æåº
å¸å°æåºï¼Shell Sortï¼ï¼ä¹æ¯ä¸ç§æå
¥æåºï¼ä¹ç§°ä¸ºç¼©å°å¢éæåº
å®ç°æè·¯ï¼
1. éå®ä¸ä¸ªå¢é¿é hï¼æç
§å¢é¿é h ä½ä¸ºæ°æ®åç»ç便®ï¼å¯¹æ°æ®è¿è¡åç»
2. 对å好ç»çæ¯ä¸ç»æ°æ®å®ææå
¥æåº
3. åå°å¢é¿éï¼æå°å为 1ï¼éå¤ç¬¬äºæ¥æä½
å¸å°æåºçæ ¸å¿å¨äºé´éåºåç设å®ï¼æ¢å¯ä»¥æå设å®å¥½é´éåºåï¼ä¹å¯ä»¥å¨æçå®ä¹é´éåºåï¼å¸å°æåºå°±æ¯æå
¥æåºå¢å äºé´é
```java
public class ShellSort {
public static void main(String[] args) {
int[] arr = {55, 22, 2, 5, 1, 3, 8, 5, 7, 4, 3, 99, 88};
// ç¡®å®å¢é¿éhçåå§å¼
int h = 1;
while (h < arr.length / 2) {
h = 2 * h + 1;
}
// å¸å°æåº
while (h >= 1) {
// æ¾å°å¾
æå
¥çå
ç´
for (int i = h; i < arr.length; i++) {
// æå¾
æå
¥çå
ç´ æå°æåºæ°åä¸
for (int j = i; j >= h; j -= h) {
// å¾
æå
¥çå
ç´ æ¯arr[j]ï¼æ¯è¾arr[j]åarr[j-h]
if (arr[j] < arr[j - h]) {
int temp = arr[j];
arr[j] = arr[j - h];
arr[j - h] = temp;
}
}
}
// åå°hçå¼ï¼åå°è§å为ï¼
h = h / 2;
}
System.out.println(Arrays.toString(arr));
}
}
```
å¨å¸å°æåºä¸ï¼å¢é¿é h 并没æåºå®çè§åï¼æå¾å¤è®ºæç ç©¶äºåç§ä¸åçéå¢åºåï¼ä½é½æ æ³è¯ææä¸ªåºåæ¯æå¥½çï¼æä»¥å¯¹äºå¸å°æåºçæ¶é´å¤æåº¦åæå°±è®¤ä¸º O(nlogn)
***
### å½å¹¶æåº
#### å®ç°æ¹å¼
å½å¹¶æåºï¼Merge Sortï¼ï¼å»ºç«å¨å½å¹¶æä½ä¸çä¸ç§ææçæåºç®æ³ï¼è¯¥ç®æ³æ¯éç¨åæ²»æ³çå
¸åçåºç¨ãå°å·²æåºçååºååå¹¶ï¼å¾å°å®å
¨æåºçåºåï¼å³å
使æ¯ä¸ªååºåæåºï¼å使ååºåæ®µé´æåºãè¥å°ä¸¤ä¸ªæåºè¡¨åå¹¶æä¸ä¸ªæåºè¡¨ï¼ç§°ä¸ºäºè·¯å½å¹¶ã
å®ç°æè·¯ï¼
1. ä¸ç»æ°æ®æåæä¸¤ä¸ªå
ç´ ç¸ççåç»ï¼å¹¶å¯¹æ¯ä¸ä¸ªåç»ç»§ç»æåï¼ç´å°æååçæ¯ä¸ªåç»çå
ç´ ä¸ªæ°æ¯1为æ¢
2. å°ç¸é»ç两个åç»è¿è¡åå¹¶æä¸ä¸ªæåºç大ç»
3. 䏿çé夿¥éª¤2ï¼ç´å°æç»åªæä¸ä¸ªç»ä¸ºæ¢
å½å¹¶æ¥éª¤ï¼æ¯æ¬¡æ¯è¾ä¸¤ç«¯æå°çå¼ï¼ææå°ç弿¾å¨è¾
婿°ç»ç左边



***
#### å®ç°ä»£ç
```java
public class MergeSort {
public static void main(String[] args) {
int[] arr = new int[]{55, 22, 2, 5, 1, 3, 8, 5, 7, 4, 3, 99, 88};
mergeSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
// low为arræå°ç´¢å¼ï¼high为æå¤§ç´¢å¼
public static void mergeSort(int[] arr, int low, int high) {
// low == high æ¶è¯´æåªæä¸ä¸ªå
ç´ äºï¼ç´æ¥è¿å
if (low < high) {
int mid = (low + high) / 2;
mergeSort(arr, low, mid); // å½å¹¶æåºååæ®µ
mergeSort(arr, mid + 1, high); // å½å¹¶æåºååæ®µ
merge(arr, low, mid, high); // å°ä¸¤æ®µæåºæ®µåæä¸æ®µæåºæ®µ
}
}
private static void merge(int[] arr, int low, int mid, int high) {
int index = 0;
// å®ä¹å·¦å³æé
int left = low, right = mid + 1;
int[] assist = new int[high - low + 1];
while (left <= mid && right <= high) {
assist[index++] = arr[left] < arr[right] ? arr[left++] : arr[right++];
}
while (left <= mid) {
assist[index++] = arr[left++];
}
while (right <= high) {
assist[index++] = arr[right++];
}
for (int k = 0; k < assist.length; k++) {
arr[low++] = assist[k];
}
}
}
```
ç¨æ ç¶å¾æ¥æè¿°å½å¹¶ï¼å设å
ç´ ç个æ°ä¸º nï¼é£ä¹ä½¿ç¨å½å¹¶æåºæåçæ¬¡æ°ä¸º `log2(n)`ï¼å³å±æ°ï¼æ¯æ¬¡å½å¹¶éè¦å n 次对æ¯ï¼æç»å¾åºçå½å¹¶æåºçæ¶é´å¤æåº¦ä¸º `log2(n)*n`ï¼æ ¹æ®å¤§Oæ¨å¯¼æ³åï¼å¿½ç¥åºæ°ï¼æç»å½å¹¶æåºçæ¶é´å¤æåº¦ä¸º O(nlogn)
å½å¹¶æåºç缺ç¹ï¼éè¦ç³è¯·é¢å¤çæ°ç»ç©ºé´ï¼å¯¼è´ç©ºé´å¤æåº¦æåï¼æ¯å
¸åç**ä»¥ç©ºé´æ¢æ¶é´**çæä½
****
### å¿«éæåº
å¿«éæåºï¼Quick Sortï¼ï¼éè¿**åæ²»ææ³**坹忳¡æåºçæ¹è¿ï¼åºæ¬è¿ç¨æ¯éè¿ä¸è¶æåºå°è¦æåºçæ°æ®å岿ç¬ç«ç两é¨åï¼å
¶ä¸ä¸é¨åçæææ°æ®é½æ¯å¦å¤ä¸é¨åçæææ°æ®é½è¦å°ï¼ç¶ååææ¤æ¹æ³å¯¹è¿ä¸¤é¨åæ°æ®åå«è¿è¡å¿«éæåºï¼ä»¥æ¤è¾¾å°æ´ä¸ªæ°æ®åææåºåºå
å®ç°æè·¯ï¼
1. 仿°å䏿åºä¸ä¸ªå
ç´ ï¼ç§°ä¸ºåºåï¼pivotï¼
2. éæ°æåºæ°åï¼æææ¯åºåå¼å°çææ¾å¨åºååé¢ï¼æææ¯åºåå¼å¤§çæå¨åºåçåé¢ï¼ç¸åçæ°å¯ä»¥å°ä»»ä¸è¾¹ï¼ï¼å¨è¿ä¸ªååºéåºä¹åï¼è¯¥åºåå°±å¤äºæ°åçä¸é´ä½ç½®ï¼è¿ä¸ªç§°ä¸ºååºï¼partitionï¼æä½ï¼
3. éå½å°ï¼recursiveï¼æå°äºåºåå¼å
ç´ çåæ°åå大äºåºåå¼å
ç´ çåæ°åæåº
```java
public class QuickSort {
public static void main(String[] args) {
int[] arr = {55, 22, 2, 5, 1, 3, 8, 5, 7, 4, 3, 99, 88};
quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr, int low, int high) {
// éå½ç»æçæ¡ä»¶
if (low >= high) {
return;
}
int left = low;
int right = high;
// åºåæ°
int temp = arr[left];
while (left < right) {
// ç¨ >= å¯ä»¥é²æ¢å¤ä½ç交æ¢
while (arr[right] >= temp && right > left) {
right--;
}
// å夿鲿¢ç¸ç
if (right > left) {
// å°è¿é说æ arr[right] < temp
arr[left] = arr[right];// æ¤æ¶æarr[right]å
ç´ è§ä¸ºç©º
left++;
}
while (arr[left] <= temp && left < right) {
left++;
}
if (right > left) {
arr[right] = arr[left];
right--;
}
}
// left == right
arr[left] = temp;
quickSort(arr, low, left-1);
quickSort(arr, right + 1, high);
}
}
```
å¿«éæåºåå½å¹¶æåºçåºå«ï¼
* å¿«éæåºæ¯å¦å¤ä¸ç§åæ²»çæåºç®æ³ï¼å°ä¸ä¸ªæ°ç»åæä¸¤ä¸ªåæ°ç»ï¼å°ä¸¤é¨åç¬ç«çæåº
* å½å¹¶æåºçå¤çè¿ç¨æ¯ç±ä¸å°ä¸çï¼å
å¤çåé®é¢ï¼ç¶åååå¹¶ãèå¿«ææ£å¥½ç¸åï¼å®çå¤çè¿ç¨æ¯ç±ä¸å°ä¸çï¼å
ååºï¼ç¶ååå¤çåé®é¢
* å¿«éæåºåå½å¹¶æåºæ¯äºè¡¥çï¼å½å¹¶æåºå°æ°ç»åæä¸¤ä¸ªåæ°ç»å嫿åºï¼å¹¶å°æåºçåæ°ç»å½å¹¶ä»èå°æ´ä¸ªæ°ç»æåºï¼èå¿«éæåºçæ¹å¼åæ¯å½ä¸¤ä¸ªæ°ç»é½æåºæ¶ï¼æ´ä¸ªæ°ç»èªç¶å°±æåºäº
* å¨å½å¹¶æåºä¸ï¼ä¸ä¸ªæ°ç»è¢«çå为两åï¼å½å¹¶è°ç¨åçå¨å¤çæ´ä¸ªæ°ç»ä¹åï¼å¨å¿«éæåºä¸ï¼ååæ°ç»çä½ç½®åå³äºæ°ç»çå
容ï¼éå½è°ç¨åçå¨å¤çæ´ä¸ªæ°ç»ä¹å
æ¶é´å¤æåº¦ï¼
* æä¼æ
åµï¼æ¯ä¸æ¬¡ååéæ©çåºåæ°åå好å°å½ååºåçåãææ°ç»çååç忝ä¸ä¸ªæ ï¼å
±ååäº logn æ¬¡ï¼æä»¥ï¼æä¼æ
åµä¸å¿«éæåºçæ¶é´å¤æåº¦ä¸º O(nlogn)
* æåæ
åµï¼æ¯ä¸æ¬¡ååéæ©çåºåæ°åæ¯å½ååºåä¸æå¤§æ°æè
æå°æ°ï¼è¿ä½¿å¾æ¯æ¬¡ååé½ä¼æä¸ä¸ªåç»ï¼é£ä¹æ»å
±å°±å¾åånæ¬¡ï¼æä»¥æåæ
åµä¸ï¼å¿«éæåºçæ¶é´å¤æåº¦ä¸º O(n^2)
* å¹³åæ
åµï¼æ¯ä¸æ¬¡ååéæ©çåºåæ°å䏿¯æå¤§å¼åæå°å¼ï¼ä¹ä¸æ¯ä¸å¼ï¼è¿ç§æ
åµç¨æ°å¦å½çº³æ³è¯æï¼å¿«éæåºçæ¶é´å¤æåº¦ä¸º O(nlogn)
æ¨èè§é¢ï¼https://www.bilibili.com/video/BV1b7411N798?t=1001&p=81
åèæç« ï¼https://blog.csdn.net/nrsc272420199/article/details/82587933
****
### åºæ°æåº
åºæ°æåºï¼Radix Sortï¼ï¼å嫿¡¶æåºåç®±æåºï¼åå©å¤å
³é®åæåºçææ³å¯¹åé»è¾å
³é®åè¿è¡æåºçæ¹æ³
è®¡æ°æåºå
¶å®æ¯æ¡¶æåºçä¸ç§ç¹æ®æ
åµï¼å½è¦æåºç n ä¸ªæ°æ®ï¼æå¤çèå´å¹¶ä¸å¤§çæ¶åï¼æ¯å¦æå¤§å¼æ¯ kï¼æä»¬å°±å¯ä»¥ææ°æ®ååæ k ä¸ªæ¡¶ï¼æ¯ä¸ªæ¡¶å
çæ°æ®å¼é½æ¯ç¸åçï¼çæäºæ¡¶å
æåºçæ¶é´
æç
§ä½ä½å
æåºï¼ç¶åæ¶éï¼åæç
§é«ä½æåºï¼ç¶ååæ¶éï¼ä¾æ¬¡ç±»æ¨ï¼ç´å°æé«ä½ãææ¶åæäºå±æ§æ¯æä¼å
级顺åºçï¼å
æä½ä¼å
级æåºï¼åæé«ä¼å
级æåºãæåçæ¬¡åºå°±æ¯é«ä¼å
级é«çå¨åï¼é«ä¼å
级ç¸åçä½ä¼å
级é«çå¨å
è§£éï¼å
æä½ä½åæé«ä½ï¼å¯ä»¥è¯´æå¨é«ä½ç¸ççæ
åµä¸ä½ä½æ¯éå¢çï¼å¦æé«ä½ä¹æ¯éå¢ï¼åæ°æ®æåº
å®ç°æè·¯ï¼
- è·å¾æå¤§æ°ç使°ï¼å¯ä»¥éè¿å°æå¤§æ°å为 String ç±»åï¼åæ±é¿åº¦
- å°ææå¾
æ¯è¾æ°å¼ï¼æ£æ´æ°ï¼ç»ä¸ä¸ºåæ ·çæ°ä½é¿åº¦ï¼**使°è¾ççæ°åé¢è¡¥é¶**
- 仿ä½ä½å¼å§ï¼ä¾æ¬¡è¿è¡ä¸æ¬¡æåº
- 仿ä½ä½æåºä¸ç´å°æé«ä½ï¼ä¸ªä½ â åä½ â ç¾ä½ â ⦠âæé«ä½ï¼æåºå®æä»¥åï¼æ°åå°±åæä¸ä¸ªæåºåºå
```java
public class BucketSort {
public static void main(String[] args) {
int[] arr = new int[]{576, 22, 26, 548, 1, 3, 843, 536, 735, 43, 3, 912, 88};
bucketSort(arr);
System.out.println(Arrays.toString(arr));
}
private static void bucketSort(int[] arr) {
// æ¡¶ç个æ°åºå®ä¸º10个ï¼ä¸ªä½æ¯0~9ï¼ï¼æ°ç»é¿åº¦ä¸ºäºé²æ¢ææçæ°å¨åä¸è¡
int[][] bucket = new int[10][arr.length];
//è®°å½æ¯ä¸ªæ¡¶ä¸çæå¤å°ä¸ªå
ç´
int[] elementCounts = new int[10];
//è·åæ°ç»çæå¤§å
ç´
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
max = max > arr[i] ? max : arr[i];
}
String maxEle = Integer.toString(max);
//å°æ°ç»ä¸çå
ç´ æ¾å
¥æ¡¶ä¸ï¼æå¤§æ°ç使°ç¸å½äºéè¦å 次æ¾å
¥æ¡¶ä¸
for (int i = 0, step = 1; i < maxEle.length(); i++, step *= 10) {
for (int j = 0; j < arr.length; j++) {
//è·åæåä¸ä½çæ°æ®ï¼ä¹å°±æ¯ç´¢å¼
int index = (arr[j] / step) % 10;
//æ¾å
¥å
·ä½ä½ç½®
bucket[index][elementCounts[index]] = arr[j];
//å卿¯ä¸ªæ¡¶çæ°é
elementCounts[index]++;
}
//æ¶éåæ°ç»
for (int j = 0, index = 0; j < 10; j++) {
//å
è¿å
åº
int position = 0;
//æ¡¶ä¸æå
ç´ å°±ååº
while (elementCounts[j] > 0) {
arr[index] = bucket[j][position];
elementCounts[j]--;
position++;
index++;
}
}
}
}
}
```
ç©ºé´æ¢æ¶é´
æ¨èè§é¢ï¼https://www.bilibili.com/video/BV1b7411N798?p=86
åèæç« ï¼https://www.toutiao.com/a6593273307280179715/?iid=6593273307280179715
***
### ç®æ³æ»ç»
#### ç¨³å®æ§
ç¨³å®æ§ï¼å¨å¾
æåºçè®°å½åºåä¸ï¼åå¨å¤ä¸ªå
·æç¸åçå
³é®åçè®°å½ï¼è¥ç»è¿æåºï¼è¿äºè®°å½çç¸å¯¹æ¬¡åºä¿æä¸åï¼å³å¨ååºåä¸ `r[i]=r[j]`ï¼ä¸ r[i] å¨ r[j] ä¹åï¼è卿åºåçåºåä¸ï¼r[i] ä»å¨ r[j] ä¹åï¼åç§°è¿ç§æåºç®æ³æ¯ç¨³å®çï¼å¦å称为ä¸ç¨³å®ç
妿ä¸ç»æ°æ®åªéè¦ä¸æ¬¡æåºï¼åç¨³å®æ§ä¸è¬æ¯æ²¡ææä¹çï¼å¦æä¸ç»æ°æ®éè¦å¤æ¬¡æåºï¼ç¨³å®æ§æ¯ææä¹çã
* åæ³¡æåºï¼åªæå½ `arr[i]>arr[i+1]` çæ¶åï¼æä¼äº¤æ¢å
ç´ çä½ç½®ï¼èç¸ççæ¶åå¹¶ä¸äº¤æ¢ä½ç½®ï¼æä»¥å泡æåºæ¯ä¸ç§ç¨³å®æåºç®æ³
* éæ©æåºï¼æ¯ç»æ¯ä¸ªä½ç½®éæ©å½åå
ç´ æå°çï¼ä¾å¦ææ°æ®{5(1)ï¼8 ï¼5(2)ï¼ 3ï¼ 9 }ï¼ç¬¬ä¸ééæ©å°çæå°å
ç´ ä¸º3ï¼æä»¥5(1)ä¼å3è¿è¡äº¤æ¢ä½ç½®ï¼æ¤æ¶5(1)å°äº5(2)åé¢ï¼ç ´åäºç¨³å®æ§ï¼æä»¥æ¯ä¸ç¨³å®çæåºç®æ³
* æå
¥æåºï¼æ¯è¾æ¯ä»æåºåºåçæ«å°¾å¼å§ï¼ä¹å°±æ¯æ³è¦æå
¥çå
ç´ åå·²ç»æåºçæå¤§è
å¼å§æ¯èµ·ï¼å¦ææ¯å®å¤§åç´æ¥æå
¥å¨å
¶åé¢ï¼å¦åä¸ç´å¾åæ¾ç´å°æ¾å°å®è¯¥æå
¥çä½ç½®ãå¦æç¢°è§ä¸ä¸ªåæå
¥å
ç´ ç¸ççï¼é£ä¹æè¦æå
¥çå
ç´ æ¾å¨ç¸çå
ç´ çåé¢ãç¸çå
ç´ çååé¡ºåºæ²¡ææ¹åï¼ä»åæ åºåºååºå»ç顺åºå°±æ¯æå¥½åºåç顺åºï¼æä»¥æå
¥æåºæ¯ç¨³å®ç
* å¸å°æåºï¼æç
§ä¸åæ¥é¿å¯¹å
ç´ è¿è¡æå
¥æåºï¼è½ç¶ä¸æ¬¡æå
¥æåºæ¯ç¨³å®çï¼ä½å¨ä¸åçæå
¥æåºè¿ç¨ä¸ï¼ç¸åçå
ç´ å¯è½å¨åèªçæå
¥æåºä¸ç§»å¨ï¼æåå
¶ç¨³å®æ§å°±ä¼è¢«æä¹±ï¼æä»¥å¸å°æåºæ¯ä¸ç¨³å®ç
* å½å¹¶æåºå¨å½å¹¶çè¿ç¨ä¸ï¼åªæ `arr[i]
****
### æåºæ
#### åå¨ç»æ
äºåæåºæ ï¼BSTï¼ï¼åç§°äºåæ¥æ¾æ æè
äºåæç´¢æ
+ æ¯ä¸ä¸ªèç¹ä¸æå¤æä¸¤ä¸ªåèç¹
+ å·¦åæ ä¸ææèç¹çå¼é½å°äºæ ¹èç¹çå¼
+ å³åæ 䏿æèç¹çå¼é½å¤§äºæ ¹èç¹çå¼
+ ä¸åå¨éå¤çèç¹
***
#### 代ç å®ç°
* èç¹ç±»ï¼
```java
private static class TreeNode {
int key;
TreeNode left; //å·¦èç¹
TreeNode right; //å³èç¹
private TreeNode(int key) {
this.key = key;
}
}
```
* æ¥æ¾èç¹ï¼
```java
// é彿¥æ¾
private static TreeNode search(TreeNode root, int key) {
//éå½ç»æçæ¡ä»¶
if (root == null) {
return null;
}
if (key == root.key) {
return root;
} else if (key > root.key) {
return search(root.right, key);
} else {
return search(root.left, key);
}
}
// ééå½
private static TreeNode search1(TreeNode root, int key) {
while (root != null) {
if (key == root.key) {
return root;
} else if (key > root.key) {
root = root.right;
} else {
root = root.left;
}
}
return null;
}
```
* æå
¥èç¹ï¼
```java
private static int insert(TreeNode root, int key) {
if (root == null) {
root = new TreeNode(key);
root.left = null;
root.right = null;
return 1;
} else {
if (key == root.key) {
return 0;
} else if (key > root.key) {
return insert(root.right, key);
} else {
return insert(root.left, key);
}
}
}
```
* æé 彿°ï¼
```java
// æé 彿°ï¼è¿åæ ¹èç¹
private static TreeNode createBST(int[] arr) {
if (arr.length > 0) {
TreeNode root = new TreeNode(arr[0]);
for (int i = 1; i < arr.length; i++) {
insert(root, arr[i]);
}
return root;
}
return null;
}
```
* å é¤èç¹ï¼è¦å é¤èç¹12ï¼å
æ¾å°èç¹19ï¼ç¶åç§»å¨å¹¶æ¿æ¢èç¹12
代ç 龿¥ï¼https://leetcode-cn.com/submissions/detail/190232548/
åèè§é¢ï¼https://www.bilibili.com/video/BV1iJ411E7xW?t=756&p=86
å¾çæ¥æºï¼https://leetcode-cn.com/problems/delete-node-in-a-bst/solution/tu-jie-yi-dong-jie-dian-er-bu-shi-xiu-ga-edtn/
***
### 平衡æ
平衡äºåæ ï¼AVLï¼çç¹ç¹ï¼
+ äºåæ å·¦å³ä¸¤ä¸ªåæ çé«åº¦å·®ä¸è¶
è¿ 1
+ ä»»æèç¹çå·¦å³ä¸¤ä¸ªåæ 齿¯ä¸é¢å¹³è¡¡äºåæ
平衡äºåæ æè½¬ï¼
+ æè½¬è§¦åæ¶æºï¼å½æ·»å ä¸ä¸ªèç¹ä¹åï¼è¯¥æ ä¸åæ¯ä¸é¢å¹³è¡¡äºåæ
+ 平衡äºåæ åäºåæ¥æ¾æ 对æ¯ç»æå¾

+ å·¦æï¼å°æ ¹èç¹çå³ä¾§å¾å·¦æï¼åå
çå³åèç¹åææ°çç¶èç¹ï¼å¹¶æå¤ä½çå·¦åèç¹åºè®©ï¼ç»å·²ç»éçº§çæ ¹èç¹å½å³åèç¹

* 峿ï¼å°æ ¹èç¹ç左侧å¾å³æï¼å·¦åèç¹åæäºæ°çç¶èç¹ï¼å¹¶æå¤ä½çå³åèç¹åºè®©ï¼ç»å·²ç»éçº§æ ¹èç¹å½å·¦åèç¹

æ¨èæç« ï¼https://pdai.tech/md/algorithm/alg-basic-tree-balance.html
***
### çº¢é»æ
çº¢é»æ çç¹ç¹ï¼
* æ¯ä¸ä¸ªèç¹å¯ä»¥æ¯çº¢æè
é»
+ çº¢é»æ 䏿¯é«åº¦å¹³è¡¡çï¼å®ç平衡æ¯éè¿èªå·±ç红é»è§åè¿è¡å®ç°ç
çº¢é»æ ç红é»è§åæåªäºï¼
1. æ¯ä¸ä¸ªèç¹ææ¯çº¢è²çï¼æè
æ¯é»è²ç
2. æ ¹èç¹å¿
é¡»æ¯é»è²
3. 妿ä¸ä¸ªèç¹æ²¡æåèç¹æè
ç¶èç¹ï¼å该èç¹ç¸åºçæé屿§å¼ä¸º Nilï¼è¿äº Nil è§ä¸ºå¶èç¹ï¼æ¯ä¸ªå¶èç¹ (Nil) æ¯é»è²ç
4. 妿æä¸ä¸ªèç¹æ¯çº¢è²ï¼é£ä¹å®çåèç¹å¿
é¡»æ¯é»è²ï¼ä¸è½åºç°ä¸¤ä¸ªçº¢è²èç¹ç¸è¿çæ
åµï¼
5. 对æ¯ä¸ä¸ªèç¹ï¼ä»è¯¥èç¹å°å
¶ææå代å¶èç¹çç®åè·¯å¾ä¸ï¼åå
å«ç¸åæ°ç®çé»è²èç¹
çº¢é»æ ä¸ AVL æ çæ¯è¾ï¼
* AVL æ æ¯æ´å ä¸¥æ ¼ç平衡ï¼å¯ä»¥æä¾æ´å¿«çæ¥æ¾é度ï¼éç¨äºè¯»å**æ¥æ¾å¯éåä»»å¡**
* çº¢é»æ åªæ¯åå°è¿ä¼¼å¹³è¡¡ï¼å¹¶ä¸æ¯ä¸¥æ ¼ç平衡ï¼çº¢é»æ çæå
¥å 餿¯ AVL æ æ´ä¾¿äºæ§å¶ï¼çº¢é»æ æ´éåäº**æå
¥ä¿®æ¹å¯éåä»»å¡**
- çº¢é»æ æ´ä½æ§è½ç¥ä¼äº AVL æ ï¼AVL æ çæè½¬æ¯çº¢é»æ çæè½¬å¤ï¼æ´å é¾ä»¥å¹³è¡¡åè°è¯ï¼æå
¥åå é¤çæçæ¯çº¢é»æ æ
¢

çº¢é»æ æ·»å èç¹çé»è®¤é¢è²ä¸ºçº¢è²ï¼æçé«

**çº¢é»æ æ·»å èç¹åå¦ä½ä¿æçº¢é»è§åï¼**
+ æ ¹èç¹ä½ç½®
+ ç´æ¥å为é»è²
+ éæ ¹èç¹ä½ç½®
+ ç¶èç¹ä¸ºé»è²
+ ä¸éè¦ä»»ä½æä½,é»è®¤çº¢è²å³å¯
+ ç¶èç¹ä¸ºçº¢è²
+ ååèç¹ä¸ºçº¢è²
1. å°"ç¶èç¹"设为é»è²,å°"ååèç¹"设为é»è²
2. å°"ç¥ç¶èç¹"设为红è²
3. 妿"ç¥ç¶èç¹"ä¸ºæ ¹èç¹,åå°æ ¹èç¹å次åæé»è²
+ ååèç¹ä¸ºé»è²
1. å°"ç¶èç¹"设为é»è²
2. å°"ç¥ç¶èç¹"设为红è²
3. 以"ç¥ç¶èç¹"为æ¯ç¹è¿è¡æè½¬
***
### å¹¶æ¥é
#### åºæ¬å®ç°
å¹¶æ¥éæ¯ä¸ç§æ åçæ°æ®ç»æï¼æä»¥ä¸ç¹ç¹ï¼
* æ¯ä¸ªå
ç´ é½å¯ä¸ç对åºä¸ä¸ªç»ç¹
* æ¯ä¸ç»æ°æ®ä¸çå¤ä¸ªå
ç´ é½å¨åä¸é¢æ ä¸
* ä¸ä¸ªç»ä¸çæ°æ®å¯¹åºçæ åå¦å¤ä¸ä¸ªç»ä¸çæ°æ®å¯¹åºçæ ä¹é´æ²¡æä»»ä½èç³»
* å
ç´ å¨æ ä¸å¹¶æ²¡æåç¶çº§å
³ç³»ç硬æ§è¦æ±
å¯ä»¥é«æå°è¿è¡å¦ä¸æä½ï¼
* æ¥è¯¢å
ç´ p åå
ç´ q æ¯å¦å±äºåä¸ç»
* åå¹¶å
ç´ p åå
ç´ q æå¨çç»
åå¨ç»æï¼
åå¹¶æ¹å¼ï¼
代ç å®ç°ï¼
* ç±»å®ç°ï¼
```java
public class UF {
//è®°å½èç¹å
ç´ å该å
ç´ æå¨åç»çæ è¯
private int[] eleAndGroup;
//è®°å½åç»ç个æ°
private int count;
//åå§åå¹¶æ¥é
public UF(int N) {
//åå§ååç»æ°é
this.count = N;
//åå§åeleAndGroupæ°é
this.eleAndGroup = new int[N];
//åå§åeleAndGroupä¸çå
ç´ åå
¶æå¨åç»çæ è¯ç¬¦ï¼eleAndGroupç´¢å¼ä½ä¸ºæ¯ä¸ªèç¹çå
ç´
//æ¯ä¸ªç´¢å¼å¤çå¼å°±æ¯è¯¥ç»çç´¢å¼ï¼å°±æ¯è¯¥å
ç´ æå¨çç»çæ è¯ç¬¦
for (int i = 0; i < eleAndGroup.length; i++) {
eleAndGroup[i] = i;
}
}
//æ¥è¯¢pæå¨çåç»çæ è¯ç¬¦
public int find(int p) {
return eleAndGroup[p];
}
//夿并æ¥éä¸å
ç´ påå
ç´ qæ¯å¦å¨åä¸åç»ä¸
public boolean connect(int p, int q) {
return find(p) == find(q);
}
//æpå
ç´ æå¨åç»åqå
ç´ æå¨åç»åå¹¶
public void union(int p, int q) {
//夿å
ç´ qåpæ¯å¦å·²ç»å¨åä¸ä¸ªåç»ä¸ï¼å¦æå·²ç»å¨åä¸ä¸ªåç»ä¸ï¼åç»ææ¹æ³å°±å¯ä»¥äº
if (connect(p, q)) {
return;
}
int pGroup = find(p);//æ¾å°pæå¨åç»çæ è¯ç¬¦
int qGroup = find(q);//æ¾å°qæå¨åç»çæ è¯ç¬¦
//åå¹¶ç»ï¼è®©pæå¨ç»ç ææå
ç´ çç»æ è¯ç¬¦å为qæå¨åç»çæ è¯ç¬¦
for (int i = 0; i < eleAndGroup.length; i++) {
if (eleAndGroup[i] == pGroup) {
eleAndGroup[i] = qGroup;
}
}
//åç»ä¸ªæ°-1
this.count--;
}
}
```
* æµè¯ä»£ç ï¼
```java
public static void main(String[] args) {
//å建并æ¥é对象
UF uf = new UF(5);
System.out.println(uf);
//仿§å¶å°å½å
¥ä¸¤ä¸ªåå¹¶çå
ç´ ï¼è°ç¨unionæ¹æ³åå¹¶ï¼è§å¯åå¹¶åå¹¶æ¥éçåç»
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("è¾å
¥ç¬¬ä¸ä¸ªè¦åå¹¶çå
ç´ ");
int p = sc.nextInt();
System.out.println("è¾å
¥ç¬¬äºä¸ªè¦åå¹¶çå
ç´ ");
int q = sc.nextInt();
if (uf.connect(p, q)) {
System.out.println(p + "å
ç´ å·²ç»å" + q + "å
ç´ å·²ç»å¨åä¸ä¸ªç»");
continue;
}
uf.union(p, q);
System.out.println("å½åå¹¶æ¥éä¸è¿æï¼" + uf.count() + "个åç»");
System.out.println(uf);
System.out.println("********************");
}
}
```
æåæ
åµä¸ union ç®æ³çæ¶é´å¤æåº¦ä¹æ¯ O(N^2)
****
#### ä¼åå®ç°
让æ¯ä¸ªç´¢å¼å¤çèç¹é½æåå®çç¶èç¹ï¼å½ eleGroup[i] = i æ¶ï¼è¯´æ i æ¯æ ¹èç¹
```java
//æ¥è¯¢pæå¨çåç»çæ è¯ç¬¦ï¼éå½å¯»æ¾ç¶æ è¯ç¬¦ï¼ç´å°æ¾å°æ ¹èç¹
public int findRoot(int p) {
while (p != eleAndGroup[p]) {
p = eleAndGroup[p];
}
//p == eleGroup[p]ï¼è¯´æpæ¯æ ¹èç¹
return p;
}
//夿并æ¥éä¸å
ç´ påå
ç´ qæ¯å¦å¨åä¸åç»ä¸
public boolean connect(int p, int q) {
return findRoot(p) == findRoot(q);
}
//æpå
ç´ æå¨åç»åqå
ç´ æå¨åç»åå¹¶
public void union(int p, int q) {
//æ¾å°p q对åºçæ ¹èç¹
int pRoot = findRoot(p);
int qRoot = findRoot(q);
if (pRoot == qRoot) {
return;
}
//让pæå¨æ çèç¹æ ¹èç¹ä¸ºqçæå¨çæ ¹èç¹ï¼åªéè¦ææ ¹èç¹æ¹ä¸ä¸ï¼æ¶é´å¤æåº¦ O(1)
eleAndGroup[pRoot] = qRoot;
this.count-
}
```
平忶é´å¤æåº¦ä¸º O(N)ï¼æåæ¶é´å¤æåº¦æ¯ O(N^2)
ç»§ç»ä¼åï¼è·¯å¾å缩ï¼ä¿è¯æ¯æ¬¡æå°æ åå¹¶å°å¤§æ
```java
public class UF_Tree_Weighted {
private int[] eleAndGroup;
private int count;
private int[] size;//å卿¯ä¸ä¸ªæ ¹ç»ç¹å¯¹åºçæ ä¸çä¿åçèç¹ç个æ°
//åå§åå¹¶æ¥é
public UF_Tree_Weighted(int N) {
this.count = N;
this.eleAndGroup = new int[N];
for (int i = 0; i < eleAndGroup.length; i++) {
eleAndGroup[i] = i;
}
this.size = new int[N];
//é»è®¤æ
åµä¸ï¼size䏿¯ä¸ªç´¢å¼å¤çå¼é½æ¯1
for (int i = 0; i < size.length; i++) {
size[i] = 1;
}
}
//æ¥è¯¢pæå¨çåç»çæ è¯ç¬¦ï¼ç¶æ è¯ç¬¦
public int findRoot(int p) {
while (p != eleAndGroup[p]) {
p = eleAndGroup[p];
}
return p;
}
//夿并æ¥éä¸å
ç´ påå
ç´ qæ¯å¦å¨åä¸åç»ä¸
public boolean connect(int p, int q) {
return findRoot(p) == findRoot(q);
}
//æpå
ç´ æå¨åç»åqå
ç´ æå¨åç»åå¹¶
public void union(int p, int q) {
//æ¾å°p q对åºçæ ¹èç¹
int pRoot = findRoot(p);
int qRoot = findRoot(q);
if (pRoot == qRoot) {
return;
}
//夿pRoot对åºçæ å¤§è¿æ¯qRoot对åºçæ å¤§ï¼æç»éè¦æè¾å°çæ åå¹¶å°è¾å¤§çæ ä¸
if (size[pRoot] < size[qRoot]) {
eleAndGroup[pRoot] = qRoot;
size[qRoot] += size[pRoot];
} else {
eleAndGroup[qRoot] = pRoot;
size[pRoot] += size[qRoot];
}
//ç»çæ°é-1ã
this.count--;
}
}
```
***
#### åºç¨åºæ¯
å¹¶æ¥éåå¨çæ¯ä¸ä¸ªæ´æ°è¡¨ç¤ºçæ¯ä¸ä¸ªå¤§åè®¡ç®æºç½ç»ä¸çè®¡ç®æºï¼
* å¯ä»¥éè¿ connected(int p, int q) æ¥æ£æµè¯¥ç½ç»ä¸çæä¸¤å°è®¡ç®æºä¹é´æ¯å¦è¿é
* å¯ä»¥è°ç¨ union(int p,int q) ä½¿å¾ p å q ä¹é´è¿éï¼è¿æ ·ä¸¤å°è®¡ç®æºä¹é´å°±å¯ä»¥éä¿¡
ç
éå·¥ç¨ï¼æçè°æ¥åé交éç¶åµï¼å¾å°ç°æåééè·¯ç»è®¡è¡¨ï¼è¡¨ä¸ååºäºæ¯æ¡éè·¯ç´æ¥è¿éçåéãçæ¿åºç
éå·¥ç¨çç®æ æ¯ä½¿å
¨çä»»ä½ä¸¤ä¸ªåéé´é½å¯ä»¥å®ç°äº¤éï¼ä½ä¸ä¸å®æç´æ¥çéè·¯ç¸è¿ï¼åªè¦äºç¸é´æ¥éè¿éè·¯å¯è¾¾å³å¯ï¼é®æå°è¿éè¦å»ºè®¾å¤å°æ¡éè·¯ï¼
è§£é¢æè·¯ï¼
1. å建ä¸ä¸ªå¹¶æ¥é UF_Tree_Weighted(20)
2. åå«è°ç¨ union(0,1)ãunion(6,9)ãunion(3,8)ãunion(5,11)ãunion(2,12)ãunion(6,10)ãunion(4,8)ï¼è¡¨ç¤ºå·²ç»ä¿®å»ºå¥½çéè·¯æå¯¹åºçåå¸è¿æ¥èµ·æ¥
3. 妿åå¸å
¨é¨è¿æ¥èµ·æ¥ï¼é£ä¹å¹¶æ¥éä¸å©ä½çåç»æ°ç®ä¸º 1ï¼ææçåå¸é½å¨ä¸ä¸ªæ ä¸ï¼åªéè¦è·åå½åå¹¶æ¥éä¸å©ä½çæ°ç®åå» 1ï¼å°±æ¯è¿éè¦ä¿®å»ºçéè·¯æ°ç®
```java
public static void main(String[] args)throws Exception {
Scanner sc = new Scanner(System.in);
//读åå叿°ç®ï¼åå§åå¹¶æ¥é
int number = sc.nextInt();
//读åå·²ç»ä¿®å»ºå¥½çéè·¯æ°ç®
int roadNumber = sc.nextInt();
UF_Tree_Weighted uf = new UF_Tree_Weighted(number);
//循ç¯è¯»åå·²ç»ä¿®å»ºå¥½çéè·¯ï¼å¹¶è°ç¨unionæ¹æ³
for (int i = 0; i < roadNumber; i++) {
int p = sc.nextInt();
int q = sc.nextInt();
uf.union(p,q);
}
//è·åå©ä½çåç»æ°é
int groupNumber = uf.count();
//计ç®åºè¿éè¦ä¿®å»ºçéè·¯
System.out.println("è¿éè¦ä¿®å»º"+(groupNumber-1)+"éè·¯ï¼å叿è½ç¸é");
}
```
åèè§é¢ï¼https://www.bilibili.com/video/BV1iJ411E7xW?p=142
***
### åå
¸æ
#### åºæ¬ä»ç»
Trie æ ï¼ä¹å«åå
¸æ ï¼æ¯ä¸ç§ä¸é¨å¤çå符串å¹é
çæ å½¢ç»æï¼ç¨æ¥è§£å³å¨ä¸ç»å符串éåä¸å¿«éæ¥æ¾æä¸ªå符串çé®é¢ï¼Trie æ çæ¬è´¨å°±æ¯å©ç¨å符串ä¹é´çå
Œ
±åç¼ï¼å°éå¤çåç¼åå¹¶å¨ä¸èµ·
* æ ¹èç¹ä¸å
å«ä»»ä½ä¿¡æ¯
* æ¯ä¸ªèç¹è¡¨ç¤ºä¸ä¸ªå符串ä¸çå符ï¼ä»**æ ¹èç¹å°çº¢è²èç¹ç䏿¡è·¯å¾è¡¨ç¤ºä¸ä¸ªå符串**
* 红è²èç¹å¹¶ä¸é½æ¯å¶åèç¹
注æï¼è¦æ¥æ¾çæ¯å符串âheâï¼ä»æ ¹èç¹å¼å§ï¼æ²¿çææ¡è·¯å¾æ¥å¹é
ï¼å¯ä»¥å¹é
æåã使¯è·¯å¾çæåä¸ä¸ªèç¹âeâ并䏿¯çº¢è²çï¼ä¹å°±æ¯è¯´ï¼âheâæ¯æä¸ªå符串çåç¼å串ï¼ä½å¹¶ä¸è½å®å
¨å¹é
ä»»ä½å符串
***
#### å®ç°Trie
éè¿ä¸ä¸ªä¸æ ä¸å符ä¸ä¸æ å°çæ°ç»ï¼æ¥åå¨åèç¹çæé
æ¶é´å¤æåº¦æ¯ O(n)ï¼n è¡¨ç¤ºè¦æ¥æ¾å符串çé¿åº¦ï¼
```java
public class Trie {
private TrieNode root = new TrieNode('/');
//æå
¥ä¸ä¸ªå符
public void insert(char[] chars) {
TrieNode p = root;
for (int i = 0; i < chars.length; i++) {
//è·åå符çç´¢å¼ä½ç½®
int index = chars[i] - 'a';
if (p.children[index] == null) {
TrieNode node = new TrieNode(chars[i]);
p.children[index] = node;
}
p = p.children[index];
}
p.isEndChar = true;
}
//æ¥æ¾ä¸ä¸ªå符串
public boolean find(char[] chars) {
TrieNode p = root;
for (int i = 0; i < chars.length; i++) {
int index = chars[i] - 'a';
if (p.children[index] == null) {
return false;
}
p = p.children[index];
}
if (p.isEndChar) {
//å®å
¨å¹é
return true;
} else {
// ä¸è½å®å
¨å¹é
ï¼åªæ¯åç¼
return false;
}
}
private class TrieNode {
char data;
TrieNode[] children = new TrieNode[26];//26ä¸ªè±æåæ¯
boolean isEndChar = false;//ç»å°¾å符为true
public TrieNode(char data) {
this.data = data;
}
}
}
```
***
#### ä¼åTrie
Trie æ æ¯é常èå
åï¼éåç©ºé´æ¢æ¶é´çæè·¯ãTrie æ çå使å¾å¤ï¼å¯ä»¥å¨ä¸å®ç¨åº¦ä¸è§£å³å
åæ¶èçé®é¢ãæ¯å¦ç¼©ç¹ä¼åï¼å¯¹åªæä¸ä¸ªåèç¹çèç¹ï¼è䏿¤èç¹ä¸æ¯ä¸ä¸ªä¸²çç»æèç¹ï¼å¯ä»¥å°æ¤èç¹ä¸åèç¹åå¹¶

åèæç« ï¼https://time.geekbang.org/column/article/72414
***
## å¾
å¾ç黿¥è¡¨å½¢å¼ï¼
```java
public class AGraph {
private VertexNode[] adjList; //黿¥æ°ç»
private int vLen, eLen; //é¡¶ç¹æ°åè¾¹æ°
public AGraph(int vLen, int eLen) {
this.vLen = vLen;
this.eLen = eLen;
adjList = new VertexNode[vLen];
}
//å¼§èç¹
private class ArcNode {
int adjVex; //该边ææåçé¡¶ç¹çä½ç½®
ArcNode nextArc; //ä¸ä¸æ¡è¾¹ï¼å¼§ï¼
//int info //æ·»å æå¼
public ArcNode(int adjVex) {
this.adjVex = adjVex;
nextArc = null;
}
}
//表顶ç¹
private class VertexNode {
char data; //é¡¶ç¹ä¿¡æ¯
ArcNode firstArc; //æåç¬¬ä¸æ¡è¾¹çæé
public VertexNode(char data) {
this.data = data;
firstArc = null;
}
}
}
```
å¾ç黿¥ç©éµå½¢å¼ï¼
```java
public class MGraph {
private int[][] edges; //黿¥ç©éµå®ä¹ï¼ææå¾å°intæ¹ä¸ºfloat
private int vLen; //é¡¶ç¹æ°
private int eLen; //è¾¹æ°
private VertexNode[] vex; //åæ¾èç¹ä¿¡æ¯
public MGraph(int vLen, int eLen) {
this.vLen = vLen;
this.eLen = eLen;
this.edges = new int[vLen][vLen];
this.vex = new VertexNode[vLen];
}
private class VertexNode {
int num; //é¡¶ç¹ç¼å·
String info; //é¡¶ç¹ä¿¡æ¯
public VertexNode(int num) {
this.num = num;
this.info = null;
}
}
}
```
å¾ç¸å
³çç®æ³éè¦å¾å¤çæµç¨å¾ï¼æ¤å¤ä¸åä¸ä¸åä¸¾ï¼æ¨èåè书ç±ãæ°æ®ç»æé«åç¬è®°ã
***
## ä½å¾
### åºæ¬ä»ç»
å¸éè¿æ»¤å¨ï¼ä¸ç§æ°æ®ç»æï¼æ¯ä¸ä¸ªå¾é¿çäºè¿å¶åéï¼ä½æ°ç»ï¼åä¸ç³»åéæºæ å°å½æ°ï¼åå¸å½æ°ï¼ï¼æ¢ç¶æ¯äºè¿å¶ï¼æ¯ä¸ªç©ºé´åæ¾ç䏿¯ 0 å°±æ¯ 1ï¼ä½æ¯åå§é»è®¤å¼é½æ¯ 0ï¼æä»¥å¸éè¿æ»¤å¨ä¸åæ°æ®åªåç¶æ
è¿ç§æ°æ®ç»ææ¯é«æä¸æ§è½å¾å¥½çï¼ä½ç¼ºç¹æ¯å
·æä¸å®çé误è¯å«çåå é¤é¾åº¦ãå¹¶ä¸ç论æ
åµä¸ï¼æ·»å å°éåä¸çå
ç´ è¶å¤ï¼è¯¯æ¥çå¯è½æ§å°±è¶å¤§
***
### 工使µç¨
åå¸éè¿æ»¤å¨ä¸æ·»å ä¸ä¸ªå
ç´ key æ¶ï¼ä¼éè¿å¤ä¸ª hash 彿°å¾å°å¤ä¸ªåå¸å¼ï¼å¨ä½æ°ç»ä¸æå¯¹åºä¸æ çå¼ç½®ä¸º 1

å¸éè¿æ»¤å¨æ¥è¯¢ä¸ä¸ªæ°æ®ï¼æ¯å¦å¨äºè¿å¶çéåä¸ï¼æ¥è¯¢è¿ç¨å¦ä¸ï¼
- éè¿ K 个åå¸å½æ°è®¡ç®è¯¥æ°æ®ï¼å¯¹åºè®¡ç®åºç K 个 hash å¼
- éè¿ hash 弿¾å°å¯¹åºçäºè¿å¶çæ°ç»ä¸æ
- å¤ææ¹æ³ï¼å¦æåå¨ä¸å¤ä½ç½®çäºè¿å¶æ°æ®æ¯ 0ï¼é£ä¹è¯¥æ°æ®ä¸å®ä¸åå¨ã妿齿¯ 1ï¼åè®¤ä¸ºæ°æ®åå¨éåä¸ï¼ä¼è¯¯å¤ï¼
å¸éè¿æ»¤å¨ä¼ç¼ºç¹ï¼
* ä¼ç¹ï¼
* äºè¿å¶ç»æçæ°ç»ï¼å ç¨å
åæå°ï¼å¹¶ä¸æå
¥åæ¥è¯¢é度é½è¶³å¤å¿«
* å»éæ¹ä¾¿ï¼å½åç¬¦ä¸²ç¬¬ä¸æ¬¡å卿¶å¯¹åºç使°ç»ä¸æ 设置为 1ï¼å½ç¬¬äºæ¬¡åå¨ç¸åå符串æ¶ï¼å 为对åºä½ç½®å·²è®¾ç½®ä¸º 1ï¼æä»¥å¾å®¹æç¥éæ¤å¼å·²ç»åå¨
* 缺ç¹ï¼
* éçæ°æ®çå¢å ï¼è¯¯å¤çä¼å¢å ï¼æ·»å æ°æ®æ¯éè¿è®¡ç®æ°æ®ç hash å¼ï¼ä¸åçå符串å¯è½åå¸åºæ¥çä½ç½®ç¸åï¼å¯¼è´æ æ³ç¡®å®å°åºæ¯åªä¸ªæ°æ®åå¨ï¼**è¿ç§æ
åµå¯ä»¥éå½å¢å 使°ç»å¤§å°æè
è°æ´åå¸å½æ°**
* æ æ³å 餿°æ®ï¼å¯è½åå¨å ä¸ªæ°æ®å æ®ç¸åçä½ç½®ï¼æä»¥å é¤ä¸ä½ä¼å¯¼è´å¾å¤æ°æ®å¤±æ
* æ»ç»ï¼**å¸éè¿æ»¤å¨å¤ææä¸ªå
ç´ åå¨ï¼å°æ¦çä¼è¯¯å¤ã妿夿æä¸ªå
ç´ ä¸å¨ï¼é£è¿ä¸ªå
ç´ ä¸å®ä¸å¨**
åèæç« ï¼https://www.cnblogs.com/ysocean/p/12594982.html
***
### Guava
å¼å
¥ Guava çä¾èµï¼
```xml