【ユニオンファインド】
Union-Find とは?
最終更新:
💡 「同じチーム?」の確認と、チームの合体を手早く
要素を重ならないグループに分け、同じグループかの確認とグループの統合を行うデータ構造。代表をたどる木に、経路圧縮などを組み合わせて効率化する。
📌 このページのポイント
- Findは要素の所属グループの代表を求める
- Unionは二つの要素が属するグループを統合する
- 経路圧縮は、探すときに通った経路を短くする
- 基本のUnion-Findは、統合したグループの分割には対応しない
Union-Findって、何ができるの?
最初は一人ずつ別のチームにして、必要に応じて合体させるイメージだよ。Findでチームの代表を調べ、二人の代表が同じなら同じチームと分かる。Unionは、その二人が属するチームを一つにまとめる操作なんだ。
どうやって代表を覚えるの?
各要素が親を持つ木を使う方法があるよ。親をたどって着く根が代表なんだ。チームを合体するときは、一方の根をもう一方につなぐ。サイズやランクを使って併合すれば、木が深くなりすぎるのを抑えられるよ。
経路圧縮って何?
Findで根を探すとき、通った経路を短くする工夫だよ。図の完全な経路圧縮では、CからBを経由してAに着いた後、Cの親をAにする。今回は通っていないDの親はBのまま。グループ全員を一度に根へつなぎ直す操作ではないよ。
どのくらい速いの?
一度合体したチームを、また分けられる?
基本のUnion-Findには、分割や要素削除の操作はないよ。つながる辺を追加しながらグループを管理するような場面に向いている。クラスカル法でも、辺の両端が同じグループかを調べ、違うときに統合することで閉路を避けるんだ。
まとめ:ざっくりこれだけ覚えればOK!
「Union-Find」って出てきたら「同じグループかの確認と、グループの合体を効率よく行う仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Union-Find (Disjoint Set Union)」 = 和集合-検索(素集合の統合)
💬 Union(統合する)とFind(見つける)という2つの操作がそのまま名前になっているよ。別名の Disjoint Set Union(DSU)は「互いに重ならない集合の統合」という意味だよ