【问题标题】:Fastest way to perform subset test operation on a large collection of sets with same domain在具有相同域的大型集合上执行子集测试操作的最快方法
【发布时间】:2010-12-28 00:44:35
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您使用的是什么类型的数据库?专有格式? SQL Server?
  • DB 的选择将取决于它是否有效地支持在巨大集合上的给定集合操作。没有一个 SQL DBS 可以扩展到所需的大小(无论如何,RDMS DB 都不是解决这个问题的最佳选择)。所以选择是专用数据库还是我自己实现的数据库。
  • 你找到解决办法了吗?奇怪的是,这个任务没有众所周知的数据库。

标签: database algorithm database-design set set-theory


【解决方案1】:

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

【讨论】:

  • 您能详细说明一下吗?您基本上是在谈论构建像以下en.wikipedia.org/wiki/File:Hypercubeorder_binary.svg 这样的 DAG,但仅使用现有集合集合中的节点?做 DFS 时如何选择起始节点?
  • 是的,基本上。如果 A 是 B 的超集,则从集合 A 到集合 B 有一条边。使用传递约简更好,因为边的数量减少了(因此分支因子也应该减少,因此检查的无用节点更少)。由于该图是非循环的,因此将有一组没有边进入它们的节点,您可以从那里开始(这些表示您的集合中没有超集的集合)。您必须在所有这些上启动 DFS(或者只是从连接到所有这些无超集的集合的虚拟节点开始)。
  • 有趣。我会记住这个算法,虽然数据存储中的集合集合不太可能有很多子集/超集关系,所以我最终会在很多起始节点上进行 DFS。
  • 如果头太多,那么您可能想要构建一些虚拟节点(例如,它们是相似的头对的联合)。这可能有助于更快地丢弃部分集合,尽管这实际上取决于 Y 是否应该匹配集合中的许多集合——只是一个随机的想法。
【解决方案2】:

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

【讨论】:

  • 好点。数据存储中集合的基数是 ~
  • 我知道,如果您有两个排序序列并想要计算交集,您可以通过重复以下操作来完成:当两个列表不为空时,查看第一个值每个序列的。如果它们不相同,则删除两者中较小的一个。如果它们相同,则您已在交集处检测到一个值。这在时间 O(n + m) 中运行,其中 n 和 m 是两个序列的长度。如果您在序列对上运行此过程,然后在结果等上运行此过程,则运行时间为 O(n lg k),其中 k 是序列数,n 是序列的最大长度。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 它是否有效地支持处理大型集?据我了解,它对于存储图形而不是集合更有用。
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

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

      如果您买不起 Oracle 或 MSSQL,请查看支持递归查询的 PostgreSQL 9。很长一段时间以来,它还支持交叉连接。

      【讨论】:

        猜你喜欢
        • 2017-05-22
        • 2018-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-05
        • 2014-01-21
        相关资源
        最近更新 更多