算法:从集合中删除尽可能少的元素,以便不强制执行子集

时间:2010-05-19 11:59:05

标签: algorithm subset

我遇到了一个我不知道如何解决的问题:

我有一组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之一的超集。

是否有用于确定要删除的(最少数量)元素的算法?

3 个答案:

答案 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. 如果您的数据集较小,请执行明显的暴力解决方案
  2. 使用概率算法获得快速,近似的答案(请参阅this PDF
  3. 向相反的方向远行,

答案 1 :(得分:0)

我认为您应该从这些集合中找到最小长度,然后删除此集合中的这些元素。

答案 2 :(得分:0)

如果你只需要一些近似值,从A中的最小集合开始,从B中删除一个元素。(你可以随机抓取一个元素,或者检查A中最多集合中的哪个元素,具体取决于你需要多快准确,多快?

现在A中的最小集合不是B的子集。从那里移动,但首先检查您正在检查的集合是否是此时的子集。

这让我想起了顶点覆盖问题,我记得有一些与此类似的近似算法。