用最小标签覆盖人口的算法

时间:2010-08-07 21:22:05

标签: algorithm

我的数据是人和标签,具有多对多的关系。

我需要一种能够找到最小标签集的算法,以便解决方案中每个标签标记的人群的联合将覆盖整个人口。

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

这是一个NP难题。实际上,需要进行大量处理才能确保所需的标签数量绝对最少。

我将使用的非常快速简便的解决方案是

while there are users left in the pool:
    find the tag that represents the most users
    add that tag to the list
    remove all the users that that tag represents from the pool

If you want, you can then loop through and make sure there aren't any 
unnecessary tags //but that probably won't help much

当然,有许多方法可以布置标签,这样做不是最佳方式,也不会找到最佳解决方案。但是,我很确定它应该非常接近。

答案 1 :(得分:1)

这相当于vertex cover的NP完全问题。

证明的简单草图:如果我们能找到最小顶点覆盖,我们可以找到最小的标记集。只需创建一个顶点=标签联合人员的图表并适当地链接它们,并在彼此之间连接所有标签。最小的顶点覆盖对应于最小的标签集,一旦我们意识到对于这种图中的每个顶点覆盖,就会有一个相同大小的顶点覆盖仅包含“标签” - 转换。

可以通过为每个顶点创建一个标签和一个人,并将每个顶点的标签与相同顶点及其邻居的人物链接来显示对位(顶点覆盖可以缩减为最小标签)。

答案 2 :(得分:1)

人与标签之间的多对多关系形成了一个二分图,幸运地与通用案例完全不同。因此,问题不是NP完全,而是can be solved in polynomial time。它似乎等于找到最大匹配,维基百科为其提供了几个alternatives