这是C++算法基础-数据结构专栏的第三十五篇文章,专栏详情请见此处。
ps:由于这篇文章是数据结构专栏的最后一篇文章,所以下个周就不发文了,预计将把数据结构专栏整理一下。
引入
上节课我们学习了对数字的哈希算法,而这次,我们要学习字符串哈希。
下面我们就来讲字符串哈希的实现。
定义
字符串哈希,全称字符串前缀哈希法,把字符串变成一个p进制数字(哈希值),实现不同的字符串映射到不同的数字。
过程
字符串哈希的一个重要思想就是将一个字符串通过某种特定方式转换为数字再进行哈希。对于一个字符串,把它转换为一个
进制数,计算公式即为
,其中,
的经验值是131或13331,取这两个值的冲突概率低,其次的一个小技巧就是
取2^64,这样直接用unsigned long long存储,溢出的结果就是取模的结果。通过以上两个处理,一般可以理解为不产生哈希冲突。
利用这种方式,我们还可以求出一个字符串子串的哈希值。这个操作和前缀和差不多,前缀和公式:,区间和公式:
,对前缀和不懂的朋友可以看看我这篇博客:一维前缀和的实现。
代码
下面给出字符串哈希的实现代码:
unsigned long long h[N],p[N];
p[0]=1;
for(int i=1;i<=n;i++){
h[i]=h[i-1]*P+str[i];
p[i]=p[i-1]*P;
}
unsigned long long get(int l,int r){
return h[r]-h[l-1]*p[r-l+1];
}
代码解释
第一行的数组,存储字符串前
个字母的哈希值,
存储
;第3行到第7行的作用是初始化;get()函数的作用是计算子串的哈希值。
上一篇-哈希表的实现 C++算法基础专栏文章 下一篇-
每周六更新一篇文章,内容一般是自己总结的经验或是在其他网站上整理的优质内容
点个赞,关注一下呗~