贡献者: 有机物
字符串哈希和普通的哈希算法类似,字符串哈希是把一个很长的字符串变成一个整数,这样的好处是:如果想比较两个很长的字符串是否相等时,普通算法是遍历一遍整个字符串,如果其中一个字符串的字符和另一个字符串的字符不等,则两个字符串不一样。时间复杂度为
哈希函数通常设计为:取一固定值 unsigned long long
这个变量类型存储哈希值,溢出时就相当于对
举个例子:
先把一个字符串
一般在做哈希的时候,存储哈希的数组会存字符串的前缀哈希值,比如用 h
数组存储字符串的哈希值,h[1] = a
的哈希值,h[2] = ab
的哈希值,这样以此类推。那怎么算前缀哈希值呢?比如我们已经知道了 hash(S)
的哈希值,那么在字符串 hash(S+C) = hash(S) * P + value[C]
。乘 value[C]
就是字符串
举个例子:比如我们知道 hash(abc)
,想算 hash(abcd)
的话就是:hash(abc) * P + value[d]
。
S = "abc"
,C = "d"
hash(S)
=
hash(S+C)
=
hash(abc)=17426
,hash(abc) * 131+4 = 17426 * 4 + 4 = 2282810
。
这样就有了第一个公式:
hash(S+C) = hash(S) * P + value[C]
我们还可以通过前面算的所以前缀哈希值,即 h
数组,可以
如果我们已知字符串 S 的 Hash 值为 H(S),字符串 S+T 的 Hash 值为 H(S+T),
则:H(T) = H(S + T) - H(S) * p^length(T)
举个例子:
我们知道 hash(abcd)
的哈希值为 hash(ab)
的哈希值为 hash(cd)
的哈希值就为:
为了方便,可以开一个数组 p^length(T)
,即
具体的看一道例题:
给定一个长度为
因为字符串中包含大小写英文字母和数字,所以我们把字符的 value
值设置为字符的 ASCII 码。
友情链接: 超理论坛 | ©小时科技 保留一切权利