哈希冲突之拉链法

解决哈希冲突一种比较直接的办法就是,将大小为M的数组的每一个元素指向一条链表,链表中的每一个节点都存储一个哈希值为该索引的键,这就是拉链法。

该方法的基本思想就是选择足够大的M,使得所有的链表都尽可能短,以保证查找的效率。对采用拉链法的哈希实现的查找分为两步,首先是根据哈希值找到对应的链表,然后沿着链表顺序找到相应的键。使用链接法在最坏的情况下,也就是将所有的key映射到同一个槽中了,这样哈希表就退化成一个链表,这样的话,操作链表的时间复杂度则变成了O(n),这样哈希表的性能优势就没有了,所以选择一个合适的哈希函数是最为关键的。

首先分配一个指针数组,数组的每个元素是一个链表的头指针,每个链表就是一个槽。

目前PHP中HashTable的哈希冲突解决方法就是链接法

与开放定址法相比,链接法有如下几个优点:

  1. 拉链法处理冲突简单,且无堆积现象,即非同义词绝不会发生冲突,因此平均查找长度较短;
  2. 由于拉链法中各链表上的节点是动态申请的,故它更适合造表前无法确定表长的情况;
  3. 开放寻址法为减少冲突要求装填因子α较小,故当节点规模较大时会浪费很多空间。而拉链法中可取α≥1,且节点较大时,拉链法中增加的指针域可忽略不计,因此节省空间;
  4. 在用拉链法构造的哈希表中,删除结点不能简单地将被删结点的空间置为空,否则将截断在它之后填入散列表的同义词结点的查找路径。这是因为各种开放地址法中,空地址(即开放地址)都是查找失败的条件。因此在用开放地址法处理冲突的哈希表上执行删除操作,只能在被删结点上做删除标记,而不能真正删除节点。

链接法的缺点:

指针需要额外的空间,故当结点规模较小时,开放定址法较为节省空间,而若将节省的指针空间扩大散列表的规模,可是装载因子变小,这又减少了开放定址法中的冲突,从而提高平均查找速度。


参考

1.深入理解PHP内核-哈希表

2.查找算法--哈希表查找

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值