所以我有ID作为int32从0到20000,我需要在JavaScript中的数组。因此,数组可能长达20,000个项目。
然后我需要检查几个ID以查看它们是否在该列表中。
最有效的方式是什么,所以我们不会崩溃浏览器的内存?
答案 0 :(得分: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)
如果您的数字范围有限,最有效的方法是将它们存储在打包位数组中,每个数字一位。位数组可以表示为Uint8Array
,然后,检查数字N
是否在数组中(=其位已设置),计算
array[N >> 3] & (1 < (N & 7))