前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >认识并查集结构

认识并查集结构

作者头像
名字是乱打的
发布2022-05-13 09:46:11
3160
发布2022-05-13 09:46:11
举报
文章被收录于专栏:软件工程
查集结构类似于多叉树

并查集结构功能:

  • 查看两个元素是否属于同一集合(拥有相同根结点的属于统一集合)
  • 合并两个元素所在集合为一个大集合

并查集结构实现

查看两个元素是否属于同一集合即查看根节点是否是同一个 优化: 查看过程将沿途非根结点的结点最后直接挂在根结点上

合并两个元素所在集合为一个大集合 只要将小集合元素的根的父从原来的指向自己到现在指向大集合的根即可

代码
代码语言:javascript
复制
package com.algorithm.practice;

import javafx.scene.Parent;

import java.util.HashMap;
import java.util.List;
import java.util.Stack;

class  Node{

}

public  class UnionFindSet {
    HashMap<Node,Node> fatherMap; //存结点和该结点的父节点
    HashMap<Node,Integer> sizeMap;//存结点和结点的后挂结点数量

    public UnionFindSet(List<Node> nodes){
          makeSets(nodes);
    }

    private void makeSets(List<Node> nodes) { //将每个结点
        fatherMap=new HashMap<>();
        sizeMap=new HashMap<>();
        for (Node node: nodes
             ) {
            fatherMap.put(node,node);
            sizeMap.put(node,1);
        }
    }
    public Node findRootFather(Node node){
        Stack<Node> stack=new Stack<>();
        Node cur=node;
        Node father = fatherMap.get(node);
        while (father!=cur){
            stack.push(cur);
            cur=father;
            father=fatherMap.get(cur);
        }

        while (!stack.isEmpty())
        {
            fatherMap.put(stack.pop(),father);
        }
        return father;
    }
    public boolean isSameSet(Node node1,Node node2){
        return findRootFather(node1)==findRootFather(node2);
    }

    public void  union(Node a,Node b){
        if (a==null||b==null){
            return;
        }
        Node ahead=findRootFather(a);
        Node bhead=findRootFather(b);
        if (ahead!=bhead){ //两者的根节点不一样才合并
            int aHeadSize=sizeMap.get(ahead);
            int bHeadSize=sizeMap.get(bhead);
            if (aHeadSize<=bHeadSize){
                //如果a的头下长度比b头下长度小,a合并到b链下
                fatherMap.put(ahead,bhead);
                sizeMap.put(bhead,bHeadSize+aHeadSize);
            }else
            {
                fatherMap.put(bhead,ahead);
                sizeMap.put(ahead,bHeadSize+aHeadSize);
            }

        }


    }



}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 并查集结构功能:
  • 并查集结构实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档