字符串比较与散列

时间:2016-01-16 18:38:18

标签: javascript hash runtime

我最近了解了rolling hash数据结构,基本上是在字符串中搜索子字符串的主要用途之一。以下是我注意到的一些优点:

  • 比较两个字符串可能很昂贵,因此应尽可能避免这样做
  • 散列字符串并比较散列通常比比较字符串快得多,但每次传统上需要线性时间时重新挖掘新的子字符串
  • 滚动哈希能够在固定时间内重新散列新的子字符串,从而使此任务更快,更高效

我继续在JavaScript中实现滚动哈希并开始分析滚动哈希,传统重组之间的速度,并且只是将子串相互比较。

在我的研究结果中,子字符串越大,传统的rehashing方法运行所需的时间越长(正如预期的那样),其中滚动哈希运行得非常快(如预期的那样)。但是,将子字符串比较在一起运行得比滚动哈希要快得多。怎么会这样?

为了透视,让我们说一下,对于100个字符的子字符串搜索〜240万个字符串的函数的运行时间如下:

  • 滚动哈希 - 0.809秒
  • 传统重播 - 71.009秒
  • 只是比较字符串(无散列) 0.089秒

字符串比较如何比滚动哈希快得多?难道它只是与JavaScript有关吗?字符串是JavaScript中的原始类型;这会导致字符串比较在恒定时间内运行吗?

我的主要困惑是如何/为什么字符串比较在JavaScript中如此之快,当时我的印象是它们应该相对较慢。

注意: 通过字符串比较我指的是像stringA === stringB

这样的内容

注意: 我在Computer Science Community上提出了这个问题,并被告知我也应该在这里提出这个问题,因为这很可能是针对JavaScript的。

1 个答案:

答案 0 :(得分:3)

经过一些测试和分析后,我得出的结论是,为什么我的滚动哈希方法的运行速度比单纯比较两个字符串要慢一些。

  • 如果滚动哈希声称在固定时间内运行,那么它如何比比较字符串慢?

    函数相对较慢 - 调用函数比单纯executing code inline稍慢。在我的特殊情况下,一个 每次滚动哈希时都必须在我的对象上调用函数 重新调整其内部窗口,因此运行时间稍长 与字符串比较相比,因为该代码只是内联。特别是因为我的基准测试有滚动哈希" shift"超过200万次迭代,可以更清楚地看到这个功能减慢。

  • 但为什么字符串比较如此之快?

    字符串是原始的 - 基本上,因为strings are a primitive type in JavaScript,尝试比较两个字符串将是最 可能会调用一些直接在其中编码的例程 翻译。这种低水平的评估可以尽快完成 架构可能(类似于比较数字)。

结论

在这种情况下,比较JavaScript中的字符串最终会比滚动哈希更快,因为字符串是 primitive ,因此允许解释器非常快速地使用这些元素,并且因为只需调用函数会产生轻微的开销,并在很小的范围内减慢进程。