找到与一组数组相交的最小数组
Posted
技术标签:
【中文标题】找到与一组数组相交的最小数组【英文标题】:finding the smallest array that intersects with a set of arrays 【发布时间】:2015-07-23 21:21:59 【问题描述】:假设我有三个数组 - ['a', 'b']
、['b', 'c']
和 ['d']
。如果我要创建第四个数组,它与这三个数组相交且元素数量最少,那么我得到的数组将是['b', 'd']
。我的问题是……我该如何找到这个数组?
就像['a', 'b', 'c', 'd']
肯定会与所有数组相交,但它不是最小的交集 - ['b', 'd']
是。
有什么想法吗?
【问题讨论】:
那不就是取你原来3套的交集吗? @bhspencer 定义交集('d' 与什么相交?) @bhspencer 我认为他想要一个与任何数组相交的数组。很有趣 哦,我明白你的意思了 我几乎可以肯定这是 NP-Complete 并且需要蛮力解决方案。这几乎完全符合Clique problem 【参考方案1】:我对算法没有一个好的答案,但确实,就像评论者 Amit 所写的那样,这是一个 NP 完全问题。这个问题称为命中集问题,相当于set cover problem。
如果你对近似没问题,那么根据 wiki 文章,贪婪地挑选命中最多数组的元素,尽可能好。
【讨论】:
我只是找不到正确的问题类型...就在那里,太经典了:-) 很棒的文章。感谢 Tom Tseng 的链接。【参考方案2】:我认为您可能想要尝试的是遍历每个数组以获取与多个数组匹配的值。然后,一旦你有了这些值,确定你可以从数组中删除哪些值。
例子:
[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]
。
如果您有一个完全唯一的数组,这将不起作用。为了解决这个问题,您可以创建一个包含所有假值的布尔数组,并在匹配数组时将值设置为真。任何最终仍然为假的值,您必须从该数组中选择一个值。
【讨论】:
很抱歉又让你失望了,但是说真的,这个是无解的。你只能想出一个方法(我故意不把它称为算法),感觉它正在工作,但是如果输入正确,它会失败(就像我在你之前的尝试中向你展示的那样)。再次,对不起... 所以你是说没有正确答案?你能举个例子说明这行不通吗? 没关系,如果你有一个完全唯一的数组,这将不起作用。 我所说的(更准确地说,集合论世界所说的)是这被定义为 NP-Complete。你不能保证一个正确的答案,同时保证比蛮力更好的效率(测试所有可能的答案)。我是否可以(或有时间)提出破坏您当前方法的输入是无关紧要的以上是关于找到与一组数组相交的最小数组的主要内容,如果未能解决你的问题,请参考以下文章