Data structures 是否有执行查找、并集和反并集的良好数据结构?

Data structures 是否有执行查找、并集和反并集的良好数据结构?,data-structures,baduk,Data Structures,Baduk,我正在寻找一种数据结构,它可以相当有效地支持联合、查找和反联合(所有内容至少为O(logn)或更好),因为标准的不相交集结构不支持反联合。作为背景,我正在用MCTS[编写Go AI,这将用于跟踪在回溯过程中连接和断开连接的石头组。我认为这可能会更容易,因为反联合不是在集合中的某个任意对象上,而是始终是最新联合的“撤销” 我已经通读了下面的文章,虽然我可以完成提议的数据结构,但它似乎有点过火,需要一段时间才能实现 当然,虽然O(a(n))会很好,但我很确定路径压缩不会与反并集一起工作,而且我很乐

我正在寻找一种数据结构,它可以相当有效地支持联合、查找和反联合(所有内容至少为O(logn)或更好),因为标准的不相交集结构不支持反联合。作为背景,我正在用MCTS[编写Go AI,这将用于跟踪在回溯过程中连接和断开连接的石头组。我认为这可能会更容易,因为反联合不是在集合中的某个任意对象上,而是始终是最新联合的“撤销”

我已经通读了下面的文章,虽然我可以完成提议的数据结构,但它似乎有点过火,需要一段时间才能实现


当然,虽然O(a(n))会很好,但我很确定路径压缩不会与反并集一起工作,而且我很乐意使用O(logn)。我的直觉告诉我一个解决方案可能与堆有关,但我还没有弄明白任何事情。

您所描述的有时被称为联合查找拆分问题,但大多数现代数据结构(或者至少是我所知道的那些)都是这样的通常以不同的方式看待此问题。将每个元素都视为林中的一个节点。然后,您希望能够在操作下维护林

  • 链接(x,y),用于添加边(x,y)
  • 查找(x),它返回包含x的树的代表性节点,以及
  • 剪切(x,y),将边从x剪切到y
这些数据结构通常被称为动态树或链接切割树。据我所知,没有任何有效的数据结构能够与标准union find数据结构的实现简单性相匹配。链接/切割树是两种可能对您的案例有用的数据结构(也称为Sleator Tarjan树或ST树)和Euler tour树(也称为ET树),两者都可以在时间O(log n)内执行上述所有操作


希望这有帮助!

可能会在CompSci SE获得更多关注。啊,我怎么会忘记链接/砍树!非常感谢,我也会给ET树看一看。