2011-10-25 21 views
1

我正在實施A *爲http://aichallenge.org/specification.php,並且想知道如何選擇基於schartzian變換的集合的最小值。從集合中選擇具有最小Schwartzian變換的對象

基本上,我有一個合適的廣場集合移動到,我想移動到成本最低的廣場。

基本上我會從我的鄰居誰在成本最低的循環中選擇廣場。

我能想到做到這一點的唯一方法是使用類似

next_spot = spot.neighbors.sort_by |a,b| { a.cost(dest) <=> b.cost(dest) }.first

但我真的很喜歡的東西更高的性能,因爲我真的不希望排序的集合,我只想具有最小變換值的那一個

請注意,我可以編寫一些更詳細的「C風格」循環和跟蹤以前的最小值,但我希望能夠找到清晰而緊湊的內容。

+0

我的錯誤,我經常混合這兩個,並根據需要刪除或添加_by – EnabrenTane

回答

2

爲什麼不使用min_by

next_spot = spot.neighbors.min_by { |x| x.cost(dest) } 

如果可枚舉十歲上下的方法的「_by」版本不存在,你可以得到老同學,做的Schwartzian用手變換的這種僞紅寶石模式:

a.map { |x| [ expensive(x), x ] }.  # Do the expensive part once and cache it 
    op { |x| something_with x.first... }. # Do what you really came to do 
    map { |x| x.last }      # Unwrap the caching 
+0

這正是我想要的!我從來沒有見過這種方法。謝謝!只要它讓我接受答案。 – EnabrenTane

相關問題