【问题标题】:isn't computing hash value by polynomial rolling for string O(n), where n is the string size?不是通过多项式滚动计算字符串 O(n) 的哈希值,其中 n 是字符串大小?
【发布时间】:2019-05-03 21:26:57
【问题描述】:

只需阅读有关字符串散列和多项式散列函数的信息即可进行计算。 在我看来,计算 hash(string) 的时间复杂度是 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) 吗?

【问题讨论】:

  • 不是因为你有n个字符串,这些字符串的长度为n,加上n的时间复杂度> 长度为 k 的字符串确实是 O(nk).

标签: string algorithm data-structures hash


【解决方案1】:

简短回答:假设您插入 n 个长度为 n 的字符串,推理是正确的,但长度为字符串由要散列的字符串数量决定,有点奇怪

如果计算是 O(N),那么散列 N 个字符串不是 O(N2)?

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

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

【讨论】:

    【解决方案2】:

    是的,散列长度为 N 的 N 个字符串是一个 O(N²) 过程。 (虽然在实践中,你很少会遇到这种巧合的情况。)

    【讨论】:

      猜你喜欢
      • 2013-09-02
      • 2017-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 2012-04-15
      • 2017-01-16
      相关资源
      最近更新 更多