arrays - 确定从 n 个数组中选择 1 个唯一元素的可能性的算法
问题描述
有一点坚果要破解。我有算法的蛮力实现,这并不难,但显然我想要更有效的东西。
问题如下:
想象一下,您有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 个元素。
正如我所说,蛮力方法并没有那么复杂,但我想要更有效的方法,而不需要遍历所有可能的排列,直到找到符合标准的排列。
解决方案
这个问题可以简化为最大二分匹配,可以通过Ford-Fulkerson Algorithm for Maximum Flow Problem 解决:
让我们创建一个节点流图,2*n
第一组n
节点表示数组,而下一组n
节点表示值。因此,当且仅当数组内部包含值时,从i
第一个集合中的节点到第二个集合中的节点会有一条边。此边的容量应为 1,表示您只能从每个数组中选择一个。j
i
j
形成此图后,应用经典算法找到答案。
对于问题中的示例:
[1,2,3,4]
[1,3]
[2,4]
[3,4]
我们可以形成这个图
白色节点代表数组,而绿色节点代表值。
推荐阅读
- java - Spring Batch Multiple Steps vs Single Step
- jquery - 如何在jQuery中的下拉菜单上触发滚动事件
- wordpress - 如何从古腾堡块编辑器获取 Wordpress 页面特色图片?
- php - 使用 .htaccess 重定向动态 url,动态删除一些字符
- r - 提取列表中的数字范围
- spring-boot - 有没有办法在 thymeleaf 和 spring boot 中显示来自 MySql 数据库的图像?
- c# - 如何使用 C# web api 关闭 CRM 机会实体
- javascript - 'children' 未定义 - 在 React 类组件中
- azure - 当应用服务位于应用服务环境中时,是否需要自定义域 SSL 绑定
- c# - C# 根据 CPU/内存使用情况以编程方式关闭其他进程