支持删除的不相交集数据结构
Posted
技术标签:
【中文标题】支持删除的不相交集数据结构【英文标题】:Disjoint set data structure supporting deletion 【发布时间】:2012-10-02 11:47:27 【问题描述】:假设我们有一组 n 个不相交的节点 node1,node1,...,noden
以下3种操作最快的数据结构和算法是什么:
Union(x,y):在nodex和nodey之间添加一条无向边,两个节点之间最多可以有一条边.
IsConnected(x,y):如果 nodex 和 nodey 直接或间接连接,则返回 true,即 nodex 和 nodey 在同一个连通分量中。
Un-union(x,y):如果节点x和节点y之间的边存在,则删除它。
不相交集对于前两个操作是一个完美的数据结构,但它不能直接支持第三个操作。有什么选择?
如果我们模拟这个过程,第一个和第三个操作可以在O(1)中实现,但第二个操作是O(n),所以我想看看是否有可能让所有三个操作都在O( logn) 时间或更短。
【问题讨论】:
【参考方案1】:Link/cut tree 可以在 O(log N) 时间内执行这 3 个操作。
您可以在本书中阅读有关链接/切割树和相关数据结构的信息:"Handbook of Data Structures and Applications"(第 35 章)。
链接/切割树不允许在已经(间接)连接的节点之间添加边。如果您需要“Union(x,y)”操作来支持这一点,问题会变得更加复杂,您可以将其解决为无向图中的动态连通性问题。 (参见同一本书中的第 36.4 章或this pdf)。在这种情况下,插入/删除复杂度增加到 O(log2 N)。
【讨论】:
很好的参考!这个数据结构其实我听说过一次,但是我很难理解,我看看这次能不能搞定。【参考方案2】:Kaplan, Shafrir and Tarjan 提出了一种通用技术,通过增量重建向联合查找数据结构添加删除,并显示删除需要 O(t_f(n) + t_i(n)) 分别是查找和插入节点的成本.总体思路是保持每个集合中已删除项目的数量,并在该数量达到一定阈值时重建集合。
Alstrup ,Gørtz , Rauhe, Thorup and Zwick 展示了如何通过注意树中的哪些元素占用以及哪些空置和“整理”来在恒定时间内实现删除 删除操作后的树。
【讨论】:
以上是关于支持删除的不相交集数据结构的主要内容,如果未能解决你的问题,请参考以下文章