c++-散列表(哈希表)

什么是散列表

是一种数据结构 他主要是将键值 通过一个哈希函数 映射到表中的一个位置实现快速查找
哈希函数: 例如 键值%17 = 表中的下标位置 键值2004 通过哈希函数后
2007%17 就会得到表中下标的位置 这就是哈希表映射的方法 但是很明显这个值是会重复的 就产生了哈希冲突

如何解决哈希冲突

链表式解决 HashMap的哈希冲突解决方法

请添加图片描述
就用链表的方法 当发生冲突的时候就放到next的位置
请添加图片描述
请添加图片描述

有点

处理冲突简单 平均查找长度较短
用于没办法确定表长度 因为各节点的链式都是动态申请的
删除结点的操作易于实现。只要简单地删去链表上相应的结点即可

缺点

会浪费空间 指针占用较大空间时,会造成空间浪费,若空间用于增大散列表规模进而提高开放地址法的效率。

开放地址

线性探测

就是如果重复了发生了冲突 就往后一格放
请添加图片描述请添加图片描述
结果就是这样
那么最开始15%13 是2 2是空的就放在2那
然后2%13 发现2被占用了 就放在3的位置
再38%13 是12 就放12那
28%13是2 发现2被占用了 往后移发现3也被占用了 再往后移放在4
4%13是4 发现4被占用了就放5
重点! 12%13 发现12被占用了 就循环放到最前面 0的位置

平方探测

发生冲突了 第一次就是+1 第二次-1 第三次+22 第四次-22 第五次32以此类推

双哈希

就是又设置了一个哈希函数 有两个哈希函数 当发生冲突的时候就使用第二个哈希函数
请添加图片描述
请添加图片描述
对2进行哈希的时候就会发现2位置有了 就进行第二个哈希7-(2%7) = 5就在第一个哈希结果的基础上+5 也就是2+5=7如果7还是有了 就再+5

哈希表要满了怎么办

当哈希表存储量超过70%就会再次创建一个新的哈希表 新表的尺寸是原表的两倍以上 一般都选个质数 最后再把之前的数据通过哈希计算放到新表中
请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值