Union-Find 只是一种让您保持谁是某个集合的“领导者”的方法。
例如,假设您有 5 个人 A、B、C、D、E。
最初,每个都从自己的集合开始,因此您可以像这样编写代码:
for each person in people:
parent[person] = person
这样,您可以将每个人都设置为自己集合的领导者。
这应该是这样的:
{A} {B} {C} {D} {E}
我们需要的第一个操作是能够找到一个集合的领导者,这个操作被称为find
。
然后我们陷入了一个属性:领导者是其自己的父母。
有两种可能性,或者这个人是它自己的父母,或者不是。
如果是,那么它就是该集合的领导者。
如果不是,那么我们将向它的父级询问同样的事情(如果它是它自己的父级),这样就可以了。
你可以这样编码:
find_leader_of(person P){
if(parent[P] == P) return P
else return find_leader_of(parent[P])
}
然后我们进行union
操作,无非是在一组中转 2 个不相交的组。
假设你有这种情况:
{A, B} {C, D} {E}
而你做到union(B, D)
了,那么会发生什么?
首先你需要找到两组的领导者:
fst_leader = find_leader_of(B)
snd_leader = find_leader_of(D)
然后你选择这些领导者中的任何一个作为另一个领导者:
parent[snd_leader] = fst_leader
这导致:
union(person P1, person P2){
fst_leader = find_leader_of(P!)
snd_leader = find_leader_of(P2)
parent[snd_leader] = fst_leader
}
还有其他改进 union-find 的方法和其他方法来选择谁将成为谁的领导者,但这是您必须了解的基础知识,以便了解 union-find 是关于什么的。