我从后端返回的数据包含很多参考数据,我需要有效地访问它,所以我正在考虑创建(object的id)=> (对象本身)类型查找。对象的ID以字符串形式返回,我想知道整数是否比字符串更快作为哈希键?
playerLookup = {};
for (var i = 0; i < players.length; i++) {
var player = players[i];
playerLookup[player.id] = player;
// vs.
playerLookup[parseInt(player.id)] = player;
}
根据jsperf test http://jsperf.com/testasdfa,Chrome上的整数查找速度相当快(约25%)。不确定是否正确测试了场景。你觉得怎么样?
答案 0 :(得分:1)
我的观点是找到元素的最快方法是通过模块化哈希表。
使playerLookup成为一个包含n个元素的数组,数组的每个元素都设置为-1(或者某个值让你知道该位尚未设置)。
存储playerId时,请将其存储在playerLookup[parseInt(player.id) % n]
以这种方式从哈希表中查找项目的工作复杂度为1,但上面列出的方法的工作复杂度为x,其中x = playerLookup.length(无论您是使用字符串还是数字作为键)。
要使哈希表更小,请选择较小的n。 n越小,我们就越有可能发生冲突。
要处理冲突,请将playerLookup的每个元素都设为一个数组。如果你在一个已经包含另一个玩家的地方添加一个playerId给playerLookup,那么将新的一个列在这个旁边(即现在两个都在同一个地方)。如果你查找一个玩家并在散列表中找到一个包含多个玩家的地点,只需遍历这个数组直到找到玩家。此迭代将与您考虑的第一个实现具有相同的工作复杂性,但具有两个优点:
由于模块化哈希表,它甚至不太可能发生
当它发生时,我们正在迭代的数组平均比你原来实现的数组小n倍(其中n是我们的模数变量)。
由于数学原因(使用模数),我建议为n选择素数。