2016-07-23 3 views
1

私は0から20000になるint32のIDを持っているので、それらをJavaScriptの配列に配置する必要があります。だから、アレイは20,000アイテムほどの大きさであるかもしれません。Javascript:20,000の数値を格納してチェックする最も効率的な方法は?

次に、いくつかのIDがそのリストに含まれているかどうかを確認する必要があります。

これを行う最も効率的な方法は何なので、ブラウザのメモリがクラッシュすることはありませんか?

+0

は、あなたが何かを試してみました計算?私たちにいくつかのコードを教えてくれますか? – tptcat

+0

この他の質問が参考になるかもしれません。また、オブジェクトが配列内にあるかどうかをチェックする最も効率的な方法を指します。 http://stackoverflow.com/questions/237104/how-do-i-check-if-an-array-includes-an-object-in-javascript – Davis

+0

20000の配列がNCSAモザイクの問題になる可能性がありますが、今日のどのブラウザでも、あなたは「ブラウザのメモリをクラッシュさせる」ということを疑うでしょう。 –

答えて

1

メモリを減らしたい場合は、数字を16ビットの符号なし整数の配列に格納します。これにより、0〜65535の数値を格納できます。

ただし、検索が遅くなる可能性があります。そして20000の数字は過度のメモリを無駄にしません。

20000 * 64 bit = 1280000 bit = 160000 byte = 156.25 kibibyte 

私はSetまたはオブジェクトを提案します。設定操作は、平均でサブラインにする必要があります。

var s = new Set(); 
s.add(id); // store id 
s.has(id); // check id 
s.delete(id); // remove id 
s.size; // count ids 
for(var id of s) {} // iterate ids, in insertion order 
var s = Object.create(null); 
s[id] = true; // store id 
id in s; // check id 
delete s[id]; // remove id 
for(var id in s) {} // iterate stringified ids, in implementation-defined order 
1

あなたの番号の範囲が限られている場合、最も効率的な方法は、パックされたビット列、番号ごとに1ビットでそれらを格納することです。ビット配列は、(=そのビットがセットされている)数Nが配列であるかどうかを確認するために、そして、Uint8Arrayとして表すことができ、

array[N >> 3] & (1 < (N & 7)) 
関連する問題