【发布时间】:2011-01-16 10:43:33
【问题描述】:
刚研究了disjoint set数据结构,知道它也叫“union-find数据结构”,union和find是这个数据结构的两个主要操作。我们可以对不相交的集合进行并集,类似地我们可以进行查找操作;我想知道除了 union 和 find 之外,我们还可以对不相交的集合执行哪些其他操作。
【问题讨论】:
标签: algorithm data-structures disjoint-sets
刚研究了disjoint set数据结构,知道它也叫“union-find数据结构”,union和find是这个数据结构的两个主要操作。我们可以对不相交的集合进行并集,类似地我们可以进行查找操作;我想知道除了 union 和 find 之外,我们还可以对不相交的集合执行哪些其他操作。
【问题讨论】:
标签: algorithm data-structures disjoint-sets
union-find 不相交集结构的重点不在于执行基本集合操作,正如您的问题和其他受访者所暗示的那样。相反,它是关于成为某些算法所需结构的高效实现。特别是,查找连通分量和最小生成树在 union-find 不相交集之上构建了它们最有效的实现。
【讨论】:
使用 vanilla union-find 数据结构,您无法枚举实际集合,因此许多集合操作不可用。这是因为在香草版本中,您只有一个方向的指针 --- 在下图中,每条对角线对应一个向上的箭头,而根(顶线)是集合的根对象:
o [set1] o [Set2]
/ \ \
o o o
/
o
所以没有办法找到集合 1 的所有对象;例如,您无法从根节点跟踪到它们的路径。你也可以有向下的指针,但这会使数据结构变得非常复杂,因为一个对象在数据结构中可以有任意数量的父对象。
所以实际上主要是针对以下操作:
为了详细说明这一点,联合集数据结构对于它支持的操作具有非常低的时间复杂度;合并集合和回答同一个集合的查询都需要摊销常数时间(O(1));由于这种时间复杂度,你不能支持所有的集合操作。例如,标准集表示是由 [binary] 搜索树,其中大多数操作至少具有 O(log n) 复杂度。
【讨论】:
不相交集结构也称为“并集结构”。所以无论如何都应该支持union、find 和MakeSet 操作。其他操作并不是这个结构的全部内容,是否支持它们取决于实现和您的目标。有时您需要专门选择特定的实现来满足您的项目对额外操作的需求。
除此之外,如果我们支持其他与集合相关的基本操作就好了。让我们列举一下:
find 的结果。【讨论】: