2014-09-25 53 views
0

我問了一個基本上是揹包問題的問題 - 我需要找到幾個不同數組的對象組合提供最佳輸出。例如,對於每個對象的「成本」限制,來自對象的最高「總和」值。我在這裏獲得的答案是以下各項紅寶石 - 優化代碼從數組中尋找最佳選擇

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

有沒有人看到一種方法來優化上述代碼,使其處理更快?有時會有數百萬種可能的組合運行,所以任何一點點都可以提供幫助。 – 2014-09-25 04:28:13

+3

數組來自哪裏?也許你應該在數據庫查詢中做到這一點? – Aret 2014-09-25 04:35:53

+0

陣列確實來自數據庫,但它們不是瓶頸。這是代碼中的處理。 – 2014-09-25 04:37:55

回答

0

如果我們正在談論數百萬行,並且操作如獨特和最大。

我建議你在查詢中使用DISINCT和MAX()來解決它,你甚至可以使用WHERE按成本過濾。

在Ruby中遍歷對象顯然更昂貴。

+0

存在的問題是我沒有將所有可能的組合存儲在數據庫中,我通過我的產品方法在ruby中執行此操作。你知道類似的東西在數據庫中產生嗎? – 2014-09-25 05:01:22