【问题标题】:Finding n largest intersections of collection of sets in Python在 Python 中查找集合集合的 n 个最大交集
【发布时间】:2015-12-20 00:08:00
【问题描述】:

我有一组字符串的集合(字典),例如 {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

很慢。有没有一些有效的方法/库来做到这一点?

【问题讨论】:

  • 它适用于我的数据集,虽然速度很慢。澄清一下,我所说的最大是指集合中最大的子集(重叠子集的最大数量),不一定是与最大数量元素的交集。
  • “n 个最大的交叉点”是什么意思?什么是“n”?集合中最大子集的交集是什么意思?
  • 一些最小的示例输入和输出数据会有所帮助。
  • 最大? - 按元素数量或百分比? (如果您说“百分比”,则需要指定分子和分母)
  • 您的意思是您正在寻找字典中键的最大子集,以便相应集合的交集不为空?

标签: python algorithm set-intersection


【解决方案1】:

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

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)

【讨论】:

    【解决方案2】:

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

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

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

    一个:2, 乙:3, 三:1, e: 1, f: 1

    您会立即看到元素 b 的集合比任何其他元素都多。包含 b 的集合代表解。

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

    【讨论】:

    • 不确定这是否正确。取集合:{a, b, c} {a, b, c} {d, e} {d, f}, {d, g}。 d 出现频率最高,但最大的交点是 {a, b, c} 与 {a, b, c} 的交集。
    • 问题在于这个问题被误导了。真正需要的是如何找到一组选择,以使它们的交集不为空,同时最大化选择的大小(请参阅问题下方的 cmets)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多