有没有人知道特定的数据结构/算法来有效地处理以下问题:
给定一个集合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 的所有元素之间的交集大小。我面临的问题是如何找到要使用的最佳节点集。但也许已经有现成的解决方案。
如果您预计会有较大的重叠,那么可能值得将这些集合存储为具有节点唯一表示形式的 treap。如果重叠足够大,这应该比其他任何事情都快。
请参阅以下答案:https://cs.stackexchange.com/a/18006/10483