数据结构学习:哈希表


数据结构学习:哈希表

简介

**散列表(Hash Table)**也叫哈希表,是根据键(key)直接访问在内存存储位置的数据结构,所以,它是一个通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,加快了查找速度。这个映射函数称为散列函数,存放记录的数组称作散列表。


哈希函数的构造方法

直接定制法

哈希函数为关键字的线性函数如 H ( k e y ) = a ∗ k e y + b H(key) = a*key+b H(key)=akey+b,这种构造方法比较简便均匀,但是限制很大,仅限于地址大小=关键字集合的情况。

数字分析法

假设关键字集合中每个关键字key都由s位数字组成(k1,k2,k3,…,kn),分析key中全体数据,并从中提取分布均匀的若干位或他们的组合构成全体。这种方法通常用于数字位数较长的情况,必须数字存在一定规律,且必须知道数字的分布情况。

平方取中法

如果关键字的每一位都有某些数字重复出现频率很高的现象,可以先求关键字的平防止,通过平方扩大差异,而后取中间数位作为最终存储地址。这种方法适合事先不知道数据并且数据长度较小的情况。

折叠法

如果数字的位数很多,可以将数字分割为几个部分,取他们的叠加和作为hash地址,该方法适用于数字位数较多且事先不知道数据分布的情况。

除留余数法

这种方法用得最多, H ( k e y ) = k e y m o d p ( p < = m , m 为 表 长 ) H(key) = key mod p(p <= m,m为表长) H(key)=keymodp(p<=mm)

随机数法

使用随机函数值作为关键字。

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

哈希冲突

不论hash函数设计的如何巧妙,总会有特殊的key导致hash冲突,特别是对动态查找表来说。
解决hash冲突一般有以下几个方法:

  1. 开发定制法
  2. 链地址法
  3. 公共溢出区法
  4. 再散列法

hash表的主要操作

查找

查找过程与构造hash表过程一致,假设采用开放定址法处理冲突,则查找过程为:对于给定的key,计算hash地址index = H(key),如果数组arr[index]值为空,则查找失败;如果数组arr[index]==key,则查找成功;否则使用冲突解决方法求下一个地址,直到查找成功或查找失败。

查找效率

决定hash表查找的ASL因素:

  1. 选用的hash函数
  2. 选用的处理冲突的方法
  3. hash表的饱和度

删除

链地址法是可以直接删除元素的。其他方法是删除之后放入一个原来不存在的数据。


源码

后续补上

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值