我从后端返回的数据包含很多参考数据,我需要有效地访问它,因此我正在考虑创建(对象的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测试http://jsperf.com/testasdfa,在Chrome上,整数查找要快得多(〜25%)。不确定测试方案是否正确。你怎么看?
最佳答案
我的意见是,找到元素的最快方法是通过模块化哈希表。
将playerLookup设置为n个元素的数组,并将该数组的每个元素设置为-1(或某个值,该值可让您知道该位尚未设置)。
当您存储一个playerId时,请将其存储在playerLookup[parseInt(player.id) % n]
中
以这种方式从哈希表中查找项目的工作复杂度为1,但是您上面列出的方法的工作复杂度为x,其中x = playerLookup.length(无论您使用字符串还是数字作为键) 。
若要使哈希表较小,请选择较小的n。 n越小,发生冲突的可能性越大。
冲突
要处理冲突,请将playerLookup的每个元素设置为数组。如果要在已经包含另一位玩家的位置中将playerId添加到playerLookup,请在该位置旁边列出新的玩家(即,现在两者都位于同一位置)。如果您查找一个玩家并在哈希表中找到一个有多个玩家的位置,则只需遍历此数组直到找到该玩家。此迭代的工作复杂度与您想到的第一个实现相同,但是有两个优点:
由于采用了模块化的哈希表,因此甚至不需要发生这种情况
当确实发生这种情况时,我们要遍历的数组平均比您将要实现的原始数组小n倍(其中n是我们的模数变量)。
出于数学原因(具有模数),我建议为n选择一个质数。