学习心得
哈希表
- 作用:
将大的值域映射到小的0~n的范围里 - 写法:
x mod 105 - 存储结构
处理冲突的方法
(1) 拉链法:
数组长度(模的数)取离2的整次幂尽可能远的质数
大于100000 的第一个质数为100003
大于200000 的第一个质数为200003
(2)开放寻址法:(蹲坑法)
数组长度开到数据范围的2~3倍
memset(h, 0x3f, sizeof h) 每个字节都是0x3f
0x3f3f3f > 109
int find(int x) // x存在,返回x位置;否则,返回x应在的位置
int find(int x){
int t = ( x % N + N ) % N;
while(h[t] != null && h[t] != x){
t++;
if(t == N) t=0;
}
return t;
}
-
注意:
C++中负数取模得负数,故应取模 +N 再取模
(x % N + N) % N
两种方法均只有添加/ 查找某一元素
若实现删除,则开数组bool 变量在节点打标记
离散化是特殊的哈希方式,保序 -
字符串哈希方式
字符串前缀哈希法
作用:快速判断两个字符串是否相同,时间复杂度 O(1)
预处理前缀哈希
核心:字符串看做P进制数
方法:
(1)字符串看做P进制数,每一个字母看做每一位
(2)P进制数转化为十进制数
注意:不能把字母映射成0,不考虑冲突
经验:P取131 或13331,Q取264时一般不会发生冲突
利用前缀哈希计算所有子串哈希
L~R哈希值:h[R]-h[L]PR-L+1
技巧:用unsigned long long 存储h,溢出 与 mod 264等价
KMP 除求字符串循环节外,均可被字符串哈希代替
1.8小结
-
《算法基础课》2h
-
刷题