算法 - 如何有效地确保每个数组中的元素是不同的?

时间:2012-06-13 14:37:05

标签: algorithm data-structures

我不知道如何写这个问题的标题。现有的标题可能不准确。

问题在于:

我有m组(数组),比方说,4组。每组包含一些数字。我们希望的是每个组给出一个数字,并且总共产生的4个数字(每个来自一个组)是不同的。

现在给出这4组,我怎样才能确保它们符合我们的愿望呢?


例如,

A:0,2,3

B:0,2

C:2,3

D:1

以上4组可以满足我们的愿望。 D给出1,C给出3,B给出2,A给出0。


但是如果

A:2

B:2

C:2,3

D:1

很糟糕。我们不能让每个小组给出一个明确的数字。


我的想法是最愚蠢的方式,我只是回溯所有组中的所有元素,以获得元素的每个组合,并从一个组合中看到这些元素是不同的。

任何人都有更好的主意吗?

3 个答案:

答案 0 :(得分:5)

您可以将此建模为网络流问题,然后在该问题域中使用快速算法(其中许多是多项式时间),如Edmunds-Karppush-relabel

创建源节点和汇聚节点。然后为每个“组”和每个不同的元素创建节点。将每个组节点连接到源,将每个元素节点连接到接收器。如果组作为元素,最后使用元素节点连接组节点。所有流量应为1。

最好用一个例子来说明。我将使用你给出的第一个例子:

A: 0, 2, 3
B: 0, 2
C: 2, 3
D: 1

将转入以下流量网络:

   A   0
  /     \
 /       \
S--B   1--T
 \       /|
  \     / |
   C   2 /
        /
       3

我无法绘制中间流程。但想象一下,A流向0,2,3,B流向0,2,C流向2,3,D流向1.所有流量均为单位容量。

首先在此图中找到max-flow。组和元素之间的流程将为您提供所需的二分匹配。

如果没有可能的匹配,则max-flow将小于组的数量。

答案 1 :(得分:2)

答案 2 :(得分:0)

  • 一个想法是寻找所有组独有的元素,并将它们用于它们所属的组;这会将列表缩小到只有具有共同元素的组。

  • 另一个想法是从具有最少元素的组(理想情况下是一个)开始,将它们设置为其中一个值并迭代增加大小(您可以在删除已使用的元素后考虑大小)。 / p>