Hash

学习心得

哈希表

  1. 作用:
    将大的值域映射到小的0~n的范围里
  2. 写法:
    x mod 105
  3. 存储结构
    处理冲突的方法
    (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;
}
  1. 注意:
    C++中负数取模得负数,故应取模 +N 再取模
    (x % N + N) % N
    两种方法均只有添加/ 查找某一元素
    若实现删除,则开数组 bool 变量在节点打标记
    离散化是特殊的哈希方式,保序

  2. 字符串哈希方式
    字符串前缀哈希法
    作用:快速判断两个字符串是否相同,时间复杂度 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
    图1

  • 刷题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值