找到与一组数组

时间:2015-07-23 21:21:59

标签: arrays set-intersection array-intersect set-theory

假设我有三个数组 - ['a', 'b']['b', 'c']['d']。如果我要创建第四个与这三个数组相交的数组,并且元素数量最少,那么我得到的数组将是['b', 'd']。我的问题是......我将如何找到这个阵列?

类似['a', 'b', 'c', 'd']肯定与所有数组相交,但它不是最小的交集 - ['b', 'd']是。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

我对算法没有一个好的答案,但确实如同Amit写的评论者那样,这是一个NP完全问题。这个问题称为命中集问题,相当于set cover problem

如果您对近似值很好,那么根据维基文章,贪婪地选择击中大多数数组的元素尽可能好。

答案 1 :(得分:1)

我认为你可能想要尝试的是通过每个数组来获取匹配多个数组的值。然后,一旦有了这些值,就可以确定可以从数组中删除哪些值。

示例:

[1,2] [2,3] [2,4] [1,5] [3,7] [4,8]

循环后,我们发现[1,2,3,4]是在多个数组中匹配的所有值。

现在我们必须确定是否有任何值可以从此列表中消除。

如果我们取消1,一切都会匹配吗?

不,我们需要1

如果我们取消2,一切都会匹配吗?

是的,我们可以从数组中删除2。现在我们有[1,3,4]

如果我们取消3,一切都会匹配吗?

不,我们需要3

如果我们取消4,一切都会匹配吗?

不,我们需要4

我们的最终数组是[1,3,4]

如果您拥有完全唯一的数组,则无效。为了解决这个问题,您可以创建一个包含所有false值的布尔数组,并在匹配数组时将值设置为true。最后仍然为false的任何值,您必须从该数组中选择一个值。