是否有一个好的数据结构可以执行查找、并集和解并操作?

2024-01-09

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

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

当然,虽然 O( a(n)) 会很棒,但我很确定路径压缩不适用于 de-union,并且我会对 O(log n) 感到满意。我的直觉告诉我一个解决方案可能与堆相关,但我还没有弄清楚任何事情。


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

  • link(x, y),添加边 (x, y),
  • find(x),返回包含 x 的树的代表节点,以及
  • cut(x, y),切割从 x 到 y 的边。

这些数据结构通常被称为动态树 or 链接切割树。据我所知,没有任何有效的数据结构可以与标准并查数据结构的实现简单性相匹配。可能对您的情况有帮助的两种数据结构是链接/剪切树(也称为 Sleator-Tarjan 树或 ST 树)和欧拉图树(也称为 ET 树),两者都可以执行所有操作上述操作的时间分别为 O(log n)。

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否有一个好的数据结构可以执行查找、并集和解并操作? 的相关文章

  • 实现字典的 Applicative 实例(Map、关联数组)

    为关联数组实现函子实例 本质上是映射操作 似乎很简单 例如 参见Functor定义 1 然而 Applicative实例未定义 地图不是应用程序有一个很好的理论理由吗 它们需要什么额外的限制才能成为应用程序 1 https hackage
  • 如何找到射线与移动圆的第一个交点

    我已经在一个问题上苦苦挣扎了一段时间 到目前为止还没有找到比天真的解决方案更好的解决方案 N circles are given that are moving according to a linear law For each of t
  • 寻找成熟的 M-Tree 实现 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个成熟的 java M Tree 实现 甚至任何 M Tree 实现 除了我找到的唯一实现 http en wikipedia
  • 是否可以反转包含循环的链表?

    我正在看一些面试问题 其中一个要求反转包含循环的链表 所以假设我有一个如下所示的链接列表 F lt E V A gt B gt C gt D 然后反转列表将创建以下内容 F gt E V A lt B lt C lt D 这里的问题是 C
  • clojure 中的反转哈希映射

    我在 clojure 中有哈希映射 key1 value1 key2 value2 key3 value1 我需要将其转换为哈希映射 value1 key1 key3 value2 key2 有 Clojure 方法可以做到这一点吗 clo
  • 如何将 PriorityQueue 恢复到方法调用之前的初始状态?

    我正在做一道练习题 这个问题基本上是你传入一个 PriorityQueue 和某个 k 并且你要返回该 PriorityQueue 中的第 k 个最小值 您还可以将 PriorityQueue 恢复到其初始状态 并可以使用一个堆栈或队列作为
  • 如何从 trie 构造 DAWG?

    我只是构建一个trie http en wikipedia org wiki Trie对于一个词汇表 然后我发现有很多分支共享相同的结构 我想将它们组合在一起 结果是DAWG http en wikipedia org wiki Deter
  • C/C++ 中的双向链表与多链表 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 双链表和多链表有什么区别 在 C C 程序的帮助下会更好地解释我 定义 A 多链表是一个链表 其中每个节点可以包含指向链表的多个节点的
  • 理解 C:指针和结构

    我试图更好地理解 c 但很难理解在哪里使用 和 字符 一般而言只是结构 这是一些代码 void word not lc3 word t R lc3 word t A int ptr ptr R ptr 0 1 printf this is
  • 使用 Java 中的映射实现的队列数据结构,大小限制为 5

    我有带有一些记录的地图 我想将该映射限制为仅 5 个元素 并且每当添加新元素时 应删除第一个元素 并应在映射的最后位置添加新元素 类似于 FIFO 的东西 任何人都可以建议我使用一个数据结构或解决方案本身 E g Map
  • 如何有效地合并两个 BST?

    如何合并两个二叉搜索树并保持BST的性质 如果我们决定从树中取出每个元素并将其插入到另一个元素中 则此方法的复杂度将为O n1 log n2 where n1是树的节点数 比如T1 我们已经拆分了 并且n2是另一棵树的节点数 比如T2 执行
  • MATLAB 链表

    有哪些可能的方法来实现链表MATLAB http en wikipedia org wiki MATLAB 注意 我问这个问题是为了教学价值 而不是实用价值 我意识到 如果您实际上在 MATLAB 中滚动自己的链表 那么您可能做错了什么 然
  • 何时使用 Box> 或 Vec>?

    什么时候设计一个嵌套的数据结构才有意义 Box and a Vec 或相反亦然 似乎在大多数情况下 您想在堆上存储多个固定大小的东西 Box是多余的 因为它唯一的 作用是堆分配一个 单个值 以及一个正常的Vec已经在堆上分配其存储空间 背景
  • 将文件保存为 MYSQL 数据库中的 blob 或文件路径

    我知道这些问题是常见问题之一 但我需要您针对具体案例提供帮助 我正在开发一个应用程序 其中一些用户可以添加订单 一些用户可以执行这些订单 这些订单非常具体 因此只有有限数量的用户可以添加它们 然后 为每个订单生成三个文档 每个文档的大小不超
  • 比较周期性数据的快速方法

    假设我有任意类型的数据集 A B C D 并且我想将其与另一个数据集进行比较 我希望 A B C D B C D A C D A B 和 D A B C 的比较成立 但是不适用于 A C B D 或任何其他未类似排序的集合 有什么快速方法可
  • 如何解析代码(Python)?

    我需要解析一些特殊的数据结构 它们采用某种类似 C 的格式 大致如下所示 Group GroupName C Style comment Group AnotherGroupName Entry some variables 0 3 141
  • 比较 C# 中 DateTime 的二进制表示形式

    我有一个DateTime表示为长 8 个字节 来自DateTime ToBinary 我们称之为dateTimeBin 是否有一种最佳方法可以删除时间信息 我只关心日期 以便我可以将其与一天的开始进行比较 假设我们将此样本值作为一天的开始
  • 二叉堆对于优先级队列的优点?

    看来我错过了一些非常简单的东西 优先级队列的二进制堆与快速排序的值数组相比有什么优势 在这两种情况下 我们将值保存在数组中 插入的时间复杂度为 O logN 删除最大的时间复杂度为 O 1 在这两种情况下 给定元素数组的初始构造都是 O N
  • 如何有效地找到距给定点最远的点(从一组点中)?

    我正在寻找一种算法或数据结构来解决以下问题 给你一组点 S 然后你会得到另一个点形式的 Q 查询 对于每个查询 找到集合中距离给定点最远的点 集合中最多有 10 5 个点和 10 5 个查询 所有点的坐标都在 0 到 10 5 范围内 我想
  • 生成二叉树的所有从根到叶的分支

    抱歉 如果这是一个常见问题 但我还没有找到适合我的特定问题的答案 我正在尝试实施一个walk方法将二叉树从根节点遍历到每个叶节点 每当到达叶节点时都会生成根到叶路径 例如 遍历表示为的二叉树 a b d c 会产生 a b c a d 我的

随机推荐