Java實現(xiàn)并查集
更新時間:2020年07月05日 08:53:32 作者:NinoSun
這篇文章主要為大家詳細介紹了Java實現(xiàn)并查集,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了Java實現(xiàn)并查集的具體代碼,供大家參考,具體內(nèi)容如下
自下而上的樹結(jié)構(gòu)
接口
/**
* @author Nino
*/
public interface UF {
int size();
/**
* 看兩個元素是否相連
* @param p
* @param q
* @return
*/
boolean isConnected(int p, int q);
/**
* 將兩個元素合并在一起,變成一個集合中的元素
* @param p
* @param q
*/
void unionElements(int p, int q);
}
使用路徑壓縮的并查集
/**
* @author Nino
*/
public class UnionFind5 implements UF {
private int[] parent;
//rank[i]表示以i為根的集合中樹的層數(shù)
private int[] rank;
public UnionFind5(int size) {
parent = new int[size];
rank = new int[size];
for (int i = 0; i < size; i++) {
parent[i] = i;
rank[i] = 1;
}
}
@Override
public int size() {
return parent.length;
}
/**
* 查找過程,查找元素p所對應(yīng)的集合編號
* O(h)復(fù)雜度,h為樹的高度
* 使用路徑壓縮
* @param p
* @return
*/
private int find(int p) {
if (p < 0 && p >= parent.length) {
throw new IllegalArgumentException("p is illegal");
}
if (p != parent[p]) {
parent[p] = find(parent[p]);
}
return parent[p];
}
/**
* 查詢p, q是否同屬一個集合
* 時間復(fù)雜度O(h)
* @param p
* @param q
* @return
*/
@Override
public boolean isConnected(int p, int q) {
return find(p) == find(q);
}
/**
* 合并元素p, q所屬的集合,只需要把Rank低的根節(jié)點指向Rank高的根節(jié)點就可以
* O(h)復(fù)雜度
* @param p
* @param q
*/
@Override
public void unionElements(int p, int q) {
int pRoot = find(p);
int qRoot = find(q);
if (pRoot == qRoot) {
return;
}
//敗者食塵
if (rank[pRoot] < rank[qRoot]) {
parent[pRoot] = qRoot;
} else if (rank[qRoot] < rank[pRoot]) {
parent[qRoot] = pRoot;
} else {
parent[qRoot] = pRoot;
rank[pRoot] += 1;
}
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java處理圖片實現(xiàn)base64編碼轉(zhuǎn)換
這篇文章主要介紹了Java處理圖片實現(xiàn)base64編碼轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02
Spring?Boot?2.6.x整合Swagger啟動失敗報錯問題的完美解決辦法
這篇文章主要給大家介紹了關(guān)于Spring?Boot?2.6.x整合Swagger啟動失敗報錯問題的完美解決辦法,文中通過實例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-03-03
優(yōu)化spring?boot應(yīng)用后6s內(nèi)啟動內(nèi)存減半
這篇文章主要為大家介紹了優(yōu)化spring?boot后應(yīng)用6s內(nèi)啟動內(nèi)存減半的優(yōu)化示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2022-02-02
SpringBoot?Profiles?多環(huán)境配置及切換
大部分情況下,我們開發(fā)的產(chǎn)品應(yīng)用都會根據(jù)不同的目的,所以需要支持不同的環(huán)境,本文主要介紹了SpringBoot?Profiles?多環(huán)境配置及切換,感興趣的可以了解一下2021-12-12

