并查集单HashMap实现

server/2025/2/12 8:34:41/
java">import java.util.Arrays;
import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;public class UnionFind<T> {/*** 如果sets[i] < 0,那么第i个元素为根元素,且sets[i]的绝对值为集合大小* 否则,第i个元素为非根元素,set[i]的值为其父亲元素的索引*/private int[] sets;/*** 反向索引,记录的是当前元素在sets中的索引*/private Map<T, Integer> reverseIndexMap;/*** 根据elems元素内容创建一个并查集* * @param elems*/public UnionFind(T[] elems) {sets = new int[elems.length];Arrays.fill(sets, -1);reverseIndexMap = new HashMap<>();for (int i = 0; i < elems.length; i++) {reverseIndexMap.put(elems[i], i);}}/*** 返回元素e所在集合的标识* * @param e* @return*/public int find(T e) {Deque<Integer> stack = new LinkedList<>();int eIndex = reverseIndexMap.get(e);while (sets[eIndex] >= 0) {int fIndex = sets[eIndex];stack.push(eIndex);eIndex = fIndex;}// 这里进行路径压缩while (!stack.isEmpty()) {sets[stack.pop()] = eIndex;}return eIndex;}/*** 将e1所在元素集合与e2所在元素集合合并* * @param e1* @param e2*/public void union(T e1, T e2) {if (isSameSet(e1, e2)) {// 如果已经处于同一个集合了,那么不进行合并return;}int f1Index = find(e1);int f2Index = find(e2);// 因为f1和f2是根节点,所以对应的sets中的元素为// 二者所在集合大小的相反数int size1 = Math.abs(sets[f1Index]);int size2 = Math.abs(sets[f2Index]);if (size1 < size2) {sets[f2Index] += sets[f1Index];sets[f1Index] = f2Index;} else {sets[f1Index] += sets[f2Index];sets[f2Index] = f1Index;}}/*** 如果e1和e2处于同一个集合中,那么返回true,否则返回false* * @param e1* @param e2* @return*/public boolean isSameSet(T e1, T e2) {return find(e1) == find(e2);}private void debug() {System.out.println(Arrays.toString(sets));}public static void main(String[] args) {String[] nums = { "1", "2", "3", "4", "5", "6" };UnionFind<String> uf = new UnionFind<>(nums);uf.union(nums[0], nums[1]);uf.union(nums[3], nums[4]);uf.debug();uf.union(nums[0], nums[4]);uf.find(nums[4]);uf.debug();}
}

http://www.ppmy.cn/server/46668.html

相关文章

单点登录模式

1. 什么是单点登录 比如有一家公司&#xff0c;他业务线很多&#xff0c;有小游戏&#xff0c;有商城&#xff0c;有小程序&#xff0c;导致有很多系统&#xff0c;他不可能为每一个系统做一套用户管理&#xff0c;因为这些系统都是属于公司的&#xff0c;用户是相通的&#x…

联邦学习【01】杨强第三章横向联邦学习复现

环境&#xff1a;有无gpu均可 anaconda环境&#xff1a;conda install pytorch1.13.1 torchvision0.14.1 torchaudio0.13.1 pytorch-cuda11.6 -c pytorch -c nvidia 具体安装命令结合自己的gpu的cuda版本 项目代码放在 https://gitee.com/ihan1001gitee https://github.com/ih…

FS212E 系列PD协议

PD快充协议芯片FS212EL、FS212EH可以智能的识别插入的手机类型&#xff0c;选择最为合适的协议应对手机快充需要。兼容多类USB Type-C协议&#xff0c;包括TypeC协议、TypeC PD2.0、TypeC PD3.0、TypeC PD3.2等协议。集成OPTO输出&#xff0c;通过电阻直驱反馈光耦。FS212E 的调…

从零开始写 Docker(十六)---容器网络实现(上):为容器插上”网线”

本文为从零开始写 Docker 系列第十六篇&#xff0c;利用 linux 下的 Veth、Bridge、iptables 等等相关技术&#xff0c;构建容器网络模型&#xff0c;为容器插上”网线“。 完整代码见&#xff1a;https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实…

Golang容器:Channel

Channel概念 Channel管道 是Go语言中一种强大的通信机制&#xff0c;它使得在并发运行的goroutines之间可以高效地交换数据。通过Channel管道&#xff0c;goroutines能够&#xff1a; 同步执行&#xff1a;Channel管道可以用来协调并发任务的执行顺序&#xff0c;确保它们在正…

跟着Nature学作图:R语言ggridges包绘制峰峦图

数据和代码获取&#xff1a;请查看主页个人信息&#xff01;&#xff01;&#xff01; 大家好&#xff0c;今天我将介绍如何使用R语言ggridges包绘制峰峦图。 近期在做数据分析项目时&#xff0c;再一次遇到了图片组合繁琐的问题&#xff1b;分析主要是构图和布局问题&#xff…

【云原生】Docker Compose 使用详解

目录 一、前言 二、Docker Compose 介绍 2.1 Docker Compose概述 2.2 Docker Compose特点 2.3 Docker Compose使用场景 三、Docker Compose 搭建 3.1 安装docker环境 3.2 Docker Compose安装方式一 3.2.1 下载最新版/如果不是最新可替换最新版本 3.2.2 设置权限 3.2.…

[Qt]关于QListWidget、QScrollArea 为什么在QDesigner上设置了之后界面上仍然不生效的问题

前言 最近做了一些有关QListWidget和QScrollArea的控件&#xff0c;我去&#xff0c;这两个控件是真的坑&#xff0c;明明我在QDesigner的操作界面上对这两个控件的界面进行了修改&#xff0c;但是编译出来的软件就是看上去什么都没有&#xff0c;很坑&#xff0c;Gpt也没解决…