【ユニオンファインド】

Union-Find とは?

最終更新:
💡 「同じチーム?」の確認と、チームの合体を手早く

要素を重ならないグループに分け、同じグループかの確認とグループの統合を行うデータ構造。代表をたどる木に、経路圧縮などを組み合わせて効率化する。

📌 このページのポイント
Find(C):通った経路を短くするFind(C)の前ABEDC経路圧縮した後ABEDCCの親はAに。Dの親はBのまま同じグループのまま、道順だけを短く
線は親子関係です。完全な経路圧縮の例で、今回たどっていないDまで根につなぎ直してはいません。
ひよこ ひよこ
Union-Findって、何ができるの?
ペンギン先生 ペンギン先生
最初は一人ずつ別のチームにして、必要に応じて合体させるイメージだよ。Findでチームの代表を調べ、二人の代表が同じなら同じチームと分かる。Unionは、その二人が属するチームを一つにまとめる操作なんだ。
ひよこ ひよこ
どうやって代表を覚えるの?
ペンギン先生 ペンギン先生
各要素が親を持つ木を使う方法があるよ。親をたどって着く根が代表なんだ。チームを合体するときは、一方の根をもう一方につなぐ。サイズやランクを使って併合すれば、木が深くなりすぎるのを抑えられるよ。
ひよこ ひよこ
経路圧縮って何?
ペンギン先生 ペンギン先生
Findで根を探すとき、通った経路を短くする工夫だよ。図の完全な経路圧縮では、CからBを経由してAに着いた後、Cの親をAにする。今回は通っていないDの親はBのまま。グループ全員を一度に根へつなぎ直す操作ではないよ。
ひよこ ひよこ
どのくらい速いの?
ペンギン先生 ペンギン先生
経路圧縮とサイズやランクによる併合を組み合わせると、多数の操作をまとめて見た1操作当たりの計算量は償却O(α(n))になるよ。αはとてもゆっくり増える関数なので、実用上はほぼ定数のように扱われる。ただし、すべての1回の操作が最悪でもO(1)という意味ではなく、初期化の費用も別にあるんだ。
ひよこ ひよこ
一度合体したチームを、また分けられる?
ペンギン先生 ペンギン先生
基本のUnion-Findには、分割や要素削除の操作はないよ。つながる辺を追加しながらグループを管理するような場面に向いている。クラスカル法でも、辺の両端が同じグループかを調べ、違うときに統合することで閉路を避けるんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Union-Find」って出てきたら「同じグループかの確認と、グループの合体を効率よく行う仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Union-Find (Disjoint Set Union)」 = 和集合-検索(素集合の統合)
💬 Union(統合する)とFind(見つける)という2つの操作がそのまま名前になっているよ。別名の Disjoint Set Union(DSU)は「互いに重ならない集合の統合」という意味だよ

参考資料

← 用語集にもどる