并查集

应用范围:

一开始我有n个集合,这个集合可以先理解为数学上的集合,每个节点都首先自成一个集合,n个节点就相当于有n个集合。并查集支持的操作:你想查两个节点是否来自同一个集合,或者想合并两个集合

前提:

每个节点必须先自成一个集合,所有点必须建立一个集合

优点:

如果你有n个节点,你想查两个节点是否来自于一个集合的操作数(操作发生的次数),例如你想查两个节点是否来自于一个集合的操作次数是k,集合合并的次数为f,并且k(次数)+f(次数)是O(n),并查集的操作次数是O(n),平均查询和合并的时间复杂度为O(1)

递归过程解析


image.png

代码:

public static class Node {
        // whatever you like
    }

    public static class DisjointSets {
        public HashMap<Node, Node> fatherMap;
        public HashMap<Node, Integer> rankMap;

        public DisjointSets() {
            fatherMap = new HashMap<Node, Node>();
            rankMap = new HashMap<Node, Integer>();
        }

        public void makeSets(List<Node> nodes) {
            fatherMap.clear();
            rankMap.clear();
            for (Node node : nodes) {
                fatherMap.put(node, node);
                rankMap.put(node, 1);
            }
        }

        public Node findFather(Node n) {
            Node father = fatherMap.get(n);
            if (father != n) {
                father = findFather(father);
            }
            fatherMap.put(n, father);
            return father;
        }

        public void union(Node a, Node b) {
            if (a == null || b == null) {
                return;
            }
            Node aFather = findFather(a);
            Node bFather = findFather(b);
            if (aFather != bFather) {
                int aFrank = rankMap.get(aFather);
                int bFrank = rankMap.get(bFather);
                if (aFrank <= bFrank) {
                    fatherMap.put(aFather, bFather);
                    rankMap.put(bFather, aFrank + bFrank);
                } else {
                    fatherMap.put(bFather, aFather);
                    rankMap.put(aFather, aFrank + bFrank);
                }
            }
        }

    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.问题描述: 有N个对象,对象间可以连通。假设有一个命令用来连接两个对象,将两个对象传入该命令就会连接两者,还有...
    luckygong阅读 1,139评论 0 0
  • 某次参加笔试的最后一题大意如下:给定一组用户[0..n],以及他们之间的好友关系,问这些好友构成了多少个朋友圈?例...
    Realizability阅读 1,704评论 0 0
  • 什么是并查集? 并查集是一种树型的数据结构,常用于处理一些不相交集合(Disjoint Sets)的合并及查询问题...
    passwd_阅读 452评论 0 1
  • [本文新址: http://www.ahathinking.com/archives/10.html ] 并查集:...
    lintong阅读 597评论 0 1
  • 这是一个平平常常的暑假,看着这个暑假就要向往常一样平淡结束了。战狼2就这么出现在我们面前,轻轻松松它就要成为中国票...
    超级186阅读 324评论 0 0

友情链接更多精彩内容