如何完全匹配一组集合

时间:2015-03-06 00:35:47

标签: mapping combinatorics computation-theory np-complete set-theory

这个问题类似于" Exact Hitting Set"问题(http://en.wikipedia.org/wiki/Exact_cover#Exact_hitting_set),但约束略有不同。

我正在寻找解决以下问题的库,实现或论文。

假设我有一组 S ,并按如下方式初始化:

S = {N, O, P, E};

N = {1, 2, 5}
O = {4, 5}
P = {1, 6, 7}
E = {2, 3, 8}};

S 有n套,每个子集的大小都是未知的。在此示例中n = 4

现在我有另一套大小为n的 X ,初始化为:

X = {1, 2, 4, 6}

我需要做的是将 X 中的每个元素与 S 中的一个且仅一个匹配。

所以 S 应该完全满意所有映射到 X 的集合,反之亦然。

X[0] --> N
X[1] --> E
X[2] --> O
X[3] --> P

我遇到的主要问题是如何在 S 的集合中处理重复数据。我该如何处理这些碰撞?以及如何以相对可扩展的方式实现算法?

如果您有任何可以指出我正确方向的信息,我将非常感激。

1 个答案:

答案 0 :(得分:1)

您可以通过以下方式创建二分图:

  • 对于 X 集合中的每个元素,在图表的 U 不相交集合中创建一个节点
  • 对于集合 S 中的每个子集,在图表的 V 不相交集合中创建一个节点
  • 如果 S 子集中的 X 元素,则在 U V 中的相应节点之间创建边缘>

然后使用二分图,您可以使用hopcroft karp algorithm来解决问题,以产生最大基数匹配。(O(|E|sqrt(V))