子集减少增长列表的数据结构

时间:2018-01-25 16:36:41

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

我正在研究一个涉及大量数据的问题。为了减少工作量(因为当前的计算需要大约两周的计算时间,而且我想大幅降低计算时间),我想出了一种算法,如果能够避免某种类型的重复,它会快得多。 (当前算法避免存储此信息,因为它太大,未减少,无法适应内存。)

我有一组集合,如果已经有A集合B,我不想插入集A。此时,集合由整数表示,其中各个二进制数字表示存在或不存在的特定元素。在该解释中,如果已经存在集合/ A以使B为0,则其中(~A) & B为按位否定,则不应插入集合/整数~。 {1}}是按位AND。

例如,如果我的集合具有以下集合

&

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

数字等价物将以

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

[ `0b11`, `0b110`, `0b11010` ] 以来未添加0b10110(~0b10110) & 0b110 == 0后未添加0b11,但可以添加(~0b11) ^ 0b11 == 0

理想情况下结构会在添加新集时修剪自身,因此如果添加0b10001,则会删除包含{c}的所有现有集合。但是如果它不以这种方式更新是可以接受的,只要我可以经常以一些不太昂贵的方式将其标准化为该形式。

1 个答案:

答案 0 :(得分:1)

这是一个众所周知的问题,被称为"发现极值集&#34 ;;遗憾的是,除了针对所有现有集合测试新插入集合的明显方法之外,没有任何基本上更快的知识,但存在良好的启发式改进。以下是最近讨论此问题的论文:https://arxiv.org/abs/1508.01753

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