我遇到了一个我不知道如何解决的问题:
我有一组A = {A_1, A_2, ..., A_n}
,我有一套B
。
现在的目标是从B
(创建B'
)删除尽可能少的元素,这样,在删除所有1 <= i <= n
的元素后,A_i
为不 B'
的一个子集。
例如,如果我们有A_1 = {1,2}, A_2 = {1,3,4}, A_3={2,5}
和B={1,2,3,4,5}
,我们可以例如从B
中移除1和2(这会产生B'={3,4,5}
,这不是A_i
之一的超集。
是否有用于确定要删除的(最少数量)元素的算法?
答案 0 :(得分:8)
听起来你想要从A
中移除B
的最小hitting set(这与顶点覆盖问题密切相关)。
一些集合A
的命中集本身就是一个集合,它包含A
中每个集合中至少一个元素(它“点击”每个集合)。最小击球组是最小的击球组。因此,如果您的集合集A
有MHS,则A
中的每个集合都有一个元素。从B
中删除此值意味着A
中的任何设置都不能成为B
的子集。
您需要做的就是计算MHS(A 1 ,A 2 ,... A n ),然后删除来自B
的那个。不幸的是,找到MHS是NP完全问题。知道这一点,你有几个选择:
答案 1 :(得分:0)
我认为您应该从这些集合中找到最小长度,然后删除此集合中的这些元素。
答案 2 :(得分:0)
如果你只需要一些近似值,从A中的最小集合开始,从B中删除一个元素。(你可以随机抓取一个元素,或者检查A中最多集合中的哪个元素,具体取决于你需要多快准确,多快?
现在A中的最小集合不是B的子集。从那里移动,但首先检查您正在检查的集合是否是此时的子集。
这让我想起了顶点覆盖问题,我记得有一些与此类似的近似算法。