栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

并查集及Java实现

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

并查集及Java实现

概述:
并查集(UnionFindSet)是一种树形数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题,在使用中常常以森林来表示。
常见的操作有合并两个集合、查找某元素属于哪个集合、判断两个元素是否属于同一个集合。

基本操作:
初始化(makeSet):把每一个元素初始化为一个集合,即将每个元素的父结点初始化为自己

public void makeSet() {
        for (int i = 0; i < this.n; i++) {
            this.parent[i] = i;
            this.rank[i] = 0;
        }
    }

查找(findSet):查找一个元素所在的集合。在执行查找操作时,要沿着父结点指针一直找下去,直到找到树根为止

public int findSet(int x) {
        if (x == parent[x]) {
            return parent[x];
        }
        return parent[x] = findSet(parent[x]);
    }

合并两个集合(unionSet):将一个集合的祖先作为另一个集合的祖先。
两种优化策略,

  1. 按秩合并,合并的时候将集合的祖先的高度(秩)低的合并到集合的祖先的高度(秩)高的中,这样合并之后树的高度会相对较小

  1. 路径压缩,当经过“递推”找到祖先结点后,“回溯”的时候顺便将它的子孙结点都直接指向祖先

完整代码如下,

public class UnionFindSet {

    private int n;
    private int[] parent;
    private int[] rank;

    public UnionFindSet(int n) {
        this.n = n;
        this.parent = new int[n];
        this.rank = new int[n];
    }

    public void makeSet() {
        for (int i = 0; i < this.n; i++) {
            this.parent[i] = i;
            this.rank[i] = 0;
        }
    }

    public int findSet(int x) {
        if (x == parent[x]) {
            return parent[x];
        }
        return parent[x] = findSet(parent[x]);
    }

    public void unionSet(int x, int y) {
        x = findSet(x);
        y = findSet(y);
        if (x == y) {
            return;
        }
        if (rank[x] > rank[y]) {
            parent[y] = x;
        } else {
            parent[x] = y;
            if (rank[x] == rank[y]) {
                rank[y]++;
            }
        }
    }

}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/692840.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号