并查集

并查集

public class UnionFind_QU_R_PC {
	int[] parents;
	int[] rank;
	
	public UnionFind_QU_R_PC(int capacity) {
		parents=new int[capacity];
		for (int i = 0; i < parents.length; i++) {
			parents[i]=i;
		}
		rank=new int[capacity];
		for (int i = 0; i < rank.length; i++) {
			rank[i]=1;
		}
	}
	
	/**
	 * rank优化 rank为高度
	 * @param v1
	 * @param v2
	 */
	public void union(int v1,int v2) {
		int p1=find(v1);
		int p2=find(v2);
		
		if(rank[p1]<rank[p2]) {
			parents[p1]=p2;
		}else if(rank[p1] > rank[p2]){
			parents[p2] = p1;
		}else{ // rank[p1] == rank[p2]
			parents[p1] = p2;
			rank[p2] += 1;
		}
	}
	/** 在 find 时使路径上的所有节点都指向根节点,从而降低树的高度。
	 * 路径压缩
	 * @param v
	 * @return
	 */
//	public int find(int v) {
//		check(v);
//		if(parents[v]!=v) {
//			parents[v]=find(parents[v]);
//		}
//		return parents[v];
//	}
	
	/** 使路径上的每个节点都指向其祖父节点
	 * 路径分裂
	 * @param v
	 * @return
	 */
//	public int find(int v) {
//		check(v);
//		while(parents[v]!=v) {
//			int p=parents[v];
//			parents[v]=parents[parents[v]];
//			v=p;
//		}
//		return parents[v];
//	}
	/** 使路径上每隔一个节点就指向其祖父节点
	 * 路径减半
	 * @param v
	 * @return
	 */
	public int find(int v){
		check(v);
		while(v != parents[v]){
			parents[v] = parents[parents[v]];
			v = parents[v];
		}
		return parents[v];
	}
	
	/**
	 * 检查是否合法
	 * @param v
	 */
	public void check(int v) {
		if(v<0||v>parents.length) {
			throw new IllegalArgumentException("数组越界!");
		}
	}
	
	public static void main(String[] args) {
		UnionFind_QU_R_PC unionFind_QU_R_PC = new UnionFind_QU_R_PC(5);
		unionFind_QU_R_PC.union(0, 1);
		System.out.println(unionFind_QU_R_PC.find(0));
		unionFind_QU_R_PC.union(1, 2);
		System.out.println(unionFind_QU_R_PC.find(2));
		unionFind_QU_R_PC.union(2, 3);
		System.out.println(unionFind_QU_R_PC.find(3));
	}
}

通用并查集

public class UnionFind<V> {
	//用 HashMap保存结点
	Map<V, Node<V>> nodes=new HashMap<>();
	/**
	 * 创建集合
	 * @param v
	 */
	public void makeSet(V v) {
		if (nodes.containsKey(v)) return;
		nodes.put(v, new Node<>(v));
	}
	/**
	 * 
	 * @author 李海涛
	 *
	 * @param <V> 结点上的值 可能为数字或者字符串
	 */
	public static class Node<V>{
		V value;
		Node<V> parent=this;
		int rank=1;
		public Node(V value) {
			this.value = value;
		}
	}
	/**
	 * 找出v所在结点的根结点
	 * @param v
	 * @return
	 */
	public Node<V> findNode(V v){
		Node<V> node = nodes.get(v);
		if(node==null) return null;
		while(!Objects.equals(node.value, node.parent.value)) {
			node.parent=node.parent.parent;
			node=node.parent;
		}
		return node;
	}
	/**
	 * 找到v所在结点根结点的v值
	 * @param v
	 * @return
	 */
	public V find(V v) {
		Node<V> node = findNode(v);
		return node==null ? null:node.value;
	}
	/**
	 * 将v1 v2所在的树连接起来 变成一棵树
	 * @param v1
	 * @param v2
	 */
	public void union(V v1,V v2) {
		Node<V> p1 = findNode(v1);
		Node<V> p2 = findNode(v2);
		if(p1==null||p2==null) return;
		if(Objects.equals(p1.value, p2.value)) return;
		if(p1.rank<p2.rank) p1.parent=p2;
		else if(p1.rank>p2.rank) p2.parent=p1;
		else {
			p1.parent=p2;
			p2.rank+=1;
		}
	}
	/**
	 * 判断v1所在的结点和v2所在的结点是否在同一棵树上
	 * @param v1
	 * @param v2
	 * @return
	 */
	public boolean isSame(V v1,V v2) {
		return Objects.equals(find(v1),find(v2));
	}
}
相关推荐
<div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;"> </span> <div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;"> </span> <div style="color:rgba(0,0,0,.75);"> <div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;">当前课程中商城项目的实战源码是我发布在 GitHub 上的开源项目 newbee-mall (新蜂商城),目前已有 6300 多个 star,</span><span style="color:#4d4d4d;">本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 大部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 商城项目功能的讲解,让大家实际操作并实践上手一个大型的线上商城项目,并学习到一定的开发经验以及其中的开发技巧。<br /> 商城项目所涉及的功能结构图整理如下:<br /> </span> </div> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <p style="color:#4d4d4d;"> <img alt="modules" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3N0b3JlL25ld2JlZS1tYWxsLXMucG5n?x-oss-process=image/format,png" /> </p> </div> <p style="color:rgba(0,0,0,.75);"> <strong><span style="color:#e53333;">课程特色</span></strong> </p> <p style="color:rgba(0,0,0,.75);">   </p> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <ul> <li> 对新手开发者十分友好,无需复杂的操作步骤,仅需 2 秒就可以启动这个完整的商城项目 </li> <li> 最终的实战项目是一个企业级别的 Spring Boot 大型项目,对于各个阶段的 Java 开发者都是极佳的选择 </li> <li> 实践项目页面美观且实用,交互效果完美 </li> <li> 教程详细开发教程详细完整、文档资源齐全 </li> <li> 代码+讲解+演示网站全方位保证,向 Hello World 教程说拜拜 </li> <li> 技术栈新颖且知识点丰富,学习后可以提升大家对于知识的理解和掌握,可以进一步提升你的市场竞争力 </li> </ul> </div> <p style="color:rgba(0,0,0,.75);">   </p> <p style="color:rgba(0,0,0,.75);"> <span style="color:#e53333;">课程预览</span> </p> <p style="color:rgba(0,0,0,.75);">   </p> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <p style="color:#4d4d4d;"> 以下为商城项目的页面和功能展示,分别为: </p> </div> <div style="color:rgba(0,0,0,.75);"> <ul> <li> 商城首页 1<br /> <img alt="" src="https://img-bss.csdnimg.cn/202103050347585499.gif" /> </li> <li> 商城首页 2<br /> <img alt="" src="https://img-bss.csdn.net/202005181054413605.png" /> </li> <li>   </li> <li> 购物车<br /> <img alt="cart" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvY2FydC5wbmc?x-oss-process=image/format,png" /> </li> <li> 订单结算<br /> <img alt="settle" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3Qvc2V0dGxlLnBuZw?x-oss-process=image/format,png" /> </li> <li> 订单列表<br /> <img alt="orders" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3Qvb3JkZXJzLnBuZw?x-oss-process=image/format,png" /> </li> <li> 支付页面<br /> <img alt="" src="https://img-bss.csdn.net/201909280301493716.jpg" /> </li> <li> 后台管理系统登录页<br /> <img alt="login" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvbWFuYWdlLWxvZ2luLnBuZw?x-oss-process=image/format,png" /> </li> <li> 商品管理<br /> <img alt="goods" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvbWFuYWdlLWdvb2RzLnBuZw?x-oss-process=image/format,png" /> </li> <li> 商品编辑<br /> <img alt="" src="https://img-bss.csdnimg.cn/202103050348242799.png" /> </li> </ul> </div> </div> </div> </div>
©️2020 CSDN 皮肤主题: 鲸 设计师:meimeiellie 返回首页