散列法(hash法、关键字地址计算法)

散列法,又称为hash法或者关键字地址计算法。时间复杂度为0(理想情况下),是一种key-value的存储方法。核心就是由hash函数决定关键字值和散列地址之间的关系,通过这种关系来组织存储并进行查找等操作。

散列法面临的问题:会发生地址冲突。
(1)如何恰当的构造hash函数,使得结点分布均匀,尽量少的减少冲突。
(2)一旦发生冲突,怎样处理冲突。

以下篇幅主要介绍hash函数的常用构造方法、处理冲突的方法以及和哈希表有关的算法。

这里写图片描述

接下来详细描述这几种构造方法:
① 除留余数法:用每个关键字的value值对p取余,用余数来填hash表。
p取小于或等于表长的最大素数。
② 数字分析法:取每个关键字的某几位作为hash表的地址。
③ 平方取中法:先将每个关键字平方,再按照数字分析法来取中间的几位作为hash表的地址。
④ 分段叠加法:将关键字分成位数相同的几部分,再叠加,用叠加后的结果中的某几位作为hash表的地址。叠加方式分为移位叠加和折叠叠加。
⑤ 基数转换法:将关键字看成另一种进制的数,再转换成为原进制,再取某几位作为散列的地址。

这里写图片描述

接下来详细描述处理冲突的方法:
处理冲突的实际含义就是为产生冲突的地址寻找下一个散列地址。
(1)开放定址法:又被称为再散列法。
① 线性探测再散列:需要注意的是整个表是一个首尾连接的循环表, 每次遇到冲突时位置向后移一位。
② 二次探测再散列:整个表也是一个首尾相接的循环表,每次遇到冲突时位置按照1* 1, 2 * 2,3*3的位置变换顺序左右跳跃式判断。
③ 随机探测再散列:建立一个随机数发生器,并给定一个随机数作为起始点,按随机数的值确定下一个散列地址。

(2)链地址法:把所有具有地址冲突的关键字链在同一个单链表中。

这里写图片描述

接下来介绍哈希表的简单操作算法:
(1)查找过程:
① 根据待查找记录的关键字和建表时的哈希函数计算散列地址。
② 若该地址所对应的地址单元为空,则查找失败,若不为空,则将该单元中的关键字和待查记录的关键字进行比较,如果相等,则查找成功,否则按处理冲突的办法寻找下一个散列地址。

(2)插入过程:
① 通过查找算法找出待插记录在表中的位置,若表中已存在待插记录,则不能再插入。
② 若表中没有待插记录,则需要插入,插入方法是根据查找算法给出一个单元空闲的散列地址,插入即可。

(3) 创建过程:
基于插入算法,依次在一个空表中插入给定序列的关键字。

(4) 删除过程:
基于开放定址法的哈希表没办法真正实现删除操作,只能给被删除结点设置删除标志。
如果执行真正的删除操作,会中断查找路径,删除关键字后找不到比它晚插入且发生过冲突的记录。
如果要对哈希表实现真正的删除操作,最好利用链地址法处理冲突的哈希表。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值