在 Python 中查找集合集合的 n 个最大交集

Finding n largest intersections of collection of sets in Python

我有一个字符串集合(字典),比如 {1: {'a', 'b'}, ...} 我需要找到 n 个最大的交集,即集合中最大子集的交集。明显的蛮力方法:

for i in range(len(collection),2,-1):
    for subset in combinations(sorted(collection), i):
        intersected = set.intersection(*(collection[k] for k in subset))
        if len(intersected)>0:
            yield len(subset), intersected

非常慢。有一些有效的方法 way/library 可以做到这一点吗?

我假设您想找到字典中对应集合的交集不为空的 n 个最大的键子集。因此,在您的示例中(在对 post 的注释中),最大的此类子集由键 1,2 和 4 表示,相应集合的交集至少包含一个元素 ('b' 在我们的例子中)。

最大子集: 您可以迭代所有不同的集合元素(a、b 等)并计算它们出现的集合的数量,而不是生成所有可能的键子集。计数最高的元素会直接将您引向解决方案,即最大的子集。

示例: 在您的示例中,您将获得以下中间结果:

一个:2, 乙:3, 丙:1, 电子:1, f: 1

您会立即看到元素 b 出现在比任何其他元素都多的集合中。包含 b 的集合代表解决方案。

N个最大的子集:n个最大的子集可以很容易地从中间结果生成,你只需要检查重复项。在您的示例中,最大子集的大小为 3,并且是其大小中的唯一一个。下一个最大的子集的大小为 2。您可以通过出现在两个或多个集合中的元素获得它,即 a 和 b。因此,有 3 种方法可以从 3 个 b 组中选择 2 个,并由两个 a 组组成一个解决方案。

只计算每个字符串出现的次数。最大出现次数是子集的最大交集(假设一个字符串在每个子集中都是唯一的):

coll = {1:{'a','b'}, 2:{'b','e'}, 3:{'a','c'}, 4:{'b','f'}}
print(coll)

d=dict()
for subs in coll.values():
  for s in subs:
    d[s]=d.setdefault(s, 0)+1

m=max(d.values())
print(m)