我问了一个基本上是背包问题的问题 - 我需要找到能够提供最佳输出的几个不同对象组合的组合。例如,最高的总和"值"从对象到成本的限制"成本"每个对象。我在这里收到的答案是以下 -
a.product(b,c)
.select{ |arr| arr.reduce(0) { |sum,h| sum + h[:cost] } < 30 }
.max_by{ |arr| arr.reduce(0) { |sum,h| sum + h[:value] } }
哪个效果很好,但是当我进入6个阵列时,每个选择约有40个,可能的组合会超过400万,并且需要很长时间才能处理。我对代码进行了一些更改,使处理更快 -
#creating the array doesn't take too long
combinations = a.product(b,c,d,e)
possibles = []
combinations.each do |array_of_objects|
#max_cost is a numeric parameter, and I can't have the same exact object used twice
if !(array_of_objects.sum(&:salary) > max_cost) or !(array_of_objects.uniq.count < array_of_objects.count)
possibles << array_of_objects
end
end
possibles.max_by{ |ar| ar.sum(&:std_proj) }
将它分成两个独立的阵列有助于提高性能,因为我只需要检查max_by,以获得符合标准的许多不太可能的组合。
有没有人看到优化此代码的方法?由于我通常会处理数万或数百万种组合,因此任何一点点都可以提供很大的帮助。感谢。
答案 0 :(得分:0)
如果我们谈论的是数百万行,那么操作就像是唯一的,最大的
我建议你在查询中使用DISINCT和MAX()解决它,你甚至可以按成本使用WHERE过滤。
在Ruby中循环对象显然更加昂贵。