匹配集的数据结构

2024-03-27

我有一个应用程序,其中有很多组。一套可能是
{4, 7, 12, 18}
唯一编号且全部小于 50。

然后我有几个数据项:
1 {1, 2, 4, 7, 8, 12, 18, 23, 29}
2 {3, 4, 6, 7, 15, 23, 34, 38}
3 {4, 7, 12, 18}
4 {1, 4, 7, 12, 13, 14, 15, 16, 17, 18}
5 {2, 4, 6, 7, 13, 15}

数据项 1、3 和 4 与集合匹配,因为它们包含集合中的所有项目。

I need to design a data structure that is super fast at identifying whether a data item is a member of a set includes all the members that are part of the set (so the data item is a superset of the set). My best estimates at the moment suggest that there will be fewer than 50,000 sets.

我当前的实现将集合和数据作为无符号 64 位整数并将集合存储在列表中。然后为了检查数据项,我遍历列表进行 ((set & data) == set) 比较。它可以工作,并且空间效率高,但速度很慢(O(n)),我很乐意用一些内存来换取一些性能。有人对如何组织这个有更好的想法吗?

Edit:非常感谢所有的答案。看来我需要提供有关该问题的更多信息。我先获取集合,然后逐一获取数据项。我需要检查数据项是否与其中一组匹配。
这些集合很可能是“块状”的,例如对于给定的问题 1、3 和 9 可能包含在 95% 的集合中;我可以在某种程度上提前预测这一点(但不是很好)。

对于那些建议记忆化的人:这是记忆化函数的数据结构。这些集合代表已经计算出的通用解,数据项是函数的新输入。通过将数据项与通用解决方案相匹配,我可以避免大量处理。


我看到另一个与您的解决方案双重的解决方案(即针对每个集合测试数据项),并且使用二叉树,其中每个节点测试是否包含特定项目。

例如,如果您有集合 A = { 2, 3 } 和 B = { 4 } 和 C = { 1, 3 } 您将拥有以下树

                      _NOT_HAVE_[1]___HAVE____
                      |                      |            
                _____[2]_____          _____[2]_____
                |           |          |           |
             __[3]__     __[3]__    __[3]__     __[3]__
             |     |     |     |    |     |     |     |
            [4]   [4]   [4]   [4]  [4]   [4]   [4]   [4]
            / \   / \   / \   / \  / \   / \   / \   / \
           .   B .   B .   B .   B    B C   B A   A A   A
                                            C     B C   B
                                                        C

制作树后,您只需进行 50 次比较,或者一组中可以有多少个项目。

例如,对于 { 1, 4 },您通过树进行分支:右(集合有 1)、左(没有 2)、左、右,然后得到 [ B ],这意味着仅包含集合 B在 { 1, 4 } 中。

这基本上称为“二元决策图”。如果您对节点中的冗余感到不满(您应该如此,因为 2^50 是很多节点......)那么您应该考虑简化形式,称为“简化的有序二元决策图”并且是一种常用的数据结构。在此版本中,节点冗余时会被合并,并且您不再拥有二叉树,而是有向无环图。

The ROBBD 的维基百科页面 http://en.wikipedia.org/wiki/ROBDD可以为您提供更多信息,以及为各种语言实现此数据结构的库的链接。

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

匹配集的数据结构 的相关文章

随机推荐

  • 文件下载 - 如何控制文件名并尊重用户的偏好?

    我的网站上有一个 blob url 和一个按钮 用户可以单击该按钮 然后 Blob 将在新选项卡中打开 a class downloadlink target blank href blobUrl a 这有效 如果用户对此 blob 后面的
  • JS中如何获取图像的DPI?

    我在 HTML5 画布上工作来计算图像上两点之间的距离 我想将以像素为单位的距离转换为厘米 我找到了一个公式 像素 2 54 DPI 所以我想知道是否可以在JS中获取DPI图像属性 或者 我可以使用最简单的方法从像素计算厘米吗 谢谢 您所要
  • 计算元组大小

    我试图了解列顺序如何最小化 PostgreSQL 中的表大小 Example CREATE TABLE test column 1 int column 2 int column 3 bigint column 4 bigint colum
  • iBeacons 的三角测量示例

    我正在研究使用多个 iBeacons 进行 粗略 室内定位的可能性 该应用程序是一种 博物馆 设置 能够更容易地形成一个包含不同对象位置的网格 然后形成单独的信标 尽管这也不是不可能的 是否有使用多个信标对某种位置进行三角测量的示例 经验
  • 使用 itextsharp 将 Pdf 文件页面转换为图像

    我想使用 ItextSharp 库转换图像中的 Pdf 页面 知道如何转换图像文件中的每个页面 iText iTextSharp 可以生成和 或修改现有的 PDF 但它们不执行您正在寻找的任何渲染 我建议检查一下鬼脚本 https stac
  • .exp有什么用,.lib和.dll有什么区别?

    在编译和链接过程中 exp有什么用 lib 和 dll 有什么区别 我知道运行程序时会使用 lib 而链接和 dll将被使用 但 lib 和 dll 之间到底有什么区别呢 lib 文件是否不包含来自 dll 文件的函数的代码 使用两个单独的
  • 将静态库转换为共享库(从 libsome.a 创建 libsome.so):我的符号在哪里?

    这个问题的标题是精确的欺骗 https stackoverflow com questions 655163 convert a static library to a shared library 但该问题的答案对我没有帮助 我有一堆目标
  • 用java打开chm文件

    我想从我的 java 应用程序打开 CHM 帮助 文件 我的代码如下所示 Runtime getRuntime exec hh exe myhelpfile chm 可以用 但是如何用特定页面打开它 谢谢 汤姆 尝试这个 是否可以从 Hh
  • 在 Python 中对元组字典进行排序

    我知道已经有很多关于 python 排序列表 字典的问题了 但我似乎找不到对我的情况有帮助的问题 而且我正在寻找最有效的解决方案 因为我要对一个相当大的数据进行排序数据集 我的数据目前基本上是这样的 a a 1 2 3 b 3 2 1 我基
  • RMarkdown - 使用 kable 的表格中的不同字体类型?

    我正在使用 RMarkdown 生成 pdf 文档 是否可以使用 kable styling 更改表格中的字体类型 如果没有 您能推荐其他包吗 library dplyr library kableExtra kable mtcars al
  • 将转义字符发送到打印机

    我正在开发一个 C 应用程序 用于从 SATO 热转印打印机 CG408 TT 打印标签 为此 我使用 SBPL SATO 编程语言 看起来像下面这样
  • C++ 使用不同的流读取和写入同一文件

    我有两个流指向同一个文件 第一个是std ofstream os第二个是std ifstream is 都以二进制模式打开 我在用着os创建一个新文件 文件创建过程需要我 有时 读取写入文件的数据os The is流寻找所需的位置 读取一些
  • 实体框架一对零或一对关系,没有导航属性

    由于 FK 限制 我在尝试删除记录时遇到了问题 因此 我回到了绘图板 并试图指定这种关系应该如何运作 这是我的代码第一类 public class MemberDataSet Key DatabaseGeneratedAttribute D
  • 如何在 Linux 中打开程序的多个实例

    例如 要打开多个实例gedit编辑器我写了一个像这样的shell脚本 gedit gedit gedit gedit 但是在我运行我的 shell 脚本之后 example sh 我只能找到一个 gedit 实例 我什至用过 运算符 以便
  • ObjectSpace.count_objects 中每个哈希值的含义是什么?

    在 ruby 1 9 3 中 我使用 ObjectSpace 来检查内存问题 ObjectSpace count objects 返回一个哈希值 如下所示 TOTAL gt 1004232 FREE gt 258543 T OBJECT g
  • 锁定 MongoDB 中的文档

    我在网络应用程序中使用 pymongo 并且想要执行以下形式的操作 doc collection find document doc array1 append foo for y in doc array2
  • Analysis_options.yaml 中包含多个内容?

    我想组合两个 或更多 analysis options yaml我的项目的文件 但无法找到如何做到这一点的方法 这有效 include package pedantic analysis options yaml 这也有效 include
  • 错误:‘.’令牌之前需要有不合格的 id //(结构)

    我需要制作一个程序 从用户那里获取一小部分 然后对其进行简化 我知道如何做到这一点 并且已经完成了大部分代码 但我不断收到此错误 错误 令牌之前预期有不合格的 id 我已经声明了一个名为 ReducedForm 的结构 它包含简化的分子和分
  • Python,Matplotlib,散点图,更改单击点的颜色

    我有一个带有选择器事件的简单散点图 我想更改用鼠标单击的数据点的颜色 我的代码将改变整个数组的颜色 我怎样才能改变一个特定的点 import sys import numpy as np import matplotlib pyplot a
  • 匹配集的数据结构

    我有一个应用程序 其中有很多组 一套可能是 4 7 12 18 唯一编号且全部小于 50 然后我有几个数据项 1 1 2 4 7 8 12 18 23 29 2 3 4 6 7 15 23 34 38 3 4 7 12 18 4 1 4 7