散列(hash)

1.构造散列函数:

一个好的散列函数: 计算简单、空间分配均匀

①直接定址法:
h(key) = a * key + b (a、b为常数)

②除留余数法:
h(key) = key mod p (p一般取素数)

③数字分析法:
分析数字关键字的各位变化情况,取比较随机的位作为散列key

④折叠法:
把数字分成位数相等的几个部分,然后叠加

⑤平方取中法:
把数字平方,然后取中间的几位

2.解决冲突:

①开放地址法: 储存效率较高,查找效率较高,但有“聚集”现象(删除只能“懒惰删除”,否则影响查找)
一旦发生冲突,按另一规则(散列函数)寻址另一空地址

hi(key) = (h(key)+di) mod TableSzie (1<= i < TableSize)

  • 线性探测 di = i (1、2、3、4、5、6….)
  • 平方探测 di = ±i^2 (1^2、-1^2、2^2、-2^2….)
  • 双散列 di = i*h2(key) (1、2、3、4….)

如果TableSzie = 4k+3 形式的素数,则平方探测可以探查整个散列表空间

②分离链接法:不需“懒惰删除”即无存储垃圾,但存储和查找效率较低。
将相应位置上冲突的所有存在同一单向链表中

3.性能分析

①散列因子
散列表空间大小m,填入元素个数n
装填因子: α =

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值