【ユニオンファインド】
Union-Find とは?
💡 「キミとボク、同じチームだよね?」を一瞬で答えるデータ構造
📌 このページのポイント
Union-Findって何に使うの?
たとえば学校のクラス替えを想像してみて。「AさんとBさんは同じグループ?」を一瞬で答えられて、「CさんのグループとDさんのグループを合体!」もすぐできる仕組みだよ
FindとUnionって名前のまんまなんだね。でもリストとかで管理するだけじゃダメなの?
素朴にやると全員のグループ番号を書き換えるのにO(n)かかっちゃう。Union-Findはツリー構造を使って、代表者(根)を辿るだけでグループが分かるから圧倒的に速いんだよ
ツリーが深くなったら遅くなりそうだけど…
そこで「経路圧縮」というテクニックを使うんだ。Findのときにたどった要素を全部直接根につなぎ直す。次からは一発で根にたどり着けるようになるよ
賢い!実際どんな場面で使われるの?
計算量はどのくらい速いの?
経路圧縮とランクによる併合を両方使うと、m回の操作でO(m α(n))になる。α(n)はアッカーマン関数の逆関数で、実質的に4以下。つまりほぼ定数時間と思っていいレベルだよ
まとめ:ざっくりこれだけ覚えればOK!
「Union-Find」って出てきたら「グループ分けを超高速で管理する仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「Union-Find (Disjoint Set Union)」 = 和集合-検索(素集合の統合)
💬 Union(統合する)とFind(見つける)という2つの操作がそのまま名前になっているよ。別名の Disjoint Set Union(DSU)は「互いに重ならない集合の統合」という意味だよ