Union-Find の基本
algorithmdata-structuresundergraduatelecture
data/lecture/information/algorithm/data-structures/tree-and-heap-basics.lecture.n.md
data/lecture/information/graph/graph-basics.lecture.n.md
1導入
この講義では、互いに素な集合族が定める分割を定義し、find と union を提供する Union-Find の表現および計算量を説明する。
2素集合分割と操作
集合 U の分割とは、空でない部分集合族 \mathcal P であって、異なる二集合が互いに素であり、その和集合が U となるものである。Union-Find(disjoint-set union)は、この分割に対して次の操作を提供する。
- \operatorname{find}(x) は、x を含む集合に割り当てられた代表元を返す。同一集合の要素は同一の代表元をもち、\operatorname{find}(x)=\operatorname{find}(y) と x,y が同一集合に属することは同値である。
- \operatorname{union}(x,y) は、x と y を含む二集合を一集合へ併合する。既に同一集合なら分割を変更しない。
初期状態では、各要素が一要素集合を構成するものとする。Union-Find は集合の併合を処理するが、集合の分割や要素の削除は標準操作に含まれない。
find と union の引数は U の要素であることを事前条件とする。U=\varnothing の場合、初期分割は空族であり、有効な find または union の呼出しは存在しない。
3親の森による表現
各集合を根付き木で表現し、全体を根付き木の森として保持する。各要素 x は親 \operatorname{parent}[x] をもち、根 r では \operatorname{parent}[r]=r とする。根がその集合の代表元である。find は親を反復的に参照して根へ到達し、union は二つの根の一方を他方の子にする。
3.1経路圧縮
find の実行中に参照した各頂点の親を根へ変更する方法を経路圧縮という。分割と代表元を変更せず、後続する find の親参照回数を削減する。
3.2ランクによる併合
根に木の高さの上界を表すランクを保持し、union で小さいランクの根を大きいランクの根の子にする。同一のランクなら一方を子にし、新しい根のランクを 1 増加させる。経路圧縮後のランクは実際の高さと一致するとは限らないが、併合規則に使用できる。
4計算量と適用範囲
配列要素の参照と更新を O(1) とする計算模型を仮定する。n 個の一要素集合の初期化と、経路圧縮およびランクによる併合を併用した m 回の find・union からなる操作列の総時間には、標準的な簡略上界 O((n+m)\alpha(n)) を使用できる。ここで \alpha は逆 Ackermann 関数である。より精密な表記では、その引数を n と m の双方から定める。この評価は操作列全体に対するならし計算量であり、各操作の最悪時間が定数であることを意味しない。記憶領域は O(n) である。
無向グラフへ辺を追加する際に両端点を union すれば、find の代表元の比較によって連結性を管理できる。ただし、Union-Find は連結経路や最短路を復元せず、辺の削除を直接には処理しない。