union-find 加权union算法

本文介绍了一种改进的并查集数据结构,通过为每个触点分配权重,确保小集合合并到大集合中,以提高效率。作者使用Java实现了一个名为UF2的类,并展示了如何在随机生成的连接操作中动态调整连接策略。运行结果展示了算法在不断合并过程中的状态变化。
摘要由CSDN通过智能技术生成

思路

给每个触点一个权重,使得总是让小数加到大树上

public class UF2 {
		private int[] id;
		private int[] sz;
		private int count;
		public UF2 (int N) {
			id = new int[N];
			sz = new int[N];
			this.count = N;
			for(int i=0;i<count;i++) {
				id[i] = i;
				sz[i] = 1;
			}
		}

代码实现

package Mr_math;

import java.util.Random;

public class UF2 {
		private int[] id;
		private int[] sz;
		private int count;
		public UF2 (int N) {
			id = new int[N];
			sz = new int[N];
			this.count = N;
			for(int i=0;i<count;i++) {
				id[i] = i;
				sz[i] = 1;
			}
		}
		public int count() {
			return this.count;
		}
		public int find(int number) {
			while(number != id[number]) number = id[number];
			return number;
		}
		public void union(int p, int q) {
			int i = find(p);
			int j= find(q);
			if(i  == j) return;
			if(sz[i]>sz[j]) {
				id[j] = i;
				sz[i]+= sz[j];
			}
			else {
				id[i] = j;
				sz[j] += sz[i];
			}
			count--;
		}
		public void see() {
			
			System.out.println("矩阵情况:");
			for(int i=0;i<10;i++) {
				System.out.print(i+"  ");
			}
			System.out.println();
			for(int i=0;i<id.length;i++) {
				System.out.print(sz[i]+"  ");
			}
			System.out.println();
			for(int i=0;i<id.length;i++) {
				
				System.out.print(id[i]+"  ");
			}
		}
		public static void main(String []args) {
			
			  //Scanner out = new Scanner(System.in); System.out.print("输入:");
			 
			Random out = new Random(); 
			 int p;
			 int q;
			int N= 10;
			UF2 uf =new UF2(N);
			int count=0;
			while(uf.count != N-9) {
				p = out.nextInt(10);
				q = out.nextInt(10);
				uf.union(p, q);
				if(count !=uf.count) {					//归并后,count--,每次状态发生变化,打印在控制台
				System.out.println();
				System.out.println("p="+p+" , q="+q);
				System.out.println("count:"+uf.count());
				uf.see();
					count = uf.count;
				}
			}
		}
	}

运行结果

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值