我使用词典(关联数组,哈希表,这些同义词中的任何一个)。
用于唯一标识值的键是相当长的字符串。但是,我知道这些字符串的尾部往往不同,而不是头部。
在JS对象中查找值的最快方法是测试是否存在
object[key]
,但在相当大的词典( +1000条)中,非常长,大致相似的键( +100 chars )的情况也是如此?
是否有这种情况的替代方案,或者这是一个完全没有实际意义的问题,因为按键访问值已经非常快了?
答案 0 :(得分:0)
长话短说;它并不重要。 JS将在内部使用哈希表(正如您已经说过的那样),因此需要计算用于插入的键的哈希值(在某些情况下)以访问元素。
计算哈希值(对于大多数合理的哈希函数)对于长键而言比短键需要稍长一些(我会猜测线性更长),但这些变化是在尾部还是在头部。
您可以决定翻转自己的哈希值,以某种方式缓存这些哈希值,并将它们用作键,但这将由您来处理哈希冲突。很难做到比默认实施更好,而且几乎肯定不值得这么麻烦。
此外,对于只有1000个元素的关联数组,可能这些都不重要。现代CPU可以每秒处理接近/大约数十亿条指令。即使只是通过整个阵列的直线搜索也可能表现得很好,除非你必须经常这样做。
答案 1 :(得分:0)
哈希表(字典,地图等)首先检查哈希码,然后,如果必要(如果是碰撞 - 至少两个密钥具有相同的哈希码)执行equals
。如果遇到性能问题,首先要检查的是恕我直言,哈希码是冲突。可能会出现(糟糕的实现或奇怪的密钥)哈希代码,例如,3个第一个字符(当然,这是夸张的夸张):
"abc123".hashCode() ==
"abc456".hashCode() ==
...
"abc789".hashCode()
所以你有很多碰撞,必须执行等于,最后减慢 O(N)复杂程序。在这种情况下,你必须考虑更好的哈希。