5

假设我们在某处存储了数万亿个集合。这些集合中的每一个的域都是相同的。它也是有限和离散的。因此,每个集合都可以存储为长度相对较短(例如:1024)的位字段(例如:0000100111...)。也就是说,位域中的位 X 指示项目 X(1024 个可能项目中的)是否包含在给定集合中。

现在,我想设计一种存储结构和一种算法来有效地回答查询:数据存储中的哪些集合将 Y 设置为子集。Set Y 本身并不存在于数据存储中,而是在运行时指定的。

现在解决这个问题的最简单的方法是将集合 Y 的位域与数据存储中的每个集合的位域一个一个地与,选择 AND 结果与 Y 的位域匹配的位域。

我怎样才能加快速度?是否有树结构(索引)或一些智能算法可以让我执行此查询而不必对每个存储集的位域进行 AND 运算?

是否有数据库已经支持对大型集合进行此类操作?

4

6 回答 6

4

如果您可以预处理集合,则子集关系可以表示为 DAG(因为您正在描述一个poset)。如果计算了传递减少,那么我认为您可以通过从最大的集合开始执行 DFS 并在 Y 不再是被访问的当前集合的子集时停止来避免测试所有集合。

于 2010-12-28T06:29:09.173 回答
1

根据从中提取所有集合的集合的基数,一种选择可能是构建从元素到包含它们的集合的倒排索引映射。给定一个集合 Y,然后您可以通过查找单独包含每个元素的所有集合并计算它们的交集来找到所有以 Y 作为子集的集合。如果您按排序顺序存储列表(例如,通过使用值 0、1 等对数据库中的所有集合进行编号),那么您应该能够相当有效地计算此交集,假设其中也没有包含任何元素很多套。

于 2010-12-28T16:39:29.157 回答
0

这将是基于您的卷的传统 RDBMS 的延伸,您是否看过基于图形存储模型的Neo4j ?

于 2010-12-28T01:03:43.527 回答
0

我倾向于说答案是否定的,因为位字段的基数非常低。

于 2010-12-28T00:57:51.920 回答
0

如果 RDBMS 是您唯一的选择,我建议您阅读这篇关于在 SQL 中建模 DAG 的有趣文章:

http://www.codeproject.com/KB/database/Modeling_DAGs_on_SQL_DBs.aspx?msg=3051183

如果您买不起 Oracle 或 MSSQL,请查看支持递归查询的 PostgreSQL 9。在相当长的一段时间内,它也支持交叉连接。

于 2011-02-09T21:40:47.370 回答
0

快速浏览一下让我想到了 BDD——这​​在某种程度上与 DAG 解决方案的想法一致。或者一个 ZDD。

于 2010-12-28T16:43:27.927 回答