2009-05-13 4 views
3

Сейчас у меня естьЕсть ли лучший способ найти местоположение минимального элемента в массиве?

def min(array,starting,ending) 
    minimum = starting 
    for i in starting+1 ..ending 
    if array[i]<array[minimum] 
     minimum = i 
    end  
    end 

return minimum 
end 

Есть ли лучше "внедрение" в Ruby? Этот по-прежнему выглядит c-ish. Спасибо.

+0

что делает вас означает «лучше»? Более эффективный или тот, который требует меньше строк кода? – Rahul

+0

Извините, я хотел сказать, что в рубине лучше. – unj2

ответ

6

Если вы хотите, чтобы найти индекс минимального элемента, вы можете использовать Enumerable#enum_for для получить массив пар элементов-индексов и найти минимум из них с Enumerable#min (что также будет минимальным для исходного массива).

% irb 
irb> require 'enumerator' 
#=> true 
irb> array = %w{ the quick brown fox jumped over the lazy dog } 
#=> ["the", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"] 
irb> array.enum_for(:each_with_index).min 
#=> ["brown", 2] 

Если вы хотите, чтобы обвил его к конкретным индексам массива:

irb> start = 3 
#=> 3 
irb> stop = 7 
#=> 7 
irb> array[start..stop].enum_for(:each_with_index).min 
#=> ["fox", 0] 
irb> array[start..stop].enum_for(:each_with_index).min.last + start 
#=> 3 
+0

WOW. Это красивая команда succint. – unj2

+0

Есть ли хороший учебник/документация для перечислителя? – unj2

+1

http://www.ruby-doc.org/stdlib/libdoc/enumerator/rdoc/index.html – rampion

0

Это стандартный алгоритм поиска минимального элемента в массиве, он может быть лучше, если массив уже будет отсортирован до вызова этой функции.

В противном случае я не могу найти более эффективный способ сделать это. В частности, лучшее время, которое мы можем сделать, - это линейное время в большой нотации O.

+0

Мне жаль, что я хотел сказать, есть ли лучшая реализация для того же алгоритма в Ruby? – unj2

-1

Если это не просто академический вопрос, почему бы просто не использовать собственный метод Ruby's sort? Он реализован с использованием алгоритма быстрой сортировки и считается довольно быстрым.

a = [3, 4, 5, 1, 7, 5] 
a.sort![0] # => 1 
+1

В «больших» списках это будет намного дороже. O (n * log (n)) вместо O (n) –

+0

Время увеличивается на большой коэффициент, и я не могу интегрировать подпрограмму в другой метод, например Selection_Sort. – unj2

+0

Согласовано. Я думал, что по какой-то причине должно произойти подобное. –

1

В основном это лучшее, что вы можете сделать, если вы можете написать его немного более лаконично:

def minval(arr) 
    arr.inject {|acc,x| (acc && acc < x ? acc : x)} 
end 
+1

Я думаю, что OP хотел индекс минимального значения, а не самого значения. Это немного усложняет использование инъекций. –

+0

И вам даже не нужно использовать ничего, кроме: arr.min, чтобы получить минимальное значение. –

+0

Хотя это умно, я не могу его использовать. – unj2

1

Существует более простой способ, и это работает для меня в рубине 1.9.2:

a = [6, 9, 5, 3, 0, 6] 
a.find_index a.min 
+0

Я думаю, что это пройдет через массив дважды ... – Agush

Смежные вопросы