详解Java实现数据结构之并查集

详解Java实现数据结构之并查集

简介

并查集是一种基于树型结构的数据结构,主要用于解决一些不交集问题。它支持两个操作:

  • 合并两个元素所在的集合
  • 判断两个元素是否在同一个集合中

在并查集中,每个节点都有一个指向其父节点的指针。如果一个节点的指针指向它本身,说明它是一个集合的根节点。

实现

我们用一个int类型的数组parent来表示每个节点的父节点。初始时,所有节点的父节点都是其本身。

private int[] parent;

public UnionFind(int size) {
    parent = new int[size];
    for (int i = 0; i < size; i++) {
        parent[i] = i;
    }
}

private int find(int x) {
    if (parent[x] == x) {
        return x;
    }
    parent[x] = find(parent[x]);
    return parent[x];
}

public void union(int x, int y) {
    int rootX = find(x);
    int rootY = find(y);
    if (rootX != rootY) {
        parent[rootX] = rootY;
    }
}

public boolean isConnected(int x, int y) {
    return find(x) == find(y);
}

在 find 方法中,我们使用了路径压缩优化,将每个节点直接连接到其根节点。这样,在下次查询时,就能达到更快的查询速度。

在 union 方法中,我们将两个节点所在的集合合并。具体来说,我们将其中一个节点的根节点指向另一个节点的根节点,从而将两个集合合并成一个集合。

在 isConnected 方法中,我们判断两个节点是否在同一个集合中。具体来说,我们比较两个节点的根节点是否相同,如果相同则说明这两个节点在同一个集合中。否则,它们在不同的集合中。

示例说明

示例一

假设原本有三个元素:0,1,2,它们分别在三个不同的集合中。

UnionFind uf = new UnionFind(3);
System.out.println(uf.isConnected(0, 1)); // false
System.out.println(uf.isConnected(1, 2)); // false
System.out.println(uf.isConnected(0, 2)); // false

现在,我们将元素0和元素1合并到同一个集合中。

uf.union(0, 1);
System.out.println(uf.isConnected(0, 1)); // true
System.out.println(uf.isConnected(1, 2)); // false
System.out.println(uf.isConnected(0, 2)); // true

现在,元素0和元素1在同一个集合中,元素2在另一个集合中。

示例二

假设原本有五个元素:0,1,2,3,4,它们分别在五个不同的集合中。

UnionFind uf = new UnionFind(5);
System.out.println(uf.isConnected(0, 1)); // false
System.out.println(uf.isConnected(1, 2)); // false
System.out.println(uf.isConnected(0, 2)); // false
System.out.println(uf.isConnected(3, 4)); // false

现在,我们将元素0和元素1合并到同一个集合中,将元素3和元素4合并到同一个集合中。

uf.union(0, 1);
uf.union(3, 4);
System.out.println(uf.isConnected(0, 1)); // true
System.out.println(uf.isConnected(1, 2)); // false
System.out.println(uf.isConnected(0, 2)); // true
System.out.println(uf.isConnected(3, 4)); // true

现在,元素0和元素1在同一个集合中,元素2在另一个集合中,元素3和元素4在同一个集合中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java实现数据结构之并查集 - Python技术站

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

相关文章

  • 浅析Java 数据结构常用接口与类

    浅析 Java 数据结构常用接口与类 本文主要介绍 Java 中常用的数据结构接口和类,可以帮助读者了解和掌握常见的数据结构以及它们的实现方式,从而在日后的开发中使用它们,提高代码的效率和质量。 List 接口 List 接口是 Java 中常用的数据结构接口之一,它代表了一个有序的集合,集合中的每一个元素都可以通过其索引进行访问。List 接口的一些常用方…

    数据结构 2023年5月17日
    00
  • C语言数据结构 快速排序实例详解

    C语言数据结构 快速排序实例详解 什么是快速排序? 快速排序(Quicksort)是一种采用分治法(Divide and Conquer)的排序算法,通过将一个大问题逐步分解为小问题来解决的一种工具。 快速排序是一个比较快的排序算法,在平均状况下,排序n个项目要 O(n log n) 次比较,最坏情况下需要O(n^2)次比较,但这种状况并不常见。 快速排序算…

    数据结构 2023年5月17日
    00
  • Java性能优化之数据结构实例代码

    Java性能优化之数据结构实例代码攻略 本篇攻略主要介绍Java性能优化之数据结构实例代码的相关内容,包括数据结构的优化方法以及示例代码等。我们使用以下两个示例来说明性能优化的过程和方法。 示例1:字符串拼接 在Java中字符串拼接通常使用”+=”方式,但是在循环中频繁地使用该操作会导致性能问题。这时可以使用StringBuilder类的append()方法…

    数据结构 2023年5月17日
    00
  • 数据结构 – 绪论

    01.绪论 1. 概念 1.1 数据结构 数据 Data:信息的载体。能被计算机识别并处理的符号的集合。 数据元素 Data element:数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元素往往由若干数据项组成。数据项是组成数据元素的不可分割的最小单位。 如学生的信息记录就是一个数据元素,它由学号、姓名、性别等组成。 数据对象 Data obje…

    算法与数据结构 2023年4月18日
    00
  • C++高级数据结构之二叉查找树

    C++高级数据结构之二叉查找树 什么是二叉查找树 二叉查找树,也称二叉搜索树(BST,Binary Search Tree),是一种常见的基于二叉树的数据结构,主要用于快速查找与排序。在二叉查找树上,左子树的每个节点都比其根节点小,右子树的每个节点都比其根节点大,同时整棵树也满足二叉树的性质。 二叉查找树的实现 我们可以通过C++语言实现二叉查找树的基本操作…

    数据结构 2023年5月17日
    00
  • 数据结构与算法大作业:走迷宫程序(C语言,DFS)(代码以及思路)

    好家伙,写大作业,本篇为代码的思路讲解   1.大作业要求 走迷宫程序 问题描述: 以一个 m * n 的长方阵表示迷宫, 0和1分别表示迷宫的通路和障碍。 设计一个程序, 对任意设定的迷宫, 求出一条从入口到出口的通路, 或得出没有通路的结论。 基本要求: (1) 实现一个以链表做存储的栈类型, 然后编写一个求解迷宫的非递归程序。 求的通路以三元组(i, …

    算法与数据结构 2023年5月9日
    00
  • 数据结构C语言链表的实现介绍

    数据结构C语言链表的实现介绍 1. 什么是链表? 链表是一种常见的数据结构,它由一系列的节点(Node)通过链接(Link)组成,每个节点包含两个部分:数据域(Data)和指针(Pointer),数据域用来存储数据,指针用来链接下一个节点。链表最重要的优点就是支持动态扩展,占用内存比较灵活,相比于数组,链表在增加和删除元素时更加高效。 2. 链表的实现 链表…

    数据结构 2023年5月17日
    00
  • C语言数据结构中定位函数Index的使用方法

    C语言的数据结构中,定位函数Index的使用方法主要涉及到数组和指针的相关操作。Index函数的作用是在数组中查找对应的元素,返回该元素的索引位置。以下是详细攻略: 一、Index函数的用法 Index函数的原型如下: void *index(const void *s, int c, size_t n); 其中,参数含义如下: s: 要查找的数组 c: 要…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部