Algorithm 算法:从集合中删除尽可能少的元素,以便不强制执行子集
我遇到了一个我不知道如何解决的问题: 我有一组集合Algorithm 算法:从集合中删除尽可能少的元素,以便不强制执行子集,algorithm,subset,Algorithm,Subset,我遇到了一个我不知道如何解决的问题: 我有一组集合a={a_1,a_2,…,a_n}和一组B 现在的目标是从B(创建B')中删除尽可能少的元素,这样,在删除所有1的元素后,听起来像是要从B中删除A中的最小元素(这与顶点覆盖问题密切相关) 某些集合A的命中集合本身就是一个集合,它包含A中每个集合中的至少一个元素(它“命中”每个集合)。最小打击集就是这种打击集的最小值。因此,如果您的集合A有一个MHS,那么A中的每个集合都有一个元素。从B中删除此项意味着A中的任何集合都不能是B的子集 您所需要做的就
a={a_1,a_2,…,a_n}
和一组B
现在的目标是从
B
(创建B'
)中删除尽可能少的元素,这样,在删除所有1的元素后,听起来像是要从B
中删除A
中的最小元素(这与顶点覆盖问题密切相关)
某些集合A
的命中集合本身就是一个集合,它包含A
中每个集合中的至少一个元素(它“命中”每个集合)。最小打击集就是这种打击集的最小值。因此,如果您的集合A
有一个MHS,那么A
中的每个集合都有一个元素。从B
中删除此项意味着A
中的任何集合都不能是B
的子集
您所需要做的就是计算(A1,A2,…An)的MHS,然后将其从B
中删除。不幸的是,找到MHS是一个NP完全问题。但要知道,您有几个选择:
如果您的数据集很小,请使用显而易见的暴力解决方案
使用概率算法快速获得近似答案(请参阅)
朝相反的方向跑得很远很远
我认为您应该从这些集合中找到最小长度,然后删除该集合中的这些元素。如果您只需要一些近似值,请从A中的最小集合开始,然后从B中删除一个元素。(您可以随机抓取一个元素,或者根据您需要的准确度和速度,检查一个元素中哪个元素的集合最多)
现在,A中最小的集合不是B的子集。从那里继续,但首先检查您正在检查的集合是否是此时的子集
这让我想起了顶点覆盖问题,我还记得一些类似于这个问题的近似算法。@davit datuashvili:Chris的答案很准确,我建议你读一下。