ユニオン并查集



解決する問題
  • 未知のカテゴリのn個の要素を指定し、与えられた規則に従って

  • ユニオン并查集

    定義

    Union Find is a data structure that keeps track of elements which are split into one or more disjoint sets.



    つの主要な活動
  • find(elem) : $ elem $が属するグループ/クラスを返します.
  • union(e1,e2) : つの要素を統一する

  • 複雑さ
    操作
    時間複雑度
    建設
    o ( n )
    同盟
    a ( n )
    見つける
    a ( n )
    コンポーネントのサイズ
    a ( n )
    接続チェック
    a ( n )
    コンポーネント
    o ( 1 )

  • 償却定数時間

  • 要素ノードの表現
  • 構造
  • #define MAX 10000
    struct Node
    {
        int data;       // 该元素保存的数据
        int rank;       // 以该元素为root形成的子树的高度
        int parent; // parent node
     }node[MAX];
    
  • アレイ
  • int set[max];//集合index的类别,或者用parent表示
    int rank[max];//集合index的层次,通常初始化为0
    int data[max];//集合index的数据
    
    //初始化集合
    void Make_Set(int i)
    {
        set[i]=i;//初始化的时候,一个集合的parent都是这个集合自己的标号。没有跟它同类的集合,那么这个集合的源头只能是自己了。
        rank[i]=0;
    }
    

    アルゴリズム
  • このセットを表すセット内のある要素を使用しますrepresentative element 集合の
  • 各セットは、representative element がセットされ、残りの要素が子要素である.
  • parent(x) : 要素の親ノードを返すx .
  • parent(root) = root
  • find(x) 要素のグループ/set/クラスを返すx , ==どれが本質的にはrepresentative element このグループの/set/class ==
  • 私たちは木の構造をparent(x) ルートノードに到達するまで.
  • union(e1,e2) :
  •   # to unify two elements, first find their roots
      root1 = root of e1
      root2 = root of e2
    
      # if roots are different, let one be the parent of the other
      if root1 == root2:
        return
      else:
        parent[root1] = root2 / parent[root2] = root1
    
  • つのサブツリー/コレクションをマージするときに、より小さい高さでrank 子として、木からの退化を防ぐために.