溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java并查集是怎么實現(xiàn)的

發(fā)布時間:2020-07-06 10:28:31 來源:億速云 閱讀:157 作者:清晨 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)Java并查集是怎么實現(xiàn)的,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

自下而上的樹結(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;
  }
 }
}

關(guān)于Java并查集是怎么實現(xiàn)的就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI