为什么找到给定字符串的哈希值只需要恒定时间?
我正在尝试编写一个优化程序,通过使用字符串哈希来比较两个字符串。
据我所知,字符串的哈希通常由多项式滚动哈希函数定义。在线资源称计算此哈希并进行比较是O(1)的。例如https://cp-algorithms.com/string/string-hashing.html中说道:
“字符串哈希背后的思想是:我们将每个字符串映射成一个整数,并比较这些整数而不是字符串。这样做可以将字符串比较的执行时间降至O(1)。”
然而,实际实现(根据https://cp-algorithms.com/string/string-hashing.html)这个哈希函数需要遍历整个字符串:
这样做是否保证了比较两个字符串的线性时间复杂度,而不是O(1)?任何帮助都将不胜感激!
我正在尝试编写一个优化程序,通过使用字符串哈希来比较两个字符串。
据我所知,字符串的哈希通常由多项式滚动哈希函数定义。在线资源称计算此哈希并进行比较是O(1)的。例如https://cp-algorithms.com/string/string-hashing.html中说道:
“字符串哈希背后的思想是:我们将每个字符串映射成一个整数,并比较这些整数而不是字符串。这样做可以将字符串比较的执行时间降至O(1)。”
然而,实际实现(根据https://cp-algorithms.com/string/string-hashing.html)这个哈希函数需要遍历整个字符串:
long long compute_hash(string const& s) {
const int p = 31;
const int m = 1e9 + 9;
long long hash_value = 0;
long long p_pow = 1;
for (char c : s) {
hash_value = (hash_value + (c - 'a' + 1) * p_pow) % m;
p_pow = (p_pow * p) % m;
}
return hash_value;
}
这样做是否保证了比较两个字符串的线性时间复杂度,而不是O(1)?任何帮助都将不胜感激!
std::string
的包装器,记录哈希值以及string
,但我怀疑这里是否是这种情况。 - user4581301