91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Java并查集是怎么實現的

發布時間:2020-07-06 10:28:31 來源:億速云 閱讀:163 作者:清晨 欄目:開發技術

這篇文章將為大家詳細講解有關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并查集是怎么實現的就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

波密县| 南川市| 香河县| 沾益县| 专栏| 环江| 平远县| 安吉县| 甘泉县| 青阳县| 宜宾市| 利辛县| 平安县| 冀州市| 北京市| 杭锦旗| 金溪县| 博白县| 黑水县| 白水县| 玉屏| 隆尧县| 普陀区| 宝丰县| 郑州市| 灵川县| 海南省| 湘潭市| 望奎县| 宁河县| 麻江县| 双江| 香格里拉县| 正定县| 深圳市| 灌云县| 新晃| 邵阳市| 阿拉尔市| 灵寿县| 盐城市|