【发布时间】:2015-02-06 18:43:30
【问题描述】:
如果我有可变数量的集合(我们称之为数字 n),每个集合最多有 m 个元素,那么计算成对的最有效方法是什么所有成对集合的交点?请注意,这与所有 n 个集合的交集不同。
例如,如果我有以下集合:
A={"a","b","c"}
B={"c","d","e"}
C={"a","c","e"}
我希望能够找到:
intersect_AB={"c"}
intersect_BC={"c", "e"}
intersect_AC={"a", "c"}
另一种可接受的格式(如果它使事情变得更容易的话)是将给定集合中的项目映射到包含相同项目的集合。例如:
intersections_C={"a": {"A", "C"},
"c": {"A", "B", "C"}
"e": {"B", "C"}}
我知道这样做的一种方法是创建一个字典,将所有 n 个集合的并集中的每个值映射到它出现的集合列表,然后遍历所有这些值来创建列表,例如上面的intersections_C,但我不确定随着 n 的增加和集合的大小变得太大,它会如何扩展。
一些额外的背景信息:
- 每个集合的长度大致相同,但也非常大(大到足以将它们全部存储在内存中是一个现实问题,虽然没有必要但最好采用避免这种情况的算法)
- 与集合本身的大小相比,任何两个集合之间的交集的大小都非常小
- 如果有帮助,我们可以假设我们需要对输入集的排序进行任何处理。
【问题讨论】:
-
你知道行之有效的方法你试过了吗?
-
我建议如下:遍历所有集合并通过跟踪找到每个元素的位置来构建地图。这是 O(NlogN)(假设字典增加了对数开销),其中 N 是元素的总数。
-
我已经尝试过我在小样本上描述的方法,但问题是我将使用的很多数据都是用户提供的。理想情况下,我希望能够支持更大的用例,所以我想知道是否有比我描述的幼稚方法更常见/更有效的方法来做到这一点。
-
@nickie 你的想法是遍历集合并为所有 n 集合独立制作字典,每次迭代只制作大小为 m 的字典而不是 nm* 来存储所有可能的元素?
-
我认为这可以使用哈希表在线性时间内完成,与集合的大小成线性关系:O(N + M + N * c),其中 c 是一个常数,表示访问哈希表中的条目的成本,此常量将与您设置的字符串的长度成正比。
标签: python set set-intersection