我正在寻找支持联盟功能的不相交集。
树木减高技术:
我们总是将较小的树合并到较大的树上,即我们使较小树的根指向较大树的根。
如果一棵树有更多的节点,它就比另一棵树大。
每个节点都是一个带有字段的结构体:元素的一些信息、指向父节点的指针“parent”和一个计数器“count”,仅当节点是根节点并且包含在上树。
以下算法合并两个向上树:
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 分别为主要和次要散列函数。A 包含上述所有树的节点的键,以及指向每个树的相应节点的指针。我想编写一个算法,将两个节点的键作为参数并合并节点所属的向上树(节点可以属于任何向上树,即使在这种情况下,它也会出现适当的消息) . 在合并时,我们应该应用路径压缩和高度降低的技术。
你能给我一个提示,我们怎么能做到这一点?
假设我们有这个数组:
一开始的节点会是这样的:
那么如果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 我们得到: