假设我有10套,每套都有一些随机的正整数。
现在,考虑到一个约束只有至少x个整数重叠时,一个集合才可以与另一个集合形成一个交集的约束,我想最大化可以形成一个交集的集合的数量(不搜索最大的交集)。例如,如果x
= 2,则[1,2,3,4]
无法与[1,5,6,7]
形成交集,因为只有1个整数重叠,而不是2。
要注意的另一件事(虽然很明显)是,对于x=2
,如果我有[1,2,3,4]
和[1,2,6,7]
,则可能发生相交,而对于第三个集合形成相交,集合中的某处必须有[1,2]
。
我无法正确地形成算法来执行此操作,因为可以通过指数方式比较集合!即使我只有3个集合,在给定集合大小的情况下,我也必须考虑给定交集约束的每个子集组合比较。
我正在生成我的集合,如下所示:
sets = []
for i in range(0,10):
temp = np.random.randint(1,3000)
sets.append(set(np.random.randint(1, 3000, temp)))
答案 0 :(得分:1)
您可以计算集合中每个数字的出现次数。由于您正在尝试最大化交叉点的总数,因此最常见的数字将导致最大可能的交叉点数(理想情况下,每两个集合形成一个交叉点)。这是该代码:
builder.RegisterModule<SimpleNLogModule>();
_logger = serviceLocator.Resolve<ILogger>();
结果是:
import numpy as np
# Set a seed for testing purposes
np.random.seed(1)
# Initialise the min number of elements in an intersection
x = 2
# Initialise the list of sets
sets = list()
# Initialise the count mapping
count = dict()
# Generate the sets
for i in range(0,10):
temp = np.random.randint(1,3000)
sets.append(set(np.random.randint(1, 3000, temp)))
# Count each number's occurrence
for s in sets:
for number in s:
if number in count:
count[number] +=1
else:
count[number] = 1
# Sort the result (by the count number)
l = sorted(count, key=lambda x: count[x], reverse=True)
# Print the number of occurrences (within the boundary of min x elements)
print(count[l[x-1]])
# Print the numbers that give you the maximum number of intersections
print(l[:x])
在这种情况下,十分之七的数字集包含2270和2225,因此可以形成总共21个(6 * 7/2)交集。性能应为7
[2270, 2225]
(由于排序),其中N是总数。
答案 1 :(得分:0)
考虑A的所有子集(总共2 ^ 10个子集)
ss是A的子集,
检查ss的交点SI,如果len(SI)> x,则更新结果。
伪代码:
result = set()
for ss in all subset:
SI = ss[0]
for g in ss:
SI = SI .intersection(g)
if len(SI ) >= x:
result = ss
print(result)