ユニオン検索は、あなたが誰かをいくつかのセットの「リーダー」に保つための単なる方法です。
あなたはこのようにそれをコーディングすることができますので、たとえば、あなたは5人A、B、C、D、E
があると最初はそれぞれが、独自のセットで開始:
for each person in people:
dad[person] = person
この方法で、すべての人を自分のセットのリーダーにすることができます。
これは、それがどのように見えるかされています
{A} {B} {C} {D} {E}
私たちが必要とする最初の操作は、セットのリーダーを見つけることができるようにすることであり、この操作はfind
と呼ばれています。
私たちはプロパティになります:リーダーは自分のお父様である人です。
2つの可能性がありますが、その人は自分の父親か、そうでない人です。
あれば、セットのリーダーです。
もしそうでなければ、私たちは同じことを(それが自分の父親であれば)父親に尋ねて行きます。
あなたはこのようにそれをコーディングすることができますし、我々はunion
操作を持って
find_leader_of(person P){
if(dad[P] == P) return P
else return find_leader_of(dad[P])
}
、それは一組だけで2つのdisjointsセットを回すよりも、より多くの何もありません。
は、あなたがこのような状況があるとします。
{A, B} {C, D} {E}
を、あなたがunion(B, D)
を行い、その後、何が起こりますか?
まずあなたが両方のセットのリーダーを見つける必要があります。
fst_leader = find_leader_of(B)
snd_leader = find_leader_of(D)
を、あなたは他のリーダーになるために、これらの指導者のいずれかを選択します。
dad[snd_leader] = fst_leader
と、これは、その結果:
union(person P1, person P2){
fst_leader = find_leader_of(P!)
snd_leader = find_leader_of(P2)
dad[snd_leader] = fst_leader
}
には、誰が誰のリーダーになるかを選ぶための組合発見や他の方法を改善するための他のアプローチがありますが、これは組合の発見が何であるかを知るために理解しなければならない基本です。