【问题标题】:Data structure for subset-reduced growing list子集缩减增长列表的数据结构
【发布时间】:2018-01-25 16:36:41
【问题描述】:

我正在处理一个涉及大量数据的问题。为了减少工作量(因为当前的计算需要大约两周的计算时间,我想大大减少它)我想出了一个算法,如果它能够避免某种类型的重复,它会更快。 (当前算法避免存储这些信息,因为它太大、未缩减,无法放入内存。)

我有一组集合,如果已经有一个集合 B(它是 A 的子集),我不想插入集合 A。目前,这些集合由整数表示,其中单个二进制数字表示存在或不存在的特定元素。在该解释中,如果已经存在集合/整数 B 使得 (~A) & B 为 0,则不应插入集合/整数 A,其中 ~ 是按位否定,& 是按位与。

例如,如果我的收藏有以下集合

[ {a,b}, {b,c}, {b,d,e} ]

我要求添加 {b,c,e} 它不应该被添加(因为 {b,c} 已经存在)并且与 {a,b} 类似(因为 {a,b} 存在)但是应该添加 {a,e}。

数字等价物将以

开头
[ `0b11`, `0b110`, `0b11010` ]

其中0b10110(~0b10110) & 0b110 == 0后未添加,0b11(~0b11) ^ 0b11 == 0后未添加,但可以添加0b10001

理想情况下结构会随着新集合的添加而自我修剪,因此如果添加了{c},则所有包含c 的现有集合都将被删除。但如果它不以这种方式更新也是可以接受的,只要我能经常以某种不太昂贵的方式将其标准化为那种形式。

【问题讨论】:

    标签: data-structures language-agnostic set bit-manipulation subset


    【解决方案1】:

    这是一个众所周知的问题,称为“寻找极值集”;不幸的是,从根本上来说,没有什么比针对所有现有集合测试新插入集合的明显方法更快的方法了,但是存在很好的启发式改进。这是最近一篇讨论这个问题的论文:https://arxiv.org/abs/1508.01753

    相关算法的开源实现: https://code.google.com/archive/p/google-extremal-sets/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 2016-04-11
      • 2010-10-13
      • 1970-01-01
      • 2013-01-06
      相关资源
      最近更新 更多