FIND-SET(x) - 返回代表或指向包含元素x的集合的代表的指针。
在算法中,find-set(x)用于不相交的数据结构。我不明白这个功能的用途。假设我有一个包含4个顶点的图形,a,b,c,d,权重为ab = 4,bc = 5,cd = 6 ... find-set(u)!= find-set(v) )(其中u,v是图的任何顶点)帮助我定义图中循环的出现!查找定义为:
function Find(x)
if x.parent == x
return x
else
return Find(x.parent)
答案 0 :(得分:2)
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)
和(b, c)
。由于集合中有多个元素,我们首先通过Find-Set(x)
确定是否需要边缘。如果Find-Set(b) == Find-Set(c)
那么我们知道我们有一个周期,即A == B
。幸运的是,我们不会在(b, c)
或A=(a, b)
集合中发生B=(c, d)
。现在我们像往常一样合并它们并到达我们的MST,这是一个集合:A=(a, b, c, d)
(注意B已被删除!)。
回想一下我们的额外优势,现在是一个循环。如果我们尝试添加(d, c)
,我们会发现d
和c
所在的集合相同,即Find-Set(d) == Find-Set(c)
或A == A
,因为d
}和c
都在集合A
中。因此,我们可以确定此边缘会创建一个循环!