アレイ内の最小要素の位置を見つけるための良い方法はありますか?
質問
今、私が持っている
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でより良い「実装」はありますか?この1はまだCっぽい見えます。 おかげます。
解決
あなたは最小限の要素のインデックスを検索したい場合は、
、あなたはに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
他のヒント
基本的にそれはあなたがもう少し簡潔に書くことができますが、あなたができる最善のです。
def minval(arr)
arr.inject {|acc,x| (acc && acc < x ? acc : x)}
end
があり単純な方法であり、それはルビー1.9.2で私の作品ます:
a = [6, 9, 5, 3, 0, 6]
a.find_index a.min
これは、アレイ内の最小の要素を見つけるための標準的なアルゴリズムである
は、この関数が呼び出される前にアレイが既にソートさを有することによって改善することができます。
そうでなければ、私はこれを行うためのより効率的な方法を見つけることができません。具体的には、大きなO記法で線形時間は、私たちができる最善のです。
これは単に学術的な問題ではない場合は、
、なぜ単にRubyのネイティブsort
メソッドを使用していませんか?これは、クイックソートアルゴリズムを使用して実装されています、と非常に高速であると考えられます。
a = [3, 4, 5, 1, 7, 5]
a.sort![0] # => 1
所属していません StackOverflow