- 比较两个字符串可能很昂贵,因此应尽可能避免
- 对字符串进行哈希并比较哈希通常比比较字符串快得多,但重新哈希新的子串每次传统上需要线性时间
- 滚动哈希能够在常数时间内重新哈希新的子串,使其更快、更有效率
我已经在JavaScript中实现了一个滚动哈希,并开始分析滚动哈希、传统重新哈希和仅相互比较子字符串之间的速度差异。
我的研究结果表明,子串越大,传统重新哈希方法运行所需的时间就越长(如预期),而滚动哈希运行非常快(如预期)。然而,相互比较子字符串的运行速度比滚动哈希快得多。这是为什么呢?
为了有所了解,假设函数在约240万个字符的字符串中搜索100个字符的子串的运行时间如下:
- 滚动哈希 - 0.809 秒
- 传统再哈希 - 71.009 秒
- 仅比较字符串(无哈希) - 0.089 秒
为什么字符串比较会比滚动哈希快那么多呢?这是否与JavaScript有关?在JavaScript中,字符串是一种原始类型;这会导致字符串比较以恒定时间运行吗?
我主要的困惑是JavaScript中字符串比较为何如此快速,当我认为它们应该相对较慢。
注:通过“字符串比较”,我指的是像stringA === stringB
这样的内容
注:我在计算机科学社区上提出了这个问题,并被告知应该在这里提问,因为这很可能是JavaScript特有的。
==
、===
、indexOf
等比较操作的内部速度。 - adeneo