這篇文章將為大家詳細講解有關Java并查集是怎么實現的,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
自下而上的樹結構
接口
/**
* @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為根的集合中樹的層數
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所對應的集合編號
* O(h)復雜度,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是否同屬一個集合
* 時間復雜度O(h)
* @param p
* @param q
* @return
*/
@Override
public boolean isConnected(int p, int q) {
return find(p) == find(q);
}
/**
* 合并元素p, q所屬的集合,只需要把Rank低的根節點指向Rank高的根節點就可以
* O(h)復雜度
* @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;
}
}
}關于Java并查集是怎么實現的就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。