确定从n个数组中选择1个唯一元素的可能性的算法

时间:2019-03-13 10:41:09

标签: arrays algorithm

有一点螺母要裂。我有算法的强力实现,这并不是真的那么难,但是显然我想要更有效的方法。

问题如下:

想象一下,您有 n 个数组,每个数组都填充了 1 n 之间的一些值。我需要确定是否可以从每个数组中选择一个元素,这样我就可以一次从 1 n 中选择每个元素。一个小例子:假设n = 4,我们有以下n数组:

[1,2,3,4]
[1,3]
[2,4]
[3,4]

这种数组组合将通过算法,因为有可能(例如)分别从每个数组中选择1、3、2、4。另一种可能性是2、1、4、3。 一个反例是:

[1,2,3]
[3]
[3,4]
[3,4]

在这里,您清楚地看到这些输入数组不会通过算法。不可能从每个数组中选择一个元素,而每个元素只能被选择一次。

就像我说的那样,暴力破解方法并不那么复杂,但是我想要一种更高效的方法,而无需经历所有可能的排列,直到找到通过标准的排列。

1 个答案:

答案 0 :(得分:9)

此问题可以简化为Maximum Bipartite Matching,可以通过Ford-Fulkerson Algorithm for Maximum Flow Problem解决:

让我们创建一个2*n节点的流程图,其中第一组n节点代表数组,而下一组n节点代表值。因此,当且仅当在数组i内包含值j时,第一个集合中的节点i到第二个集合中的节点j会有一条边。此边缘的容量应为1,表示您只能从每个阵列中选择一个。

形成此图后,应用经典算法找到答案。

对于问题中的示例:

[1,2,3,4]
[1,3]
[2,4]
[3,4]

我们可以形成这张图

enter image description here

白色节点代表数组,绿色节点代表值。