最大化形成交集的集合数

时间:2019-03-11 09:13:27

标签: python algorithm set

假设我有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)))

2 个答案:

答案 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)