热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

哈希函数的构造方法以及哈希表解决冲突的方式

哈希表哈希表的思想就是在待查记录的关键字值和它的存储位置之间建立一个确定的对应关系则查找时不必再进行关键字值间的比较。根据设定的哈希函数及处理冲突的方法将查找表中各数据元素存储在

哈希表

哈希表的思想就是在待查记录的关键字值和它的存储位置之间建立一个确定的对应关系则查找时不必再进行关键字值间的比较。
根据设定的哈希函数及处理冲突的方法将查找表中各数据元素存储在一段有限的连续空间中,即得哈希表。

这里有两个比较重要得问题:哈希函数的构造、处理冲突的方法。


哈希函数的构造方法


1、直接定址法

直接根据数据的值来映射到地址,比如对数字10、11、12、13…可以将其映射到一块连续的内存中。


2、数字分析法

根据数据的某些数字(比如百位和十位数字)来映射到地址。


3、平方取中法

若关键字比较短,则可先对关键字值求平方,然后取运算结果的中间几位为哈希地址。


4、折叠法

将关键字值分割成位数相同的几个部分,然后取这几部分的叠加和(舍去进位)作为哈希地址。


5、除留余数法

H(key)=key%13


处理冲突的几种方法

处理冲突是指对于一个待插入哈希表的数据元素,若按给定的哈希函数求得的哈希地址已被占用,则按一定规则求下一哈希地址,如此重复,直至找到一个可用的地址以保存该元素。


1、开放地址法

在这里插入图片描述
基本思想是,如果映射的地址被占用了,在哈希函数值的基础上加上指定数值,这样就可以把冲突的地址给错开,然后重新开辟新的地址用来存储。根据增量值的不同,分为线性探测再散列和二次探测再散列。

线性探测例子:
下面在映射18时,发现18%7=4,但是哈希表的4已经被占用,对4进行加1,映射到5,发现5是空的,放到位置5即可。
在这里插入图片描述
当值为34时,发现哈希函数值为6,但是已经被占用,这时对其加1,发现0的位置再次被占用,那就在此基础上再次加1(实际就是加2),发现1位置是空的,正好可以放置元素。
在这里插入图片描述
这个例子也是如此:
在这里插入图片描述

关于二次探测方式,和线性探测方式相似~
在这里插入图片描述

比如对68来说,68%11=2,结果2处被占用,这时对2+12=3,结果发现3也被占用,这时对3-12=2,发现2再次被占用,这时对2+2^2=6,6位置未被占用,放入即可。


2、链地址法

将所有按给定的哈希函数求得的哈希地址相同的关键字存储在同一线性链表中,且使链表按关键字有序(比如大小等属性)。
在这里插入图片描述


3、公共溢出区

若关键字所对应的哈希地址已被占用,则保存到公共溢出区中。一般在开辟地址的时候会产生哈希地址和公共溢出区两块~
在这里插入图片描述在这里插入图片描述


4、再哈希法

再哈希法的基本思想是同时构造多个不同的哈希函数:
Hi=RH1(key),i=1,2,3,…k
当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)…,直到冲突不再产生。这种方法不易产生聚焦,但增加了计算时间~


如在哈希表中查找元素

在哈希表中查找数据元素的过程与将数据元素插入哈希表的过程基本一致,即:
根据待查关键字值,按给定的哈希函数,求哈希地址;若该地址上无数据元素,则查找失败。
若地址上有数据元素则进行关键字值间的比较;
若相等,则查找成功;
若不等,则按冲突处理方法求下一可能的存储地址。

虽然哈希表在关键字值与存储位置间建立了映像,但由于冲突的存在,查找时仍需进行关键字之间的比较,因此仍以查找成功时的平均查找长度和查找不成功时的比较次数作为衡量查找效率的依据。


推荐阅读
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • 本文介绍如何调整Element UI组件的边框样式,以确保内容与边框之间有足够的间距,并展示如何通过CSS实现更好的布局效果。 ... [详细]
  • 深入理解ASP.NET MVC中的_ViewStart.cshtml
    本文介绍了_ViewStart.cshtml文件在ASP.NET MVC 3.0及以上版本中的作用和使用方法。该文件位于Views目录下,主要用于统一配置视图布局和其他全局设置。 ... [详细]
  • 叶酸聚乙二醇羧基化合物(FA-PEG-COOH)
    本产品为叶酸修饰的聚乙二醇羧基衍生物,英文名称为FA-PEG-COOH或Folic acid-PEG-acid。其分子量范围包括1k、2k、3.4k、5k、10k和20k,并可根据客户需求定制。该化合物适用于科研实验,具有高纯度和良好的水溶性。 ... [详细]
  • 配置多VLAN环境下的透明SQUID代理
    本文介绍如何在包含多个VLAN的网络环境中配置SQUID作为透明网关。网络拓扑包括Cisco 3750交换机、PANABIT防火墙和SQUID服务器,所有设备均部署在ESXi虚拟化平台上。 ... [详细]
  • 本文探讨了如何在iOS开发环境中,特别是在Xcode 6.1中,设置和应用自定义文本样式。我们将详细介绍实现方法,并提供一些实用的技巧。 ... [详细]
  • 本文探讨了使用C#在SQL Server和Access数据库中批量插入多条数据的性能差异。通过具体代码示例,详细分析了两种数据库的执行效率,并提供了优化建议。 ... [详细]
  • 基于JQuery实现的评分插件
    本文介绍了一个使用JQuery创建的交互式评分控件。当用户将鼠标悬停在星星上时,左侧的星星会变为实心,右侧保持空心,并显示对应的评分等级;移开鼠标后,所有星星恢复为空心状态。 ... [详细]
  • Hadoop发行版本选择指南:技术解析与应用实践
    本文详细介绍了Hadoop的不同发行版本及其特点,帮助读者根据实际需求选择最合适的Hadoop版本。内容涵盖Apache Hadoop、Cloudera CDH等主流版本的特性及应用场景。 ... [详细]
  • 本文介绍如何使用MFC和ADO技术调用SQL Server中的存储过程,以查询指定小区在特定时间段内的通话统计数据。通过用户界面选择小区ID、开始时间和结束时间,系统将计算并展示小时级的通话量、拥塞率及半速率通话比例。 ... [详细]
  • 本文探讨了如何通过预处理器开关选择不同的类实现,并解决在特定情况下遇到的链接器错误。 ... [详细]
author-avatar
手机用户2602915241
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有