2012-07-12 79 views
1

比方說,我有這樣的事情:如何「比較並找到最佳的」最佳實踐

def find_the_best(array) 
    temp = 15435435435 # sufficiently large number 
    value = 0 
    array.each do |element| 
    some_var = function_does_something_complex_and_returns_value(element) 
    some_var < temp ? value = element[0] 
    end 
end 

這個數量足夠多的解決方案的工作,但似乎有點哈克。處理這個問題的最佳方法是什麼,特別是在紅寶石中,但通常也是如此。問題是,它應該被設置爲0,然後分配第一個值,然後每個值都應該被採用,只有當它較小。

回答

0

這看起來並不像一個排序問題儘可能最適合的基於標準。

你正在尋找最小的價值,沒有必要有臨時價值(除非有什麼你不告訴我們)。

簡單地假設第一個值是最好的,並繼續檢查。

best_value = array[0]; 
foreach(element in array) 
{ 
    if(best_value > element) 
     best_value = element; 
} 
+0

你是對的。此外,它找到了一條最適合的路徑,所以如果我將三個節點深入到一條路徑中,並知道它是一條鬆散的路徑,我可以在該路徑上繼續前進,然後轉到下一條路徑。 – 2012-07-12 17:52:35

+0

在Ruby中使用'foreach'非常不尋常。 – tadman 2012-07-12 18:17:48

+0

@tadman是不是JavaScript? – 2012-07-12 18:24:42

3

什麼你要找的是sort_by常規排序任意的條件對象的列表:

best = array.sort_by do |element| 
    function_does_something_complex_and_returns_value(element) 
end.first 

您可能需要根據firstlast使用,如果你想從最高到最低或最低到最高。

+0

我們如何知道運行的排序會更有效率比一個簡單的循環,以找到最小的價值?較少的代碼,但在後臺執行更多。 – FaultyJuggler 2012-07-12 19:47:35

3
array.min_by{|e| function_does_something_complex_and_returns_value(e) } 

array.inject {|m,e| [m, function_does_something_complex_and_returns_value(e)].min } 
+0

請注意,這裏的'inject'版本是不正確的,因爲它返回最高計算值,而不是導致該計算值的對象。使用'min_by'是個好主意。 – tadman 2012-07-12 18:20:15

+0

好的。我想我可以通過查看數組的第一項來修復它。一般來說,我不太喜歡這個注入版本,它效率低下。 – Candide 2012-07-12 18:25:53

+0

從性能的角度來看,'inject'沒有什麼內在的低效率,但是比一個更專門化的方法可以正確地使用更多的冗餘。 – tadman 2012-07-12 18:53:30