我一直试图找出一个有效的算法,它返回一个集合,例如它与给定集合的交集不等于{}
。
例如:假设给定的集合是{1,7,4},{2,8,5},{1,3},{2,6}
,函数必须返回集合{1,2}
,因为它与所有给定的集合具有交叉点(生成的集合需要尽可能小) )
答案 0 :(得分: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}]})
答案 1 :(得分:0)
是否有必要使combinedSet尽可能小?如果没有,这将有效:
A = [{1,7,4},{2,8,5},{1,3},{2,6}]
combinedSet = set()
for a in A:
combinedSet |= a
print(combinedSet)
评论中建议的替代,更简洁的方法:
A = [{1,7,4},{2,8,5},{1,3},{2,6}]
combinedSet = set.union(*A)
print(combinedSet)