2021/06/07 散列表之除留余数法以及平方探测法

  • 给出一个序列:
    47 7 29 11 9 84 54 20 30  

    如何才能对它们进行排序并且要查找它的位置的时候特别方便?

散列表就是找出每一个数据的关键字并且按照关键字存放在特定的位置;

核心思想就是弄一个映射函数H(key),使得key的位置ret=H(key)

除留余数法是找出某个数字p,让位置ret=key%p;

当然很有可能在存放了几个之后就会有重叠位置的情况发生,也就是冲突。

这里解决冲突的方法是平方探测法:让这个重叠的初始位置ret去加Di;

Di是一段序列:1^2,-1^2,2^2,-2^2....  其中i是发生冲突的次数

例如说p=11.存放数字7的时候没问题(ret=7%11=7),然而存放29的时候(ret=29%11=7)

发生了冲突,那么第一次冲突就加1,也就是前进一格.8这个位置没有别的数据,不会冲突,所以存放在8;冲突解决

如果8这个位置也存放了其他的数字,那就是第二次冲突,这次要加D2也就是ret=(-1)=6;倒退一格

如果6这个位置也冲突那么就加D3也就是加4,前进四格...

循环下去直到找到空位置为止. 

这里关键是找到这里的“某个数字p”。除留余数法中的p指的其实是散列表的最大储存空间。一般是比原序列大的素数。取素数是为了减少冲突。

这里的p用T

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值