在所有集合中找到有效的分组最大值

时间:2011-04-27 05:14:59

标签: ruby multidimensional-array intersection

我有一个2D数组,想要生成一个3D数组,它将显示所有集合的最有效分组。例如:

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

结果:

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

我想我需要做一个嵌套循环并确定交集和差异以生成3D数组。但是,inject(&:&)似乎可以更优雅地解决它,虽然我有点新注入并且不确定如何为此问题实现它。这将在Ruby中完成。

感谢任何帮助。谢谢!

- 更新 -
通过有效分组,我的意思是找到最佳组合,通过找到最大的重复集,在结果中生成最少量的总集合。

另一个例子:

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

可能的结果(共8组):

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

这是一个很好的结果,但第一组可以进行优化。

更好的结果(总共7组):

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

两个结果共包含5个唯一集。更好结果的集合是(1,2,3,4),(1,4),(3),(5)和(2,5)。更好结果中的集合总数为7,而可能结果为8。我们想要最少量的套装。

2 个答案:

答案 0 :(得分:0)

你绝对应该解释“最有效的分组”的含义。与此同时,如果您只需要将数组拆分为2个元素的块,只需合并mapeach_slice

arr.map{|a| a.each_slice(2).to_a}
# => [[[1, 2]], [[1, 2], [3, 4]], [[3, 4]], [[1, 2], [5]]] 

答案 1 :(得分:0)

首先,您应该在伪代码中找出您想要做的事情的算法(它不是让您立即回归的Ruby)。然后使用这些红宝石原型来实现它

http://ruby-doc.org/core/classes/Enumerable.html

http://www.ruby-doc.org/core/classes/Array.html

http://corelib.rubyonrails.org/classes/Set.html