假设我有三个数组 - ['a', 'b']
,['b', 'c']
和['d']
。如果我要创建第四个与这三个数组相交的数组,并且元素数量最少,那么我得到的数组将是['b', 'd']
。我的问题是......我将如何找到这个阵列?
类似['a', 'b', 'c', 'd']
肯定与所有数组相交,但它不是最小的交集 - ['b', 'd']
是。
有什么想法吗?
答案 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的任何值,您必须从该数组中选择一个值。