hash(哈希散列) 数据结构-9

这里不讲解hash基础,只是用于复习之用。
hash原理就是通过散列函数hash(key),将key转换为需要查找的内容在hash表中实际的位置,然后取出来即可。散列函数的选择也是hash很重要的一部分,下面就讲解了几种散列函数。
在使用哈希表过程中时会出现冲突的,就是两个关键值key在转换之后对应的值一样。这时候就需要排解冲突,我觉得采用开放定址(open addressing)是最好的。开放定址,采用相关查找链,如果遇到了冲突,则继续查找下去,直到找到合适的位置。采用特定标志,如果需要删除某项,直接设置删除标志即可。


散列函数:
     1、除余法  hash(key) = key % M M为素数:覆盖充分、映射均匀
        缺点: 1、hash(0) = 0为定点    2、相邻key的散列地址相邻 ( 低阶均匀
     2、MAD法
        hash(key) = (a * key + b ) % M   M为素数、a > 0 、b > 0、 a % m != 0
        b:offset 消除不动点
        a:step 原本相邻--->相邻step
    Geometric Computing 几何计算 : 高维映射到低维 不需高阶均匀
        需要Locality-Sensitive Hashing
      3.
      selecting digits 数字分析  取key中某几位:不有效
      mid-square 平方取中
        取key平方的中间若干位,构成地址。 使得所有位有更多影响。
      4.folding  key等宽
        hash(123456789) = 123 + 456 + 789 
                                          = 123 + 654 + 789
          XOR(位异或)
        hash(110 011 011) = 110 ^ 011 ^ 011
                                            = 110 ^ 110 ^ 011
越随机越好
rand(x+1) = [a*rand(x) ] % M
hashCode(char s[]){                                                                                                                  int i, h;
    for(int n = strlen(s), i = 0; i < n; i++)
    {
        h = h << 5 | h >> 27;
        h += int(s[i]);
    }
    return h;
}
排解冲突
closed addressing     
    1. 多槽位
        key找到bucket,再遍历bucket。整体O(1) 。浪费空间
    2. 独立链
        删除简单。
        缺点:指针空间,动态申请节点。
                  空间不连续,系统缓冲几乎失效。
open addressing
    若要删除采用lazy removel:仅作删除标记:查找略过、插入直接放入
    1.线性试探
        hash(key) + 1 % m
     2.平方试探:若涉及外存,I/O将激增。
        hash(key) + 1^2 % m
     3.双向平方试探
         hash(key) + 1^2 % m
         hash(key) - 1^2 % m
表长M: M = 4 * k + 3素数:查找链表前M项互异。

双平方定理
    任意素数P,可为一对整数平方和。 iff p % 4 = 1.

桶/计数排序:取决于个数n和范围[0 , m)
    计数:反映各字符出现的次数
    accumulation: O(m) 包括该字符之前出现的次数。

vector       rank
list            posi    
BST           key
hashing    value  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猎羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值