查找算法总结(二)

三、哈希查找

3.1基本概念

1、哈希技术又称为三列技术,基本思想是在记录的存储位置和它的关键字之间建立一个确定的对应关系。
2、哈希函数:将关键字映射为检索表中适当存储位置的函数h(key)称为哈希函数,也成为散列函数或者杂凑函数。
3、哈希地址:利用哈希函数来实现从记录的关键字值到该记录在检索表中存储位置地址的计算,哈希函数h(key)的值也称为哈希地址,散列地址,杂凑地址。把用哈希函数h(key)组成检索表并利用h(key)进行检索的这种方法成为哈希方法,散列法,杂凑法。
4、哈希表:采用哈希技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为哈希表。
5、哈希地址冲突:对于两个不同的关键字k1≠k2,但是h(k1)=h(k2),即两个不同的记录需要存放在用一个存放地址的现象。k1和k2相对于h称为同义词。经过h变换后,可能会将不同的关键字值映射到同一个哈希地址上,这种现象称为地址冲突。比如对于序列(4,17,1,53,…)选取h(key)=key%13时,就会出现4和17在同一个位置。解决的思路有两个:1)、选择一个计算简单且地址冲突尽可能少的哈希函数;2)、出现地址冲突时采取措施来消除冲突。

3.2哈希函数的构造方法

常用的哈希构造方法有如下7种:
1、直接定址法:
采取关键字的某个线性函数值为哈希地址,即 h(key)=a*key(a为常数)。这种方法比较实用与关键字集中分布的情况,例如对年龄为1到120的人口统计,年龄作为关键字,哈希函数可选取a=1的情况,即h(key)=key。
2、数字分析法:
根据关键字在各个位上的分布情况,选取分布比较均匀的若干位组成哈希地址。例如对于一个班的学生记录,可选取最后的几位为哈希地址。
3、平方取中法:
对关键字平方后,按照散列表大小,取中间的若干位作为散列地址。这种方法多用于预先不知道关键字的全部情况,而一个数的平方之后的中间几位和数的每一位都相关。
4、折叠法:
将关键字从左到右分割成位数相等的几部分,将这几部分相加,按照哈希表的表长去后几位作为哈希地址。对于关键字书位数较多,且每位数字分布大致均匀,而哈希地址范围有限的情况可以使用这种方法。
5、除留余数法:
即h(key)=key%p,一般情况下p不超过哈希表长m的最大素数。例如表长150,可以选取p=149。这种方法计算简单,效果好,比较常用。
6、乘余取整法:
以关键字乘以常数A,取其小数部分之后再乘以整数B,取其整数部分作为哈希地址。其中B依赖于哈希表的表长m,A依赖于关键字集合的特征。
7、随机数法:
选择一个随机数,去关键字值的随机函数值为相应记录的哈希地址。即h(key)=random();其中random为随机函数,此方法常用于关键字长度不等的情况下来构造哈希函数。

3.3处理冲突的方法

1、开放定址法:
把哈希表中的空位置向处理地址冲突开放:当地址冲突时,使用某种方法探查哈希表中的空位置,找到时就将地址冲突的记录插入。
探查的方法一般有线性探查,平方探查和随机探查。
1)、线性探查将哈希表看成环形表,冲突时一次探查冲突地址后面的+1,+2位置,知道找到空位置。使用此方法容易造成堆积现象,即不同的哈希地址的记录争夺同一个后继哈希地址的现象。
2)、平方探查则是依次探查1^2,-1^2,2^2,-2^2,……。
3)、随机探查是用一个随机数作为地址位移来计算下一个位置的地址。

2、链地址法:
将哈希地址相同的数据存储到同一个链表中,所以不会产生堆积,平均查找长度较小;而且单链表中的节点是动态生成的,便于表长经常发生变化的情况。

此外还有建立公共溢出区法:建立一个公共溢出表,所有的地址冲突都填入溢出表;再散列法:为了消解地址冲突,在选择一个哈希函数处理。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值