并查集算法详解

devtools/2024/11/8 6:33:59/

文章目录

    • 并查集概念
    • 并查集的常见操作
      • 构建并查集
      • 合并并查集和查找
    • 关于find函数

并查集概念

并查集(Union-Find)是一种树型的数据结构,用于处理一些不交集的合并及查询问题。其主要应用是判断两个元素是否在同一个集合中,以及合并两个集合。

并查集的常见操作

构建并查集

java">public class Main12 
{public static void main(String[] args) {int[] father=new int[11];for(int i=1;i<=10;i++){father[i]=i;}}
}

这样构建的数组的每一个元素都是一个单独的集合没有任何交集。
就像这样
在这里插入图片描述

合并并查集和查找

java">public class Main12
{static int[] father=new int[11];public static void main(String[] args) {for(int i=1;i<=10;i++){father[i]=i;}father[find(1)]=find(2);father[find(3)]=find(2);father[find(2)]=find(4);}public static int find(int x){while(x!=father[x]){x=father[x];}return father[x];}
}

father数组里面存是当前元素的父节点,看个图片就理解了。
find函数是查找元素的根节点
以这个并查集为例子:
father[find(1)]=find(2);
father[find(3)]=find(2);
father[find(2)]=find(4);

在这里插入图片描述
我们先将集合1合并到集合2,再将集合3合并到集合2,最后将集合2合并到集合4。
集合的合并:例如合并集合1和集合2 father[find(1)]=find(2);就是将2的根节点赋值给1的根节点就可以了

在这里插入图片描述
看这幅图片就可以很好理解father数组里面存是当前元素的父节点
在并查集里面只有根节点的x==[father[x],通过这个特点我们可以查找集合元素的根节点,当两个元素根节点相同时则属于同一个集合,否则就不在同一集合。

关于find函数

java">public static int find(int x){while(x!=father[x]){x=father[x];}return father[x];}

我们以这种写法找根节点的时候如果我们查找n-1元素的根节点的时候需要将整棵树遍历一遍效率比较低。
在这里插入图片描述
find的第二种写法

java"> public static int find(int x){if(father[x]!=x){father[x]=find(father[x]);}return father[x];}

这种写法有个名字叫路径压缩,效率高,但是有个缺点就是会破坏树的结构。
举个例子:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
看第一幅图我们可以知道1的父节点应该是2,但是如果使用路径压缩,1的父节点被修改为了1。意味着树的结构变为了这样
在这里插入图片描述
大家根据具体的需要选择合适的find方法。
并查集模板练习

java">import java.util.Scanner;
public class Main
{static int N,M;static int[] arr;public static void main(String[] args) {Scanner scanner=new Scanner(System.in);N=scanner.nextInt();M=scanner.nextInt();arr=new int[N+10];for(int i=1;i<=N;i++){arr[i]=i;}while((M--)>0){int z=scanner.nextInt();int x=scanner.nextInt();int y=scanner.nextInt();if(z==1){arr[find(x)]=find(y);}else{if(find(x)==find(y)){System.out.println("Y");}else{System.out.println("N");}}}}static int find(int x) {if (x != arr[x]) arr[x] = find(arr[x]);return arr[x];}
}

村村通题目练习

java">import java.util.Scanner;
public class Main
{static int N,M;static int[] arr;public static void main(String[] args) {Scanner scanner=new Scanner(System.in);N=scanner.nextInt();M=scanner.nextInt();arr=new int[N+10];for(int i=1;i<=N;i++){arr[i]=i;}while((M--)>0){int z=scanner.nextInt();int x=scanner.nextInt();int y=scanner.nextInt();if(z==1){arr[find(x)]=find(y);}else{if(find(x)==find(y)){System.out.println("Y");}else{System.out.println("N");}}}}static int find(int x) {if (x != arr[x]) arr[x] = find(arr[x]);return arr[x];}
}

完。


http://www.ppmy.cn/devtools/132231.html

相关文章

mysql 聚合函数

在 MySQL 中&#xff0c;聚合函数是用于执行计算并返回单个值的函数。它们通常与 GROUP BY 语句一起使用&#xff0c;用于处理多行数据并返回一个值。一些常见的 MySQL 聚合函数包括 COUNT、SUM、AVG、MAX 和 MIN。 COUNT COUNT 函数用于计算某个列的行数。例如&#xff0c;要计…

数据库期末考试简答题

1&#xff0e;试述数据、数据库、数据库管理系统、数据库系统的概念。 答&#xff1a;&#xff08;1&#xff09;数据是数据库中存储的基本对象&#xff0c;是描述事物的符号记录。数据有多种表现形式&#xff0c;它们都可以经过数字化后存入计算机。数据的种类有数字、文字、…

Android手机连接蓝牙,蓝牙连接和断开时,app疑似闪退到桌面,进程并未杀死

最近做蓝牙连接&#xff0c;有一款蓝牙设备&#xff0c;用户反馈说连接就闪退&#xff0c;或者解绑就闪退&#xff0c;我看bugly&#xff0c;没有报闪退日志啊&#xff0c;然后自己试了一下&#xff0c;确实闪退&#xff0c;但是很奇怪的是&#xff0c;android studio进程并未杀…

C语言 | Leetcode C语言题解之第538题把二叉搜索树转换为累加树

题目&#xff1a; 题解&#xff1a; struct TreeNode* getSuccessor(struct TreeNode* node) {struct TreeNode* succ node->right;while (succ->left ! NULL && succ->left ! node) {succ succ->left;}return succ; }struct TreeNode* convertBST(stru…

数据库索引怎么使用,建表的时候怎么去考虑

在数据库设计和表创建时&#xff0c;索引的合理使用可以显著提升查询效率。但索引的选择和设置需要谨慎&#xff0c;过多或不合理的索引可能会增加写操作的成本和存储空间。以下是建立和使用索引的一些原则和建议&#xff1a; 1. 索引的作用 索引的主要作用是加速查询&#x…

mysql批量生成修改数据库中字段类型的语句

假设需要修改数据库中所有datetime类型的字段为date类型SELECT cl.table_name,cl.column_name,cl.data_type,CONCAT("ALTER TABLE ", cl.table_name, " MODIFY COLUMN `", cl

使用 OpenCV 和 Pyzbar 检测二维码和条码

概述 在现代社会&#xff0c;二维码和条码的应用非常广泛&#xff0c;从商品标签到支付二维码&#xff0c;几乎无处不在。本文将详细介绍如何使用 OpenCV 和 Pyzbar 库在 Python 中检测并识别二维码和条码&#xff0c;并通过具体的代码示例来展示整个过程。 环境准备 在开始…

《安富莱嵌入式周报》第345期:开源蓝牙游戏手柄,USB3.0 HUB带电压电流测量,LCR电桥前端模拟,开源微型赛车,RF信号扫描仪,开源无线电收发器

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 本周更新一期视频教程 第5期&#xff1a;RTX5/FreeRTOS全家桶源码工程综合实战模板集成CANopen组件&#xff08;2024-1…