上下文:将G
中的每个集合视为特定计算机上找到的文件(内容或MD5哈希,而不是名称)的集合。
假设我有一个庞大的巨型集合列表G
以及一组未知的集合H
。 I
中的每个单独的集G
都是通过从列表H
中获取一些未知数量的集合,然后添加和删除未知数量的元素来创建的。
现在,我可以使用其他数据构建列表H
中的一些集合。但是,我觉得可能会有某种涉及Bayesian probability的技术来执行此操作。例如。例如,“如果在X
内的集合中找到G
表示同时找到Y
的概率很高,那么H
中可能包含X
{1}}和Y
。“
编辑:我的目标是构建一组很有可能非常相似或等于H
的集合。
有什么想法吗?
使用示例:
通过用G
的片段替换它的块来压缩H
,例如
G[1] = {1,2,3,5,6,7,9,10,11}
H[5] = {1,2,3}
H[6] = {5,6,7,8,9,10}
G[1]' = {H[5],H[6],-8,11}
答案 0 :(得分:3)
定义距离d(i,j)= 1 /(G中包含i和j的集合数)然后运行聚类分析。(http://en.wikipedia.org/wiki/Cluster_analysis)生成的聚类是您的候选者H中的元素。
答案 1 :(得分:0)
有很多非聪明的 ad hoc 攻击方式。这是一个。
首先从G中随机抽取样本,比如64集。
对于这些集合中的每个文件,构造一个64位整数,告诉它出现在哪个集合中。
按此64位值对文件进行分组;所以总是一起出现的所有文件最终都在同一个组中。查找具有最大值的组((组中的文件数 - 1)×(位向量中设置的位数 - 1))并调用H [0]。
现在将样本扔回去并取一个新的随机样本。使用您已定义的H [0]尽可能多地减少它。然后应用相同的算法找到H [1]。冲洗。重复。
当额外的H不再帮助你压缩套装时停止。
改进此算法:
答案 2 :(得分:0)
嗯,目前的临时方式似乎还不错,如下:
G_x
中移除25集以内的所有元素。E
,选择3个集并取其交集。制作两份副本,A
和B
。S
的集合地图中的每个集E
,请从S
或A
中删除B
的所有元素(在它们之间切换) )Union(A,B)
添加到H
答案 3 :(得分:0)
确定性方式如何(如果你不希望集合相交): A)将H中的集合转换为标记为1,2,3,...大小(H)的顶点。在它们之间创建一个完整的[un]有向图。每个顶点都有一个值 - 等于集合的基数/大小。 B)遍历H中的所有元素x,创建映射x - &gt; [x1,x2,... xm]当且仅当x在H [xi]中时。一组数组都可以。这有助于您找到重叠集。 C)遍历此数组中的所有集合,对于同一集合中的每对x1,x2 - 消除x1和x2之间的两条边。 D)在剩余的图中只有非重叠集(好吧,它们的指数在H中)。 E)现在在该图中找到具有最高总值的非相交路径。从中您可以重建具有最高覆盖范围的非相交集列表。计算缺失的元素是微不足道的。 F)如果要最小化剩余集合的基数,则从每个顶点的值中减去0.5。我们知道1 + 1 = 2,但0.5 + 0.5 <1。 1.5 - 因此算法优先选择{a,b}而不是{a}和{b}。这可能不是您想要的,但它可能会使您失效。