散列(hash)表以及解决冲突的方式

把查找表中的关键字映射成该关键字对应地址的函数,散列函数可能会把两个或两个以上的不同关键字映射到同一地址,称这种情况为冲突,这些发生碰撞的不同关键字成为同义词。

1散列函数的构造方法

    1)直接定址法

    直接取关键字的摸个现行函数值为散列地址,散列函数为H(key)=a*key+b,其中a和b是常数,这种方法最简单,并且不会产生冲突,适合关键字分布基本连续的情况。

    2)除留余数法

    最简单,最常用,常用方法假设散列表长度为m,取一个不大于m但最接近或等于m的质数p,使用公式H(key)=key%p,除留余数法关键是选好p,是每一个关键字通过该函数转换后等概率地映射到散列空间上的任意地址,从而尽可能减少冲突的可能性

    以上两种方法最常用,但还有数字分析法,平方取中法,折叠法

2处理冲突的方法

1)开放定址法

数学递推公式:H=(H(key)+d)%m  其中m表示散列表表长,d为增量序列,即步长。

        ①线性探测法:冲突发生时,顺序查看表中下一个单元,直到查找到一个空闲单元或者查表全表(当查找到表尾地址m-1时,下一个探测地址为表首地址0)

        缺点:可以使第i个散列地址的同义词存入到第i+1个散列地址,这样本应该存入到第i+1个散列地址的元素就争夺第i+2个散列地址,从未造成大量的元素在相邻的散列地址堆积起来,大大降低了查找效率。

        ②平方探测法

        d=1^2,-1^2,........,k^2,-k^2,其中K<=m/2,m必须是一个可以表示成4K+3的质数,又称二次探测法。

        优缺点:可以避免堆积的产生,但是不能探测到散列表上所有的单元,但是至少能探测到一半单元。

        ③再散列法

        使用两个散列函数,当第一个散列函数得到的地址发生冲突之后,利用第二个散列函数计算该关键字的地址增量。再散列法中,最多经过m-1次探测会表里表中所有位置

        ④伪随机序列法

        当d=伪随机数序列,成为伪随机序列法

2)拉链法

如图所示,同样很简单...

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

想做一个offer收割机

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

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

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

打赏作者

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

抵扣说明:

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

余额充值