Hash表


前言

哈希函数就是根据key计算出应该存储地址的位置,而哈希表是基于哈希函数建立的一种查找表。


一、哈希函数的构造方法

1.直接定制法
哈希函数为关键字的线性函数如 H(key)=a*key+b。
这种构造方法比较简便,均匀,但是有很大限制,仅限于地址大小=关键字集合的情况。
2.数字分析法
假设关键字集合中的每个关键字key都是由s位数字组成(k1,k2,…kn),分析key中的全体数据,并从中提取分布均匀的若干位或他们的组合构成全体。
3.平方取中法
如果关键字的每一位都有某些数字重复出现频率很高的现象,可以先求关键字的平方值,通过平方扩大差异,而后取中间数位作为最终存储地址。
4.折叠法
如果数字的位数很多,可以将数字分割为几个部分,取他们的叠加和作为hash地址。
5.除留余数法
H(key)=key MOD p (p<=m m为表长)
很明显,如何选取p是个关键问题。

hash函数设计的考虑因素

1.计算散列地址所需要的时间(即hash函数本身不要太复杂)
2.关键字的长度
3.表长
4.关键字分布是否均匀,是否有规律可循
5.设计的hash函数在满足以上条件的情况下尽量减少冲突

二、哈希冲突

即不同key值产生相同的地址,H(key1)=H(key2)

哈希冲突的解决方案

1.开放定制法
2.链地址法
3.公共溢出区法
建立一个特殊存储空间,专门存放冲突的数据。此种方法适用于数据和冲突较少的情况。
4.再散列法
准备若干个hash函数,如果使用第一个hash函数发生了冲突,就使用第二个hash函数,第二个也冲突,使用第三个……

三、hash表的查找

查找过程为:
对于给定的key,计算hash地址index = H(key)
如果数组arr【index】的值为空 则查找不成功
如果数组arr【index】== key 则查找成功
否则 使用冲突解决方法求下一个地址,直到arr【index】== key或者 arr【index】==null

hash表的查找效率

决定hash表查找的ASL因素:
1)选用的hash函数
2)选用的处理冲突的方法
3)hash表的饱和度,装载因子 α=n/m(n表示实际装载数据长度 m为表长)
一般情况,假设hash函数是均匀的,则在讨论ASL时可以不考虑它的因素
hash表的ASL是处理冲突方法和装载因子的函数

四、hash表的删除

首先链地址法是可以直接删除元素的,但是开放定址法是不行的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值