包含图中每个元素的最小组数?

问题描述

问题描述

我有一个包含选择器元素的图表。一个元素可以有多个与之关联的选择器。作为图表,它看起来像这样:

Graph

在这个例子中,任何以 S 为前缀的节点都是一个选择器,任何以 E 为前缀的节点都是一个元素。

如您所见,元素只能与选择器连接。没有元素会与元素相连,也不会有选择器与其他选择器相连。

我想选择最少数量的选择器,使其邻居包含图中的每个元素。在上面的例子中,我希望我的算法返回 S1,S3,S4但是,我不需要返回它们所代表的组。如下图所示:

Grouped Graph

在示例中,我们不需要使用 S2 选择器,因为它是多余的。此外,即使 E1 出现在 S4S1 中,我们仍然需要包含 S4,因为 E5E6 节点。换句话说,这些组不需要精确覆盖,必要时可以重叠。

可能的解决方

贪婪地,我可以创建一个选择器和连接到它们的元素的邻接列表,并选择具有最大元素的选择器。然后我可以从每个其他节点的列表中删除元素并重复该过程,直到没有元素为止。

我想看看有没有比这种方法更有效/更优雅的方法

解决方法

这是 Set Cover Problem,其中与选择器相邻的每组元素都是 S 中的一组元素。这是一个 NP 完全问题,这意味着没有有效的算法可以始终产生最佳答案。您建议的解决方案是该问题的建议贪婪解决方案,但不能保证给出最佳答案。一般来说,在为这个问题选择算法时,会在最优性和速度之间进行权衡。