2017-01-20 3 views
2

私はmtdが1mil以上のレコード(整数のarraylistとして格納されています)を検索してempIDのパスが保存されたレコード。与えられた1milのデータを整数の配列で検索する方法

現在、私はforループを通して順次検索を使用しています。どのように効率的に/より速くするには?

def exist?(id) 
    for i in 0...$employee_list.length 
     if $employee_list[i] == id # match! 
      return true 
     elsif $employee_list[i] > id # have already gone beyond the point where id should've been found 
      return false 
     end 
    end 

return false # cannot find id in the list 
end 

また、次のようにハッシュを使用してみましたが、それでも十分に高速ではありません。

hash = $employee_list.map{ |i | i} 

if hash.include? id 
    return true 
else 
    return false 
end 
+2

これは、ハッシュを構築する方法ではありません。あなたは*ハッシュと呼んでいますが、配列をそれ自身にマップして、同じ配列を返します。 – meagar

+1

PS:あなたの 'if/else'ステートメントはアンチパターンです。実際のハッシュを作成するためにハッシュコードが修正されたとしても、 'return hash.include?(id)'や 'hash.include?(id)'( 'return'なし)を記述する必要があります。どのブール値を返すかを決定するブール値の結果をテストすることは、指や手首の浪費であり、後で誰かがコードを読んだり、保守したりするスペースが無駄になります。 – Phrogz

+0

PS値が(より小さい)配列内にあるかどうかをテストする場合は、['Array#include?'](https://ruby-doc.org/core-2.2.0/Array.html#method- i-include-3F)のように、 'def exist?(id); $ employee_list.include?(id);終わり ' – Phrogz

答えて

3

あなたはメモリを買う余裕はないことを証明した場合を除き、Setを使用します。

# Do this just once 
require 'set' 
$employee_ids = Set.new $employee_list 

# Do this each time you need to check 
def exist?(id) 
    $employee_ids.include?(id) 
end 

それは関係なく、あなたが持っているIDの数の、ほぼ瞬時になります。

+0

ありがとうございます!これは完璧に働いた!! –

+0

しかし、どのようにセットが動作するかは正確にはわかりません。より速く実行させるために –

+0

ハッシュと同様に、セットはハッシュと同様に、ハッシュアルゴリズムを実行します。値があるかどうかを尋ねると、その値をハッシュしてハッシュテーブルをチェックし、そこにあるかどうかを調べます。これは常に一定時間の操作です。詳細については、[ハッシュテーブル](https://en.m.wikipedia.org/wiki/Hash_table)を参照してください。 – Phrogz

2

あなたの代わりに(スペース上の理由から)ArraySetを使用することはできませんし、あなたのArrayがソートされている場合、あなたは(<=>のような)整数を返すブロックでArray#bsearchを使用することができます。

1

これは、アレイ上のバイナリ検索を行い、この

array.bsearch {|x| number <=> x } 

を試してみてください。配列はソートされなければなりません。

要素xは、宇宙船オペレータの右側にあることに注意してください。

riコマンドを使用して、bsearchメソッドに関するその他のドキュメントを参照してください。バイナリ検索の複雑さはO(log n)です。これは、長さ100万の配列に対してのみ20ステップです。

+1

OPは - "整数のarraylistとして格納されています" – akuhn

+0

うわー、それを見ていない(どう?...)、私は間違っている - あなたは正しい。私の答えを削除することはここに行く方法です –

+1

もし私が提供したようなハッシュを使用すれば、私のIDがハッシュにマッチするかどうかをどうやって確認できますか? hash.includeを使用していますか? ID? –

関連する問題