是否有人知道有效处理以下问题的具体数据结构/算法:
给定一个集合A
和一组集合S = {X,Y,Z..}
我想计算A中所有集合与S中所有集合之间的交集大小,利用它们中的大多数是非不相交的事实,即共享号。
例如:给定A = {1,2...10}
,X = {1,3,4,5,7}
和Y = {2,4,5,7,9,10}
,计算A
和X intersect Y
之间的交集更为有效,A
和X - X intersect Y
,A
和Y - X intersect Y
并总结结果。
一个实际的例子可能是在一大堆共享文本的文档中找到关键字的出现次数(不是总数,而是每个文档。)
请注意,Map-Reduce的唯一区别是文档共享部分文本,而这些部分只应解析一次。
如果这有任何帮助,我现在推理问题的方式是图形/树,其中节点是重叠区域,其O(n)
遍历给出A和所有元素之间交叉的大小S.我面临的问题是如何找到要使用的最佳节点集。但也许已经有了现成的解决方案。
答案 0 :(得分:0)
如果您期望大的重叠,那么将这些集存储为具有唯一节点表示的treaps可能是值得的。如果重叠足够大,这应该比其他任何东西都快。