假设我们有一组n个不相交的节点{node 1 ,node 1 ,...,node n }
以下3个操作的最快数据结构和算法是什么:
Union(x,y):在节点 x 和节点 y 之间添加一个无方向的边,两个节点之间最多只能有一条边
IsConnected(x,y):如果节点 x 和节点 y 直接或间接连接,则返回true,即node x 和节点 y 属于同一个连接组件。
取消联合(x,y):删除节点 x 和节点 y 之间的边缘(如果存在)。
Disjoint-set是前两个操作的完美数据结构,但它不能直接支持第3个操作。有什么替代方案?
如果我们模拟过程,第一个和第三个操作可以在O(1)中实现,但第二个操作是O(n),所以我想看看是否可以在O中运行所有三个操作( logn)时间或更短。
答案 0 :(得分:7)
Link/cut tree可以在O(log N)时间内执行这3个操作。
您可以阅读本书中的链接/剪切树及相关数据结构:"Handbook of Data Structures and Applications"(第35章)。
链接/剪切树不允许在已经(间接)连接的节点之间添加边缘。如果你需要" Union(x,y)"为支持这一操作,问题变得更加复杂,您可以将其解决为无向图中的动态连接问题。 (参见同一本书中的第36.4章或this pdf)。在这种情况下,插入/删除复杂性增加到O(log 2 N)。
答案 1 :(得分:5)
Kaplan, Shafrir and Tarjan提出了通过增量重建向联合查找数据结构添加删除的一般技术,并且显示删除需要O(t_f(n)+ t_i(n)),这是查找和插入节点的成本, 分别。一般的想法是在每个集合中保留已删除项目的数量,并在此数量达到特定阈值时重建集合。
Alstrup ,Gørtz , Rauhe, Thorup and Zwick通过指出树中的哪些元素被占用以及空置和“整理”来显示如何在固定时间内实现删除 删除操作后的树。