反向字符串比较

时间:2016-05-18 13:13:50

标签: javascript dictionary optimization

我使用词典(关联数组,哈希表,这些同义词中的任何一个)。

用于唯一标识值的键是相当长的字符串。但是,我知道这些字符串的尾部往往不同,而不是头部。

在JS对象中查找值的最快方法是测试是否存在 object[key],但在相当大的词典( +1000条)中,非常长,大致相似的键( +100 chars )的情况也是如此?

是否有这种情况的替代方案,或者这是一个完全没有实际意义的问题,因为按键访问值已经非常快了?

2 个答案:

答案 0 :(得分:0)

长话短说;它并不重要。 JS将在内部使用哈希表(正如您已经说过的那样),因此需要计算用于插入的键的哈希值(在某些情况下)以访问元素。

计算哈希值(对于大多数合理的哈希函数)对于长键而言比短键需要稍长一些(我会猜测线性更长),但这些变化是在尾部还是在头部。

您可以决定翻转自己的哈希值,以某种方式缓存这些哈希值,并将它们用作键,但这将由您来处理哈希冲突。很难做到比默认实施更好,而且几乎肯定不值得这么麻烦。

此外,对于只有1000个元素的关联数组,可能这些都不重要。现代CPU可以每秒处理接近/大约数十亿条指令。即使只是通过整个阵列的直线搜索也可能表现得很好,除非你必须经常这样做。

答案 1 :(得分:0)

哈希表(字典,地图等)首先检查哈希码,然后,如果必要(如果是碰撞 - 至少两个密钥具有相同的哈希码)执行equals。如果遇到性能问题,首先要检查的是恕我直言,哈希码是冲突。可能会出现(糟糕的实现或奇怪的密钥)哈希代码,例如,3个第一个字符(当然,这是夸张的夸张):

  "abc123".hashCode() ==  
  "abc456".hashCode() ==
  ...
  "abc789".hashCode()

所以你有很多碰撞,必须执行等于,最后减慢 O(N)复杂程序。在这种情况下,你必须考虑更好的哈希。