【问题标题】:Algorithm to determine the possibility of selecting 1 unique element from n arrays确定从 n 个数组中选择 1 个唯一元素的可能性的算法
【发布时间】:2019-03-13 10:41:09
【问题描述】:

有一点需要破解。我有算法的蛮力实现,这并不难,但显然我想要更有效的东西。

问题如下:

假设你有 n 个数组,每个数组都填充了 1n 之间的一些值。我需要确定是否可以从每个数组中选择一个元素,以便我从 1n 中选择每个元素恰好一次。一个小例子:假设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 个元素。

正如我所说,蛮力方法并没有那么复杂,但我想要更有效的方法,无需遍历所有可能的排列,直到找到符合标准的排列。

【问题讨论】:

  • 你用什么语言编程?最好用适当的语言标记您的问题,以便您获得更有针对性的帮助!
  • 怎么样,至于“更简单”的实现,也是蛮力,一个简单的二叉树。第一个n/2将由应该通过测试的输入的一半检查,另一半由另一半输入!只是一个建议!
  • 几个问题:1- 数字总是在这个范围内1 <= x <= n? 2- 数组是否排序?
  • @M.kazemAkhgary 是的,是的。因此,如果我们有 3 个数组,则每个数组中可能包含的数字始终是 1、2、3。 5个数组?总共有 1,2,3,4,5。是的,它们将在数组中排序。
  • @M.kazemAkhgary:还是蛮力的……对于每个数组中的每个数字组合,我必须计算它们在所有数组中出现的次数。想象一下 8 个数组,每个数组都充满了数字。我将不得不选择 2 个数字的每个组合、3 个数字的每个组合、4 个数字的每个组合等等。效率不高。

标签: arrays algorithm


【解决方案1】:

这个问题可以简化为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]

我们可以形成这个图

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

【讨论】:

  • 我之前实际上在考虑“这会是一个两方的事情吗”。绝对是个好建议。从我做的另一个算法课程中得到了一个实现。我会试一试,谢谢!
  • 你能画一个流程图的例子吗?我没看到:)
  • 工作得很好。非常感谢。
猜你喜欢
  • 2021-11-19
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多