并查集(Disjoint Set)学习笔记

概念

数据结构,它的以下两项运算非常高效

  • 判断两个元素是否属于相同的组
  • 合并两个组

思想:

  • 每个元素属于一个组
  • 每个元素有一个指向组长的“组指针”(通常为外部的 hashmap),组长的“组指针”为自己。
    • 通过对比两个元素的组长,可以快速判定它们是否同组
    • 通过修改组长的指针,可以快速合并两个组
  • 寻找组长的时候,需要递归到“组指针”为自己的元素,才找到真正的组长。
    • 递归过程中,将找到的组长更新到每个节点,这样今后的查找就被优化

示例代码

class DSUNode {
    DSUNode parent;
    List<DSUNode> children;

    public DSUNode(){
        children = new ArrayList<>();
    }

    public boolean isSameGroup(DSUNode node){
        DSUNode parent1 = this.parent == null ? this : this.parent;
        DSUNode parent2 = node.parent == null ? node : node.parent;

        return parent1 == parent2;
    }

    public void merge(DSUNode node){
        DSUNode parent1 = this.parent == null ? this : this.parent;
        DSUNode parent2 = node.parent == null ? node : node.parent;

        if(parent1.children.size()>parent2.children.size()){
            DSUNode temp = parent1;
            parent1 = parent2;
            parent2 = temp;
        }

        for(int i=0;i<parent2.children.size();i++){
            DSUNode child = parent2.children.get(i);
            parent1.children.add(child);
            child.parent = parent1;
        }

        parent1.children.add(parent2);
        parent2.parent = parent1;
    }
}

Copyright © 2024 Ming