2012-07-12 3 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

네 말이 맞아. 또한 경로에 가장 잘 어울리는 경로를 찾는 것이므로 경로에 세 개의 노드가 들어가면 길 잃어버린 경로임을 알면 그 경로에서 벗어나 다음 경로로 이동할 수 있습니다. –

+0

Ruby에서'foreach '를 사용하는 것은 매우 드문 일입니다. – tadman

+0

@ tadman은 자바 스크립트가 아닙니다. –

3

은 당신이 찾고있는 어떤 임의의 기준에 따라 개체 목록을 정렬하려면 sort_by 루틴 :

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

당신이 가장 낮은 또는 가장 낮은에 최고를 원하는 경우 first 또는 last가에 따라 사용해야 할 수 있습니다 최고로.

+0

정렬을 실행하면 간단한 루프보다 작은 값을 찾는 것이 더 효율적이라는 것을 어떻게 알 수 있습니까? 코드가 적지 만 백그라운드에서 실행이 더 많습니다. – FaultyJuggler

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

+0

잘자요. 배열의 첫 번째 항목을 살펴보고 해결할 수 있다고 생각합니다. 일반적으로, 나는 주사 버전을 정말로 좋아하지 않는다. 비효율적이다. – Candide

+0

퍼포먼스 관점에서'inject'에 대해 본질적으로 비효율적 인 것은 없지만보다 전문화 된 방법보다 정확하게 사용하는 것이 훨씬 더 장황 할 수 있습니다. – tadman