【问题标题】:Finding the fewest number of arrays whose union matches another array [closed]找到最少数量的数组,其联合与另一个数组匹配[关闭]
【发布时间】:2017-02-08 07:18:09
【问题描述】:

给定任意数量的数组放入一个数组中:

a = [1, 2, 4]
b = [2, 4]
c = [3]
d = [1, 2]

arrays = [a, b, c, d]

我想在这些数组中选择最少数量的联合来匹配 ruby​​ 中的数组 [1, 2, 3, 4],即“正确”答案是 [a, c] 而不是 [b, c, d]

出于我的目的,最少数量的数组是否完全重叠并不重要,只要它们能够满足匹配所需数组的标准即可。

我可以想象几种蛮力解决方案(例如,将每个元素与其他元素联合的嵌套循环),但我想知道是否有最佳/优雅的方法来获得这个结果。

【问题讨论】:

  • 您可以通过删除其元素已包含在另一个数组中的任何数组来减少可能组合的数量。在您的示例中,bd 都被 a 覆盖。

标签: arrays ruby optimization


【解决方案1】:

我很确定(我敢打赌问题是 NP 完全问题)必须只检查组合,从一个数组的组合开始,然后,如果不成功,检查两个数组的组合,依此类推.

def minimal_cover(arr, target)
  (1..arr.size).each do |n|
    arr.combination(n).each { |a| return a if (target - a.reduce(:|)).empty? }
  end
  nil
end

a = [1, 2, 4]
b = [2, 4]
c = [3]
d = [1, 2]
arrays = [a, b, c, d]
target = [1, 2, 3, 4]

minimal_cover(arrays, target)
  #=> [[1, 2, 4], [3]]

【讨论】:

  • 它看起来像是子集和的变体,带有数组而不是整数。子集和确实是 NP 完全的。
  • 感谢您的回答!这几乎是我找到的解决方案。虽然忘记了combination 功能,但这是一件很方便的事情。将您的标记为正确,谢谢!
猜你喜欢
  • 2018-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多