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

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

什么是并查集

并查集是一种用于管理不相交集合(并查集中,“集合”通常是指一个性质相同的元素的集合)的数据结构。它支持在并集、查集两个操作中的任何一个在接近O(1)的时间复杂度完成,且相对简单易懂。

并查集的应用场景

  1. 网络的连通性判断
  2. 最小生成树算法
  3. 图像处理领域的一些应用

并查集的基本操作

  1. 初始化:每个元素都由自己单独构成一个集合,每个集合的父节点设置成自己;
  2. 查找:判断某个元素所在的集合,可以通过不断地向上查找父节点,直到其父节点是自身。
  3. 合并:将两个集合合并为一个,将其中一个的父节点设置为另一个的根节点。

Java并查集算法示例

示例一:判断一个图是否连通

public class ConnectedComponent {
    private int[] father; // 记录每个点的父节点
    private int count; // 连通块数量

    /**
     * 初始化并查集
     * @param n 节点个数
     */
    public ConnectedComponent(int n) {
        father = new int[n + 1];
        for (int i = 1; i <= n; i++) {
            father[i] = i;
        }
        count = n;
    }

    /**
     * 查询节点所在的连通块
     * @param x 节点编号
     * @return 节点所在的连通块代表
     */
    public int find(int x) {
        if (father[x] == x) {
            return x;
        }
        return father[x] = find(father[x]); // 路径压缩
    }

    /**
     * 合并两个连通块
     * @param x 节点 x
     * @param y 节点 y
     * @return true:合并成功;false:两个点已经在同一个连通块中
     */
    public boolean union(int x, int y) {
        int rootX = find(x);
        int rootY = find(y);
        if (rootX == rootY) {
            return false;
        }
        father[rootX] = rootY;
        count--;
        return true;
    }

    /**
     * 获取连通块数量
     * @return 连通块数量
     */
    public int getCount() {
        return count;
    }
}

示例二:计算朋友圈数量

给定一个类似于人际关系的矩阵,其中1表示两个人是朋友,0表示不是,计算朋友圈的数量。

public class FriendCircle {
    private int[] father;
    private int count;

    /**
     * 初始化并查集
     */
    public FriendCircle(int n) {
        father = new int[n];
        for (int i = 0; i < n; i++) {
            father[i] = i;
        }
        count = n;
    }

    /**
     * 查找节点所在连通块的代表
     * @param x 节点编号
     * @return 联通块代表
     */
    private int find(int x) {
        if (father[x] == x) {
            return x;
        }
        return father[x] = find(father[x]);
    }

    /**
     * 合并两个节点所在的连通块
     * @param x 节点x
     * @param y 节点y
     */
    private void union(int x, int y) {
        int rootX = find(x);
        int rootY = find(y);
        if (rootX == rootY) {
            return;
        }
        father[rootX] = rootY;
        count--;
    }

    /**
     * 计算朋友圈数量
     * @param M 人际关系矩阵
     * @return 朋友圈数量
     */
    public int findCircleNum(int[][] M) {
        for (int i = 0; i < M.length; i++) {
            for (int j = i + 1; j < M[0].length; j++) {
                if (M[i][j] == 1) {
                    union(i, j);
                }
            }
        }
        return count;
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java并查集算法带你领略热血江湖 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • SpringBoot中获取微信用户信息的方法

    获取微信用户信息的方法,一般分为两个步骤: 获取用户的授权凭证(code) 根据授权凭证(code)换取用户的openid和access_token SpringBoot已经整合了微信的SDK,可直接使用。 步骤一:获取用户的授权凭证(code) 用户在访问我们的网站或应用时,需要先登录微信,然后授权给我们的应用。这时我们就可以得到用户的code。 用如下代…

    Java 2023年5月26日
    00
  • Spring之详解bean的实例化

    Spring 之详解bean的实例化 在 Spring 中,Bean 就是应用程序中的对象,是应用程序的基本构成单元。Bean 由 Spring 容器管理,Spring 容器实例化、配置和组装这些 Bean。本文将详细讲解 Spring 中 Bean 的实例化。 Bean 的实例化方式 在 Spring 中,Bean 的实例化方式一般有三种: 构造器实例化 …

    Java 2023年5月26日
    00
  • Ajax添加数据与删除篇实现代码

    下面详细讲解“Ajax添加数据与删除篇实现代码”的完整攻略。 一、准备工作 在正式开始编写Ajax添加数据与删除篇的实现代码前,需要先完成以下准备工作: 确保你已经学习过Ajax基础知识,包括Ajax的基本流程、请求方式、回调函数等等。 确定添加数据与删除篇功能需要操作的数据表格,包括表格名称、字段名称等等。 熟悉服务器端处理Ajax请求的技术,例如PHP、…

    Java 2023年6月15日
    00
  • java实现两个文件的异或运算

    实现两个文件的异或运算,可以通过以下几个步骤来完成: 读取文件内容。使用java提供的File类和FileInputStream类,用来读取文件内容。 进行异或操作,将两个字节数组对应位进行异或运算。 将异或结果写入输出文件中。使用java提供的FileOutputStream类,将异或结果写入输出文件中。 下面是一个示例代码,用来实现两个文件的异或运算: …

    Java 2023年5月19日
    00
  • Windows下tomcat安装教程

    下面是“Windows下Tomcat安装教程”的完整攻略。 准备工作 下载并安装JDK 访问JDK官网,根据你的Windows系统下载并安装对应版本的JDK。 安装JDK时记得要设置环境变量。 下载Tomcat 访问Tomcat官网,下载并选择合适的Tomcat版本。 下载完成后,解压Tomcat并将其放置在某个目录下。 安装Tomcat 打开命令提示符(W…

    Java 2023年5月19日
    00
  • 如何使用Java调试技术?

    下面我将为您详细讲解如何使用Java调试技术。 如何使用Java调试技术 什么是Java调试技术 Java调试技术是指利用各种工具和技术,用来检查程序运行状态和问题,并找到程序中的错误。 Java调试工具 目前常见的Java调试工具有以下几种: Eclipse IntelliJ IDEA NetBeans jdb jvisualvm jstack等 Java…

    Java 2023年5月11日
    00
  • mybatis @Intercepts的用法解读

    下面将详细讲解 “MyBatis @Intercepts 的用法解读”。 1. @Intercepts 简介 @Intercepts 是 MyBatis 中提供的一个注解,用于标记拦截器对象。 2. 用法解读 首先,我们需要了解 MyBatis 中的拦截器机制。 MyBatis 中的拦截器就是一个实现了 org.apache.ibatis.plugin.In…

    Java 2023年5月20日
    00
  • Java实战之用springboot+netty实现简单的一对一聊天

    准备工作 在开始实现之前,我们需要准备好一些工具。首先,我们需要安装JDK和Maven。然后,我们需要选择一个好用的IDE来进行开发。这里我推荐使用IntelliJ IDEA。最后,我们需要下载Netty和Spring Boot的依赖。 实现一对一聊天 首先,我们需要定义一些数据结构来表示聊天消息。这里我定义了一个简单的类ChatMessage来表示消息: …

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部