码迷,mamicode.com
首页 > 其他好文 > 详细

字符串RK-Hash

时间:2018-02-27 23:36:32      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:不同的   二分   冲突   tar   div   比较   ash   子串   nbsp   

此文转自https://www.cnblogs.com/travelller/p/8318584.html

RK-hash 字符串

 1.基本思想

hash基本思想:将Object通过函数转化成数值,则可以通过比较hash值来比较Object是否相等。。

RK-hash基本思想:将字符串转化成数值。

 

2.具体做法

设有一个字符串S,长度|S|=n,该字符串的字符集的元素个数小于等于d,则字符串S可以看成一个n位的d进制数。

将S的前i位前缀S[0...i]?映射为整数的递推公式为:hash[i]=(hash[i-1]*p+idx(s[i]))%mod

多项式计算:hash[i] = S[i] + d * (S[i-1] + d * (S[i-2] + …+ d * (S[1] + d*S[0])…))

将S的子串S[l...r]映射为整数的公式为:hash[l...r]=(hash[r]-hash[l-1]*(p^(r-1+1)))%mod

 

3.冲突——不同的字符串映射到同一个整数

虽然是小概率事件,但是有可能出现冲突,解决的方法是:将d选一个较大素数(131),mod选一个大素数(1e9+7、1e9+9=1000000009)

Double hash 也是降低冲突概率的一个方式。即:取两个mod值(如 :1e9+7、1e9+9)分别计算hash值hash1、hash2,用pair<hash1 , hash2>代表一个串。

 

4.hash+二分

hash字符串常与二分连用(如本题),但是注意!二分的不是hash(混乱不具备单调性),而是字符串的长度。本题是对字符串长度进行二分,判断是否hash值相等。若相等,继续向右判断所求子串是否可以更长,若不相等,向左判断直至hash相等。

字符串RK-Hash

标签:不同的   二分   冲突   tar   div   比较   ash   子串   nbsp   

原文地址:https://www.cnblogs.com/sineagle/p/8480892.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!