2016-09-01 11 views
1

私はRubyが新しく、なぜこのエラーが発生するのか不思議です。 (悪いフォーマットのため申し訳ありませんが)ルビーコードqn。反復を減らす方法

エラー:

rb37: in '%': nil can't be coerced into Fixnum (TypeError) 

そしてまた、私は私の質問に助けが必要。私は可能な限り効率的な方法を使って特定のIDを見つけるために100万のID番号のリストを実行する方法を考え出しています(5分以内)。あなたのdump配列の長さになるまで、あなたのループがより大きくされています。私はこの時、全体の午後してきた:(

def exist?(id) 
    dump = [] 
    employee_list = $employee_list.sort #employee_list is an array of 1 million lines of data, I have to look for a specific "id" 

    while dump.length < id 
     dump << employee_list.first 

     if dump.last != id 
      if id%dump.last != 0 && dump.last != 1 
       employee_list.delete_if { |n| n%dump.last == 0 } 
#what im doing here is to delete ID from employee_list that are multiples of n 
      elsif id%dump.last == 0 
       employee_list.delete_if { |m| m%dump.last == 0 && m!=id } 
#deleting multiples of m (excluding id itself) 
      end 
     elsif dump.last == id 
      return true 
     end 
    end 
    return false 
end 
+0

あなたが本当にメモリに保存されたONE MILLIONアイテムを持つ配列を持つようにしたいですか?そしてこのように分類された? –

+0

これは、forループを使って1 by 1をチェックするだけでなく、何時間もかかるより良いアルゴリズムを私に求めている学校の質問練習です。 – Clement

+0

この場合、ソートされた配列があるので、バイナリ検索を実装しないでください。平均的な場合、1対1の比較よりもかなり速いです:https://en.wikipedia.org/wiki/Binary_search_algorithm –

答えて

1

は、私は正直にあなたのコードがやろうとしているが、ここでの問題は何絶対にないアイデアを持っていませんidあなたがループで。検索している、あなたはdumpの終わりにemployee_list配列の最初の要素を追加します。またemployee_listからのものを削除します。今

idがどのように大規模に応じて、あなたは非常にループしようとしています多くの場合、例えばid1234567890であると想像すると、あなたはループします回、dumpアレイに10億個以上の要素を追加しています。同時に、employee_listからのものも絶えず削除しています。ある時点でemployee_listが空になり、employee_list.firstnilになると、dumpの最後の要素としてnilが追加されます。したがって、idnilの係数を取ろうとします。私が言ったように、私は実際に何をしているのか分からないので、問題を解決する方法を教えてもらえません。ここで

は、私はこの問題を解決する方法は次のとおりです。

def exist?(id) 
    $employee_list.find(id) 
end 
関連する問題