我正在研究一个涉及大量数据的问题。为了减少工作量(因为当前的计算需要大约两周的计算时间,而且我想大幅降低计算时间),我想出了一种算法,如果能够避免某种类型的重复,它会快得多。 (当前算法避免存储此信息,因为它太大,未减少,无法适应内存。)
我有一组集合,如果已经有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}
的所有现有集合。但是如果它不以这种方式更新是可以接受的,只要我可以经常以一些不太昂贵的方式将其标准化为该形式。
答案 0 :(得分:1)
这是一个众所周知的问题,被称为"发现极值集&#34 ;;遗憾的是,除了针对所有现有集合测试新插入集合的明显方法之外,没有任何基本上更快的知识,但存在良好的启发式改进。以下是最近讨论此问题的论文:https://arxiv.org/abs/1508.01753
相关算法的开源实现: https://code.google.com/archive/p/google-extremal-sets/