Find-Set(x)
在不相交的数据结构中最常用于实现最小生成树(MST)。
如果u
和v
在同一个集合中,则表示它们已经连接。如果它们已经连接,则在它们之间添加另一个连接会创建一个循环。
我们可以通过说所有顶点都在它们自己不同的单元素集中来开始分析这一点。当我们在两个顶点之间建立连接时,例如a-b
,然后我们将a
和b
放在同一个集合中。因此,我们需要确定它们如何在同一个集合中;因此,我们Find-Set(x)
用来确定它们是否在同一个集合中(在您的情况下,这是一个不相交的森林实现)。
您提供的示例没有循环,因此我将添加另一个边:
例子
最初,假设我们有一组顶点a
、b
和。我们想要确定最小生成树,以便将所有三个顶点连接到同一个森林的最小边数。c
d
现在可用的边缘:
(a, b)
, (c, d)
, (b, c)
, (d, c)
(额外的边缘是一个循环!)
这假设您知道顶点、边和森林的定义,它们都是基本的图术语
由于a
和b
目前是不同的集合,我们可以通过一种算法将它们组合起来,例如Merge-Set(a, b)
将它们放在同一个集合中:A=(a, b)
虽然仍然存在c
并且d
必须连接。注意这里A
是集合的名称
我们可以看到这(c, d)
也是可能的;所以,我们可以合并它们:B=(c, d)
我们也有(a, b)
. B
是这个不相交集的名称
现在我们可以合并A=(a, b)
并且B=(c, d)
知道我们有 edge (b, c)
。由于集合内有多个元素,我们首先通过 判断边是否必要Find-Set(x)
。如果Find-Set(b) == Find-Set(c)
那么我们知道我们有一个循环,即 if A == B
。幸运的是,我们没有,因为(b, c)
不会出现在 setA=(a, b)
或B=(c, d)
. 现在我们像往常一样合并它们并到达我们的 MST,它是一个集合:(A=(a, b, c, d)
注意 B 已被删除!)。
回想一下我们的额外优势,它现在是一个循环。如果我们尝试相加(d, c)
,我们会看到 whichd
和c
驻留的集合是相同的 ieFind-Set(d) == Find-Set(c)
或A == A
sinced
并且c
都在 set 中A
。因此,我们可以确定这条边创建了一个循环!