哈希表

一、哈希表(hash table)是一种根据关键字直接访问内存存储位置的数据结构,通过哈希表,数据元素的存放位置和数据元素的关键字之间建立起某种对应关系,建立这种对应关系的函数称为哈希函数。

二、哈希表的构造方法

假设要存储的数据元素个数是n,设置一个长度为m(m>n)的连续存储单元,分别以每个数据元素的关键字Ki(0<=i<=n-1)为自变量,通过哈希函数hash(Ki),把Ki映射为内存单元的某个地址hash(Ki),并将数据元素存储在内存单元中

从数学的角度看,哈希函数实际上是关键字到内存单元的映射,因此我们希望通过哈希函数通过尽量简单的运算使得哈希函数计算出的哈希地址尽量均匀的映射到一系列的内存单元中,构造哈希函数有三个要点:(1)运算过程要尽量简单高效,以提高哈希表的插入和检索效率;(2)哈希函数应具有较好的散列型(散列存储,又称hash存储,是一种力图将数据元素的存储位置与关键码之间建立确定对应关系的查找技术),以降低哈希冲突的概率;(3)哈希函数应具有较大的压缩性,以节省内存。

有三种常用的方法:

(1)直接地址法:以关键字的某个线性函数值为哈希地址,可以表示为hash(K)=aK+C;优点是不会产生冲突,缺点是空间复杂度可能会较高,适用与元素较少的情况;

(2)除留余数法:它是由数据元素关键字除以某个常数所留的余数为哈希地址,该方法计算简单,适用范围广,是经常使用的一种哈希函数,他可以表示为:

hash(K=K mod C),该方法的关键是常数的选取,一般要求是接近或是等于哈希表本身的长度,研究理论表明,该常数选素数(

质数(prime number)又称素数有无限个。质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数)时候效果最好。

(3)数字分析法:该方法是取数据元素关键字中某些取值较均匀的数字来作为哈希地址的方法,这样可以尽量避免冲突,但是该方法适合所有关键字已知的情况,对于想要设计出更加通用的哈希表并不适用。

三、哈希冲突的解决方案

在构造哈希表时,存在这样的问题:对于两个不同的关键字,通过我们的哈希函数计算哈希地址时,却得到了相同的哈希地址。我们将着这种现象称为哈希冲突

哈希冲突主要与两个因素有关

(1)填装因子,填装因子是指哈希表中已存入的数据元素与哈希地址空间的大小的比值(a=n/m);a越小,冲突可能性较大;但是a越小空间利用率也就越小,a越大,空间利用率也就越高,但是冲突的可能也就越大,为了兼顾哈希冲突和存储空间的利用率,通常将a控制在0.6-0.9之间。

(2)与所用的哈希函数的产生,但一个良好的哈希函数得当,就可使得哈希地址尽可能的均匀分布在哈希地址空间上,而减少冲突的产生,但一个良好的函数的得来很大程度上取决与大量的实践。

哈希冲突通常是很难避免的,解决哈希冲突有很多的方法,通常分为两类:

1、开放地址法,它是一类以发生哈希冲突的哈希地址为自变量,通过某种哈希函数得到一个新的空闲内存单元地址的方法,开放地址的哈希冲突函数通常是一组。

2、链表法:当未发生冲突时,直接存放数据,当冲突发生时,把产生冲突数据元素另外存放在单链表中。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值