【问题标题】:generating a set from given sets such it's intersection with all the sets is different from {}从给定的集合生成一个集合,这样它与所有集合的交集不同于 {}
【发布时间】:2018-02-10 23:03:39
【问题描述】:

我一直在尝试找出一种有效的算法来返回一个集合,例如它与给定集合的交集不等于{}

例如:假设给定的集合是{1,7,4},{2,8,5},{1,3},{2,6},函数必须返回集合{1,2},因为它与所有给定的集合有一个交点(生成的集合需要尽可能小)

【问题讨论】:

  • 您可以简单地采用并集,这样可以保证它与所有集合相交,请重新表述您的问题,并展示您自己的尝试。
  • 这是一个猜测,但我认为用户想要尽可能小的这样的集合。否则问题是微不足道的。不过需要澄清一下。
  • 对不起,我忘了提到它需要尽可能优化,这就是为什么我无法解决它

标签: python set


【解决方案1】:

这是一个蛮力解决方案。显然,这是众所周知的NP-complete问题Hitting Set

from itertools import combinations
from collections import defaultdict

A = [{1,7,4},{2,8,5},{1,3},{2,6}]
U = set.union(*A)

result = defaultdict(list)

for i in range(1, len(U)):
    combs = combinations(U, i)
    for c in combs:
        if all(set(c) & l for l in A):
            result[len(c)].append(set(c))
    if result:
        break

result
# defaultdict(list, {2: [{1, 2}]})

【讨论】:

  • 感谢这个解决方案,我不知道这个问题有名字
【解决方案2】:

是否有必要让combinedSet尽可能小?如果没有,这将起作用:

A = [{1,7,4},{2,8,5},{1,3},{2,6}]
combinedSet = set()
for a in A:
    combinedSet |= a
print(combinedSet)

cmets 中建议的另一种更简洁的方法:

A = [{1,7,4},{2,8,5},{1,3},{2,6}]
combinedSet = set.union(*A)
print(combinedSet)

【讨论】:

  • 是的,集合需要尽可能小,抱歉我忘了提
  • @JimmyCarlos,仅供参考,OP 已确认他们需要最小的此类集合。
猜你喜欢
  • 2015-12-10
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多