【问题标题】:Is there a good data structure that performs find, union, and de-union?是否有一个很好的数据结构来执行查找、联合和去联合?
【发布时间】:2014-09-09 23:49:08
【问题描述】:

我正在寻找一种可以相当有效地支持联合、查找和去联合的数据结构(所有内容至少为 O(log n) 或更好),因为标准的不相交集结构不支持去联合。作为背景,我正在用 MCTS [http://en.wikipedia.org/wiki/Monte_Carlo_tree_search] 编写一个围棋 AI,这将用于跟踪在回溯期间连接和断开连接的棋​​子组。我认为这可能会更容易,因为解除联合不是在集合中的某个任意对象上,而是始终是最新联合的“撤消”。

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

虽然 O(a(n)) 会很好,但当然,我很确定路径压缩不适用于去联合,而且我会对 O(log n) 感到满意。我的直觉告诉我一个解决方案可能与堆有关,但我无法弄清楚任何事情。

【问题讨论】:

  • 可能会在 CompSci SE 受到更多关注。

标签: data-structures baduk


【解决方案1】:

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

  • link(x, y),添加边 (x, y),
  • find(x),它返回包含 x 的树的代表节点,并且
  • cut(x, y),将边缘从 x 切割到 y。

这些数据结构通常称为动态树链接切割树。据我所知,没有与标准联合查找数据结构的实现简单性相匹配的有效数据结构。可能对您的案例有帮助的两种数据结构是链接/切割树(也称为 Sleator-Tarjan 树或 ST-tree)和 Euler-tour 树(也称为 ET-tree),它们都可以执行所有上述操作的时间为 O(log n)。

希望这会有所帮助!

【讨论】:

  • 啊,我怎么会忘记链接/砍树!非常感谢,我也去看看 ET 树。
猜你喜欢
  • 2021-11-16
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2019-06-20
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多