Java实现并查集

本文实例为大家分享了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;
  }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java实现快速并查集

    在一些应用的问题中,需将n个不同的元素划分成一组不相交的集合.开始时,每个元素自成一格单元素集合,然后按一定顺序将属于同一组的元素的集合合并.其间要反复用到查询某个元素属于哪个集合的运算.适合于描述这类问题的抽象数据类型称为并查集. 1. 并查集的概述 并查集的数学模型是一组不相交的动态集合的集合S={A,B,C,...},它支持以下的运算: (1)union(A,B):将集合A和B合并,其结果取名为A或B: (2)find(x):找出包含元素x的集合,并返回该集合的名字. 在并查集中需要两个类

  • Java使用HashMap实现并查集

    并查集的定义: 并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中.这一类问题近几年来反复出现在信息学的国际国内赛题中,其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(1~3秒)内计算出试题需要的结果,只能用并查集来描述. 并查集是一种树型的数

  • java编程实现并查集的路径压缩代码详解

    首先看两张路径压缩的图片: 并查集(Union-find Sets)是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题.一些常见的用途有求连通子图.求最小生成树的 Kruskal 算法和求最近公共祖先(Least Common Ancestors, LCA)等. 使用并查集时,首先会存在一组不相交的动态集合 S={S 1 ,S 2 ,⋯,S k } ,一般都会使用一个整数表示集合中的一个元素. 每个集合可能包含一个或多个元素,并选出集合中的某个元素作为代表.每个集合中具体包含

  • Java实现并查集

    本文实例为大家分享了Java实现并查集的具体代码,供大家参考,具体内容如下 自下而上的树结构 接口 /** * @author Nino */ public interface UF { int size(); /** * 看两个元素是否相连 * @param p * @param q * @return */ boolean isConnected(int p, int q); /** * 将两个元素合并在一起,变成一个集合中的元素 * @param p * @param q */ void

  • Java实现并查集示例详解

    目录 题目 思路 find实现 join的实现 整体代码  题目 题目背景 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 思路 对于该题而言,考察的是并查集,也就是小怪兽逐个找上级领导的思路,指导找到最终的Boss停止下来,如果两个怪兽要打架,需要问一问他们的上级领导,领导再问领导,逐级向上,最终发现它们属于同一个Boss的部署的话就不能再打架了,这道题同样的思路,如果斗罗大陆的一开始白沉香不知道唐三是亲戚的话,他们就

  • java 数据结构并查集详解

    目录 一.概述 二.实现 2.1 Quick Find实现 2.2 Quick Union实现 三.优化 3.1基于size的优化 3.2基于rank优化 3.2.1路径压缩(Path Compression ) 3.2.2路径分裂(Path Spliting) 3.2.3路径减半(Path Halving) 一.概述 并查集:一种树型数据结构,用于解决一些不相交集合的合并及查询问题.例如:有n个村庄,查询2个村庄之间是否有连接的路,连接2个村庄 两大核心: 查找 (Find) : 查找元素所在

  • 详解Java实现数据结构之并查集

    ​一.什么是并查集 对于一种数据结构,肯定是有自己的应用场景和特性,那么并查集是处理什么问题的呢? 并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题,常常在使用中以森林来表示.在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中.其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受:即使在空

  • Java数据机构中关于并查集的详解

    目录 概念 实现 初始化并查集 判断是不是同一个组 查找当前节点的代表节点 合并操作 本期文章源码:GitHub 一文彻底搞懂<并查集>! 概念 并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题(即所谓的并.查).比如说,我们可以用并查集来判断一个森林中有几棵树.某个节点是否属于某棵树等. 具体的用法,我们会以下一篇文章<图的相关算法>中,有一个克鲁斯卡尔算法,用于生成最小生成树,会用到并查集. 并查集的主要作用是求连通分支数(如果一个图中所有点都存在可达关系(直

  • java并查集算法带你领略热血江湖

    目录 一.什么是并查集 二.深入理解并查集 三.实现并查集 四.真题训练 五.路径压缩优化 六.总结 你好,我是小黄,一名独角兽企业的Java开发工程师. 校招收获数十个offer,年薪均20W~40W. 感谢茫茫人海中我们能够相遇, 俗话说:当你的才华和能力,不足以支撑你的梦想的时候,请静下心来学习, 希望优秀的你可以和我一起学习,一起努力,实现属于自己的梦想. 一.什么是并查集 并查集被很多OIer认为是最简洁而优雅的数据结构之一,主要用于处理一些不相交集合的合并问题,并支持两种操作: 合并

  • Java数据结构之并查集的实现

    目录 代码解析 代码应用 实际应用 并查集就是将原本不在一个集合里面的内容合并到一个集合中. 在实际的场景中用处不多. 除了出现在你需要同时去几个集合里面查询,避免出现查询很多次,从而放在一起查询的情况. 下面简单实现一个例子,我们来举例说明一下什么是并查集,以及究竟并查集解决了什么问题. 代码解析 package com.chaojilaji.book.andcheck; public class AndCheckSet { public static Integer getFather(in

随机推荐