string - 不是通过字符串 O(n) 的多项式滚动来计算哈希值,其中 n 是字符串大小?

标签 string algorithm data-structures hash

只需阅读有关字符串哈希和多项式哈希函数的知识即可计算它。 在我看来,计算哈希(字符串)的时间复杂度好像是 O(N),其中“N”是字符串大小

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;
}

其中字符串“S”的哈希值可以计算为 S[0] + S[1].P + S[2].P.P + 。 . . S[N - 1].P^(N - 1)

如果计算是 O(N) 那么散列 N 个字符串不是 O(N^2) 吗?

最佳答案

简答:假定您插入了长度为 nn 个字符串,推理是正确的,但是“场景”是字符串由要散列的字符串数决定,有点奇怪

And if the computation is O(N) then isn't hashing N strings is O(N2)?

鉴于字符串的长度与字符串的数量成比例,那么对于给定的哈希算法,这确实会导致 O(n2)。但通常字符串的长度与要散列的字符串数量之间没有关联。

如果字符串的平均长度为k,并且有n个字符串,那么这是一个O(n×k)算法。因此,您是正确的,对象的“大小”会对性能产生影响,当然,哈希算法会随着对象的大小而缩放。

关于string - 不是通过字符串 O(n) 的多项式滚动来计算哈希值,其中 n 是字符串大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53579296/

相关文章:

php - 在 PHP 字符串中查找 youtube 链接并将其转换为嵌入代码?

Java StringUtils.stripEnd 带有句点、连字符或下划线

java - 如何检查字符串数组上的字符值?

javascript - 查看 jQuery 源代码,如何在伪代码中实现此缓动功能?

c - 如何初始化c中函数的返回数组

C++将wchar_t反斜杠插入字符串

c - 如何知道一个点是否在三角形中?

r - 如何在 r 中按最近距离合并两个数据集?

c - 我的删除有问题

c# - 使用大量对象,需要更好的(排序的)性能