哈希表
1.哈希表的两种写法
2.字符串的哈希方法
哈希表的两种写法
具体内容点击查看
模拟散列表
1 | 维护一个集合,支持如下几种操作: |
取mod的值
h(k) = k mod m
哈希的时候取mod的数一般取成质数,并且要离2的整次幂尽可能远。这样冲突的概率是最小的。
1 |
|
拉链法
点击查看
拉链法就是在数组上开槽,上面接链表,用来存冲突的数
1 |
|
开放寻址法
点击查看
1 | //只开了一个一维数组 |
字符串的哈希方法
字符串前缀哈希法
字符串前缀哈希法很好,当我们需要判断两个字符串是不是相等的时候就可以用这个方法
字符串哈希法除了无法处理循环节的问题,其他kmp能做的,字符串哈希都能做
s1:预处理所有前缀的哈希
h[i] = h[i - 1] * p + str[i]
s2:
- 先将字符串看成一个p进制的数,有几个字符就是几位
- 把p进制的数转化成10进制的数,每一位上的数乘以p的相应次幂
- 最后mod一个数q,就成功将任意一个字符串映射成0~q-1之间的一个数
注意:①不能映射成0
②这个方法不考虑冲突,经验值:p = 131或13331;用这个值99999%不会产生冲突
q = 2^64(用unsigned long long 来存储h[],相当于取mod 2^64,因 为超出范围会溢出)
s3:利用所有前缀的哈希值,可以求出字符串中所有子串的哈希值
例:已知h[R],h[L],求字符串L到R的哈希值?
利用这个公式 h[R] - h[L-1] * p^(R-L+1) 即可求得子串的哈希值
例题:字符串哈希
1 | 给定一个长度为 n 的字符串,再给定 m 个询问,每个询问包含四个整数 l1,r1,l2,r2,请你判断 [l1,r1] 和 [l2,r2] 这两个区间所包含的字符串子串是否完全相同。 |
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 adomais's blog!
评论






