2009-05-13 23 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でより良い "実装" がありますか?この1つはまだc-ishに見えます。おかげさまで

+0

、あなたは何をすべきか「より良い」という意味ですか?より効率的ですか、コードの行数が少なくて済みますか? – Rahul

+0

申し訳ありませんが、私はRubyでより良い実装をするつもりでした。 – 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のネイティブsortメソッドを使用するだけではどうですか?これはクイックソートアルゴリズムを使って実装されており、非常に高速であると考えられています。

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

"大きい"リストでは、はるかに高価になるでしょう。 O(n)の代わりにO(n * log(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

私はこれが配列を2回... – Agush

関連する問題