可以对不相交的集合执行哪些操作?

时间:2010-02-13 08:08:41

标签: algorithm data-structures disjoint-sets

我刚刚研究了不相交集数据结构,我知道它也被称为“联合查找数据结构”,union和find是这个数据结构的两个主要操作。我们可以在不相交集上执行并集,类似地我们可以执行查找操作;我想知道除了union和find之外我们可以在不相交集上执行的其他操作。

3 个答案:

答案 0 :(得分:3)

不相交集结构也称为“联合查找结构”。因此,无论如何都应支持unionfindMakeSet操作。其他操作不是这个结构的全部内容,它们是否受支持取决于实施和您的目标。有时您需要专门选择特定的实现以满足项目对其他操作的需求。

除此之外,如果我们支持其他与基本相关的基本操作,那将会很好。让我们列举一下:

  • 交集两套。由于集合是不相交的,除非这两个集合重合,否则它总是空的。
  • 联合两套 - 开箱即用。
  • 从集合中获取元素 - 支持,很可能是find的结果。
  • 从集合中删除元素 - 取决于实现。当集合实现为森林时,它很棘手并且需要更慢的额外操作。当集合实现为链表时,它很简单。
  • 枚举集合,即迭代给定集合中的每个元素。这个依赖于实现:对于链表而言,它很简单,对于类似森林的实现,它需要额外的结构来支持。

答案 1 :(得分:2)

使用vanilla union-find数据结构,您无法枚举实际集,因此很多set操作都不可用。这是因为在vanilla版本中你只有一个方向的指针---在下图中,每条对角线对应一个向上的箭头,而根(顶行)是这些集合的根对象:

     o [set1]         o [Set2]
    / \                \
   o   o                o
  /
 o

所以没有办法找到所有对象,例如,设置1;例如,您无法从根节点跟踪它们的路径。您也可以向下指向,但这会使数据结构变得非常复杂,因为对象在数据结构中可以有任意数量的父项。

所以它主要用于以下操作:

  • 答案:我的对象A和B是否属于同一组?
  • 合并设置S1和S2,以便集合中的所有对象现在都被视为属于同一集合

为了详细说明,union-set数据结构对于它支持的操作具有非常低的时间复杂度;合并集和回答同一集查询都采用摊销的常数时间(O(1));由于这种非常复杂的时间,你不能支持所有的设置操作。例如,标准集表示由[二进制]搜索树构成,其中大多数操作至少具有O(log n)复杂度。

答案 2 :(得分:0)

联合 - 发现不相交集合结构的重点不在于执行基本集合操作,因为您的问题和其他受访者似乎在暗示。相反,它是关于某些算法所需的结构的高效实现。特别是,找到连接组件和最小生成树可以在union-find不相交集之上构建最有效的实现。