是否存在执行查找,联合和取消联合的良好数据结构?

时间:2014-09-09 23:49:09

标签: data-structures baduk

我正在寻找一种能够相当有效地支持联合,查找和解除联合的数据结构(至少O(log n)或更好),作为标准的不相交集合结构不支持去联合。作为背景,我正在编写一个带有MCTS [http://en.wikipedia.org/wiki/Monte_Carlo_tree_search]的Go AI,这将用于跟踪连接时的石块组,并在回溯过程中断开连接。我认为这可能会更容易,因为de-union不是在集合中的某个任意对象上,而是始终是" undo"最新的工会。

我已经阅读了以下论文,虽然我可以完成建议的数据结构,但它似乎有点过时,需要一段时间才能实现 http://docs.lib.purdue.edu/cgi/viewcontent.cgi?article=1773&context=cstech

虽然O(a(n))会很棒,当然,我非常确定路径压缩不会与de-union一起工作,而且我对O(log)感到满意N)。我的直觉告诉我一个解决方案可能与堆相关,但我还没有能够解决任何问题。

1 个答案:

答案 0 :(得分:4)

您所描述的内容有时被称为union-find-split问题,但是大多数现代数据结构(或者至少是我所知道的)通常会以不同的方式查看此问题。将每个元素视为森林中的节点。然后,您希望能够在操作

下维护林
  • 链接(x,y),添加边(x,y),
  • 查找(x),它返回包含x的树的代表节点,
  • 剪切(x,y),将边缘从x切割为y。

这些数据结构通常称为动态树链接剪切树。据我所知,没有与标准union-find数据结构的实现简单性相匹配的高效数据结构。可能对您的情况有帮助的两个数据结构是链接/剪切树(也称为Sleator-Tarjan树或ST树)和Euler-tour树(也称为ET树),两者都可以执行所有以上操作的时间O(log n)各。

希望这有帮助!