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に見えます。ありがとう。

4

5 に答える 5

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
于 2009-05-13T02:42:08.460 に答える
1

より簡単な方法があり、Ruby 1.9.2 で動作します。

a = [6, 9, 5, 3, 0, 6]
a.find_index a.min
于 2011-05-07T15:43:06.157 に答える
1

もう少し簡潔に書くこともできますが、基本的にはこれが最善の方法です。

def minval(arr)
    arr.inject {|acc,x| (acc && acc < x ? acc : x)}
end
于 2009-05-13T01:57:34.867 に答える
0

これは、配列内の最小要素を見つけるための標準アルゴリズムです。この関数が呼び出される前に、配列を既にソートしておくと、より良い場合があります。

Otherwise I can't find a more efficient way of doing this. Specifically, linear time in big O notation is the best we can do.

于 2009-05-13T01:43:22.033 に答える
-1

これが単なる学術的な問題ではないのなら、なぜ Ruby のネイティブsortメソッドを使用しないのでしょうか? これはクイックソート アルゴリズムを使用して実装されており、かなり高速であると考えられています。

a = [3, 4, 5, 1, 7, 5]
a.sort![0] # => 1
于 2009-05-13T01:56:29.567 に答える