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

yizhihongxing

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日

相关文章

  • Java的Spring框架中DAO数据访问对象的使用示例

    下面是讲解Java的Spring框架中DAO数据访问对象的使用示例的完整攻略。 什么是DAO模式? DAO,即Data Access Object(数据访问对象),是一种数据持久化技术的最常见的设计模式之一,用于将应用程序的业务逻辑和底层数据存储之间的交互从彼此分离。DAO模式的主要目的是提供一种通用的API来访问底层数据存储和操作数据对象。 什么是Spri…

    Java 2023年5月20日
    00
  • Java避免UTF-8的csv文件打开中文出现乱码的方法

    针对“Java避免UTF-8的csv文件打开中文出现乱码”的问题,可以采取以下两种方法来解决: 方法一:使用OpenCSV库 OpenCSV是一个处理CSV文件的Java第三方库,它可以在读取或写入CSV文件时处理编码问题。可以通过以下步骤来避免在CSV文件打开中文出现乱码。 导入OpenCSV库到你的Java项目中。可以通过在pom.xml文件中添加以下依…

    Java 2023年5月20日
    00
  • IDEA全局查找关键字的用法解读

    下面就为大家详细讲解“IDEA全局查找关键字的用法解读”的完整攻略。 1. 什么是IDEA全局查找 IDEA全局查找是指在IDEA中查找某个关键字时,不仅可以在当前文件中查找,还可以在整个项目中查找。 2. 如何使用IDEA全局查找 使用IDEA全局查找非常简单,具体步骤如下: 打开需要查找的项目。 在菜单栏中点击“Edit” -> “Find” -&…

    Java 2023年6月15日
    00
  • spring缓存代码详解

    Spring缓存代码详解 什么是Spring缓存? Spring缓存是一组在Spring应用程序中使用缓存的框架和模块,基于Java EE的JSR-107规范,提供了一致性且易于集成的缓存解决方案。它提供了一种方法来加速应用程序的性能,减轻系统负载,并提高应用程序的可伸缩性。 Spring缓存的工作原理 Spring缓存框架主要有两个核心概念:缓存管理器和缓…

    Java 2023年5月26日
    00
  • JSP 自定义标签第3/3页

    我来详细讲解一下 “JSP 自定义标签第3/3页” 的完整攻略。 什么是 JSP 自定义标签 JSP 自定义标签,指的是用户可以自定义自己的标签,在 JSP 页面上使用,达到简化 JSP 页面代码,增加可读性的目的。JSP 自定义标签可以分为两种类型: 动态内容标签:在标签体中执行动态内容,并输出结果。 静态内容标签:输出预定的静态内容,不需要执行动态逻辑。…

    Java 2023年6月15日
    00
  • Java基于自定义类加载器实现热部署过程解析

    以下是详细讲解“Java基于自定义类加载器实现热部署过程解析”的完整攻略。 什么是热部署? 热部署是指在应用程序运行过程中动态地更新代码,而不用停止应用程序的运行。热部署的好处是可以提高开发效率,因为不用每次都重新启动应用程序,而且能够降低系统故障和维护的成本。 Java中如何实现热部署? Java是一种面向对象的编程语言,它提供了类加载机制来加载字节码文件…

    Java 2023年6月15日
    00
  • java获取两个数组中不同数据的方法

    下面是讲解“java获取两个数组中不同数据的方法”的攻略: 概述 有时候,我们需要比较两个数组,找出它们中的不同数据。Java中有多种方式可以实现这个目的,例如使用循环遍历、使用Set集合、使用Stream API等等。接下来,我们将逐一介绍这些方法的使用,同时给出示例说明。 方法一:循环遍历法 这种方法时常使用,它需要用到两个嵌套循环来比较两个数组中的每一…

    Java 2023年5月26日
    00
  • Java动态代理四种实现方式详解

    《Java动态代理四种实现方式详解》是一篇详细介绍Java动态代理技术的文章,本文将从以下几个方面逐一介绍: 什么是Java动态代理 Java动态代理的特点 Java动态代理的四种实现方式 实现示例 总结 1. 什么是Java动态代理 Java动态代理是指在程序运行过程中动态生成代理类的技术。相比于静态代理需要手动编写代理类,动态代理可以让程序更加灵活,更容…

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