Union の機能をサポートするばらばらのセットを検討しています。
木の高さを減らすテクニック:
常に小さいツリーを大きいツリーにマージします。つまり、小さいツリーのルートが大きいツリーのルートを指すようにします。
より多くのノードがある場合、ツリーは他のツリーよりも大きくなります。
各ノードは、フィールドを持つ構造体です。要素に関する情報、親ノードへのポインタ「親」、およびノードがルートである場合にのみ使用され、ノードの数を含むカウンター「カウント」です。アップツリー。
次のアルゴリズムは、2 つのアップ ツリーをマージします。
pointer UpTreeUnion(pointer S,T) {
if (S == NULL OR P == NULL) return;
if (S->count >= T->count) {
S->count = S->count + T->count;
T->parent = S;
return S;
}
else {
T->count = T->count + S->count;
S->parent = T;
return T;
}
}
最大で k 個の素集合が存在する可能性がある、和集合を使用した素集合の実装を考えてみましょう。この実装では、ハッシュ テーブル A[0.. max-1] を使用します。このテーブルには、順序付けられた二重ハッシュ法に基づいてキーが格納されます。h1 と h2 をそれぞれ 1 次ハッシュ関数と 2 次ハッシュ関数とします。A には、上記のすべてのツリーのノードのキーと、それぞれに対応するノードへのポインターが含まれています。パラメータとして 2 つのノードのキーを取り、ノードが属するアップ ツリーをマージするアルゴリズムを書きたいです (ノードは任意のアップ ツリーに属することができますが、同時にその場合は適切なメッセージが表示されます)。 . 合流時には、パスの圧縮と高さの削減の手法を適用する必要があります。
どうすればこれを行うことができるか、ヒントを教えていただけますか?
次の配列があるとします。
最初は、ノードは次のようになります。
次に、k1=100、k2=5 の場合、アルゴリズムを適用した後、これが得られるでしょうか?
次に、k1=59、k2=5 の場合、次のようになります。
右?次に、パス圧縮を適用して、これを開始します。
tmp=B
while (B->parent!=B)
parent=B->parent;
tmp->parent=B;
tmp=parent;
}
したがって、parent=F、tmp->parent=B、tmp=F となります。
どうやって続けますか?
k1=14、k2=59 とすると、次のようになります。