最大集交集

时间:2014-12-01 10:01:20

标签: algorithm set intersection brute-force

给出5个有限集a,b,c,d,e。每组都分配了任意数字:

a = 100,b = 34,c = 15,d = 89,e = 57

每组的补码具有相同的编号但是否定例如对于(a')它将是-100。

我们需要找到这些所有集合或其补语的交集,因此结果集不是空集,并且指定数字的总和是最大的。

我只看到这个问题的一个强力解决方案,但它效率很低而且不优雅。在这种情况下,我们只生成所有组合并解决它们以查看它们是否为空,组合如下所示:

{a∩b'∩c'∩d'∩e'},{a'∩b∩c'∩d∩e'},{a& #39;∩b'∩c∩d'∩e'},{a'∩b'∩c'∩d∩e'},{a' ;∩b'∩c'∩d'∩e} {a∩b∩c'∩d'∩e'},{a∩b'∩c∩ d'∩e'},{a∩b'∩c'∩d∩e},{a∩b'∩c'∩d'∩e}, {a'∩b∩c∩d'∩e'} {a'∩b∩c'∩d∩e'} {a'∩b∩c&# 39;∩d'∩e} ...

然后选择最大数字。

期待有人能想到更好的事情:)

1 个答案:

答案 0 :(得分:1)

如果x在X中,则定义得分(x,X)为集合X的值,否则为否定。

然后,让*表示不属于5组中任何一组的元素,可能的最高分是:

max_{x in union(A, B, C, D, E, {*}} sum_{X in A, B, C, D, E} score(x, X)

这是根据观察结果得出的,即任何特定的x都在一个集合或其补集中。你实际上不必在这里计算联合。在Python中你可以写:

def max_config(A, B, C, D, E):
    best = None
    for S in A, B, C, D, E, set([None]):
        for x in S:
            best = max(best, sum(score(x, X) for X in A, B, C, D, E)))
    return best

假设集合成员资格测试为O(1),则其复杂度为O(N),其中N是给定集合的总大小。