算法基础—哈希表散列表的构建和处理冲突

news2024/11/24 13:04:06

1 哈希表的构建

1. 直接寻址法

取关键字或者关键字的某个线性函数值作为哈希地址,即H(Key)=Key或者H(Key)=a*Key+b(a,b为整数),这种散列函数也叫做自身函数.如果H(Key)的哈希地址上已经有值了,那么就往下一个位置找,知道找到H(Key)的位置没有值了就把元素放进去.

2. 数字分析法

分析一组数据,比如一组员工的出生年月,这时我们发现出生年月的前几位数字一般都相同,因此,出现冲突的概率就会很大,但是我们发现年月日的后几位表示月份和具体日期的数字差别很大,如果利用后面的几位数字来构造散列地址,则冲突的几率则会明显降低.因此数字分析法就是找出数字的规律,尽可能利用这些数据来构造冲突几率较低的散列地址.

3. 平方取中法

取关键字平方后的中间几位作为散列地址.一个数的平方值的中间几位和数的每一位都有关。因此,有平方取中法得到的哈希地址同关键字的每一位都有关,是的哈希地址具有较好的分散性。该方法适用于关键字中的每一位取值都不够分散或者较分散的位数小于哈希地址所需要的位数的情况。

4. 折叠法

折叠法即将关键字分割成位数相同的几部分,最后一部分位数可以不同,然后取这几部分的叠加和(注意:叠加和时去除进位)作为散列地址.数位叠加可以有移位叠加和间界叠加两种方法.移位叠加是将分割后的每一部分的最低位对齐,然后相加;间界叠加是从一端向另一端沿分割界来回折叠,然后对齐相加.

5. 随机数法

选择一个随机数,去关键字的随机值作为散列地址,通常用于关键字长度不同的场合.

6. 除留余数法

取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址.即H(Key)=Key MOD p,p<=m.不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。对p的选择很重要,一般取素数或m,若p选得不好,则很容易产生冲突。一般p取值为表的长度tableSize。

2 哈希表的冲突处理

何为哈希碰撞:
如果有两个数的余数相等,那么我的存储位置就会是在哈希表中的同一个下标之下,我们称这种情况为哈希碰撞。

2.1 开放地址法

开放地址法的基本思想是:有冲突的时候就去寻找下一个空的散列表地址,只要散列表足够大,空的散列地址总能找到,并将数据元素存入

除留余数法 H i = ( \mathrm{H}_{\mathrm{i}}=\left(\right. Hi=( Hash(key) + d i ) \left.+\mathrm{d}_{\mathrm{i}}\right) +di) mod m m m
d i d_i di 为增量序列

线性探测法

线性探测法的基本思想是,假定哈希函数为_H_(key),哈希表的地址区间长度为_m_,并将哈希表看成是一个循环空间,则线性探测法的探测地址序列可表示为

d i \mathrm{d}_{\mathrm{i}} di 1 , 2 , … m − 1 1,2, \ldots \mathrm{m}-1 1,2,m1

用线性探测法处理冲突,思路清晰,算法简单,但线性探测法很容易产生堆聚现象。所谓堆聚现象,就是存入哈希表的记录在表中练成一片。按照线性探测法处理冲突,如果堆聚的记录越多,则发生冲突时的探测次数越多。

二次探测法

d i d_i di 1 2 , − 1 2 , 2 2 , − 2 2 , … , q 2 1^2,-1^2, 2^2,-2^2, \ldots, q^2 12,12,22,22,,q2 二次序列

二次探测能有效避免“聚集”现象,但是不能够探测到哈希表上所有的存储单元,但是至少能够探测到一半。

例题:
设哈希表长为11,哈希函数为Hash (key)=key%11。存在关键码{43,7,29,22,16,92,44,8,19},采用二次探测法处理冲突,建立的hash表为( )

  • A、  
  • B、

     

  • C、 
  • D、其他几项都不对

43,7,29,22,16,92,44,8,19
43%11 = 10 H[10] = 43
7%11 = 7 H[7] = 7
29%11 = 7 H[7] = 29 f发生哈希冲突,那么向右移动一位 H[8] = 29
22%11 = 0 H[0] = 22
16%11 = 5 H[5] = 16
92%11 = 4 H[4] = 92
44%11= 0 H[0] = 44 发生了哈希冲突 ,那么向右移动一位 H[1] = 44
8 %11= 9 H[ 9] = 8
19 %11= 8 H[ 8] =19 发生哈希冲突 ,先向右边移动一位, H[ 9] =19 发生冲突,那么向左移动一位H[ 7] =19 依旧发生冲突,向右边移动两位,H[10] = 19 依旧冲突。向左移动两位,H[ 6] =19
故选择A

2.2链地址法

链地址法也成为拉链法。其基本思路是:将所有具有相同哈希地址的而不同关键字的数据元素连接到同一个单链表中。如果选定的哈希表长度为m,则可将哈希表定义为一个有m个头指针组成的指针数组T[0…m-1],凡是哈希地址为i的数据元素,均以节点的形式插入到T[i]为头指针的单链表中。并且新的元素插入到链表的前端,这不仅因为方便,还因为经常发生这样的事实:新近插入的元素最优可能不久又被访问。

链地址法特点

(1)拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;
(2)由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;
(3)开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间;
(4)在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。而对开放地址法构造的散列表,删除结点不能简单地将被删结点的空间置为空,否则将截断在它之后填人散列表的同义词结点的查找路径。这是因为各种开放地址法中,空地址单元(即开放地址)都是查找失败的条件。因此在用开放地址法处理冲突的散列表上执行删除操作,只能在被删结点上做删除标记,而不能真正删除结点。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/460403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

idea中导入spring源码;在spring源码中添加注释

标题&#xff1a;idea中导入spring源码;在spring源码中添加注释 我是跟着他操作的&#xff0c;下文是一些补充说明&#xff1a; 这个也可以借鉴 gradle下载链接【使用网盘下载】,不过有的没有&#xff0c; gradel下载链接&#xff1a;这个比较全 1.Spring源码编译环境 spr…

股票期货模拟交易有用吗?股票期货模拟交易心得

股票期货市场为了满足新用户的需求&#xff0c;有专门的股票期货模拟交易平台&#xff0c;大家可以在这个平台上进行股票期货的模拟交易&#xff0c;这样可以通过不断总结&#xff0c;丰富我们的知识。下面整理的股票期货模拟交易实验心得&#xff0c;从股票期货模拟交易与实盘…

远程 PC 访问软件

什么是远程电脑 远程电脑是物理上无法访问的计算机。不同分支机构中的漫游用户和员工的设备将是组织中 IT 管理员的远程计算机。 什么是远程 PC 访问 远程 PC 访问是一种控制物理无法触及的设备的功能。计算机、笔记本电脑、端点&#xff01;它们始终分散在全球各地的 IT 环…

【应用部署】Java项目从开发到部署生产完整流程

文章目录 背景一、开发环境二、项目搭建2.1 Maven创建项目2.1.1 创建maven项目2.1.2 引入依赖2.1.3 maven常用命令 三、SpringBoot基础配置四、项目打包4.1 打包jar4.2 打包war4.2.1 修改项目打包为war包4.2.2 排除内嵌的tomcat&#xff0c;引入外部tomcat4.2.3 添加servlet-ap…

数据库基础篇 《10.创建和管理表DDL》

目录 1. 基础知识 1.1 一条数据存储的过程 1.2 标识符命名规则 ​1.3 MySQL中的数据类型 ​ 2. 创建和管理数据库 2.1 创建数据库 2.2 使用数据库 2.3 修改数据库 2.4 删除数据库 3. 创建表 3.1 创建方式1 3.2 创建方式2 ​3.3 查看数据表结构 4. 修改表 4.1…

2023华为软件精英挑战赛,探寻软件人才与科技创新的最优解

作者 | 曾响铃 文 | 响铃说 今天&#xff0c;软件行业正呈现出江河入海一般的大汇流趋势。 一方面是技术的汇流&#xff0c;诸如人工智能等前沿技术与软件行业的深度融合&#xff0c;正全面颠覆软件产品的开发模式和服务逻辑。 另一方面则是行业的汇流&#xff0c;数字化浪…

PyEcharts数据可视化(1)——配置项

PyEcharts 学习连接 一、查看pyecharts版本 import pyecharts print(pyecharts.__version__)输出&#xff1a;1.9.0 二、绘制第一个图表 from pyecharts.charts import Bar bar Bar() # 创建柱形图对象 bar.add_xaxis(["衬衫","羊毛衫","雪纺衫…

创建路由React router(使用react-router dom V6版本)

React路由 隔了很长一段时间&#xff0c;重新捡起来React学习。 发现React的路由从原来的 Switch改成了Routes。nice&#xff0c;nice&#xff0c;nice&#xff01;&#xff01;&#xff01;&#xff01; 刚开始接触确实还是有一点生疏的。之前的关于【传参】【js跳转】【跳转模…

管理后台项目-06-用户管理角色管理模块

目录 1-路由信息搭建和api文件信息创建 2-用户管理模块 2.1-列表数据获取以及动态渲染 2.2-添加 | 修改 用户 2.3-删除-批量删除用户 2.4-分配角色 3-角色管理 3.1-修改角色 3.2-分配权限 1-路由信息搭建和api文件信息创建 我们先进行路由菜单的配置&#xff0c;在系统…

【测试开发】测试人的养成记,在这测试内卷乱世中突破测试开发...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 这几年&#xff0…

442. 数组中重复的数据|||41. 缺失的第一个正数|||485. 最大连续 1 的个数

442. 数组中重复的数据 题目 给你一个长度为 n 的整数数组 nums &#xff0c;其中 nums 的所有整数都在范围 [1, n] 内&#xff0c;且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数&#xff0c;并以数组形式返回。 你必须设计并实现一个时间复杂度为 O(n) 且仅…

Python如何连接Mysql及基本操作

1.什么要做python连接mysql&#xff0c;一般是解决什么问题的 做自动化测试时候&#xff0c;注册了一个新用户&#xff0c;产生了多余的数据&#xff0c;下次同一个账号就无法注册了&#xff0c;这种情况怎么办呢&#xff1f;自动化测试都有数据准备和数据清理的操作&#xff…

KDJB-1200继电保护定值校验仪器

一、产品概述 KDJB-1200 微机继电保护校验仪是在参照电力部颁发的《微机型继电保护试验装置技术条件(讨论稿)》的基础上&#xff0c;听取用户意见&#xff0c;总结目前国内同类产品优缺点&#xff0c;充分使用现代微电子技术和器件实现的一种新型小型化微机继电保护测试仪。 采…

《C++ Primer Plus》(第6版)第18章编程练习

《C Primer Plus》&#xff08;第6版&#xff09;第18章编程练习 《C Primer Plus》&#xff08;第6版&#xff09;第18章编程练习1. 函数average_list()2.3. sum_value()4. 使用lambda重新编写程序清单16.15 《C Primer Plus》&#xff08;第6版&#xff09;第18章编程练习 1…

mysql进阶-查询优化-慢查询日志

文章目录 一、什么是慢查询日志二、慢查询日志能干什么2.1 性能分析和优化2.2 诊断和排查问题2.3 数据分析和探索 三、慢查询日志实战3.1 永久开启开启慢查询日志3.2 临时开启慢查询日志3.4 常用命令 四、如何分析慢查询日志五、优化慢查询语句五、总结 一、什么是慢查询日志 …

这场SIG组开放工作会议为何吸引了那么多人的关注?

【中国&#xff0c;上海&#xff0c;2023年4月20日-21日】openEuler Developer Day 2023在线上和线下同步举办。本次大会由开放原子开源基金会指导&#xff0c;中国软件行业协会、openEuler社区、边缘计算产业联盟共同主办&#xff0c;以“万涓汇流&#xff0c;奔涌向前”为主题…

数据仓库与数据库之间的区别与联系

文章目录 一、数据库与数据仓库的区别 1.1、区别 1.2、ACID内容 二、原子性&#xff08;Atomicity&#xff09; 三、持久性&#xff08;Durability&#xff09; 四、隔离性&#xff08;Isolation&#xff09; 1、锁机制 2、脏读、不可重复读和幻读 2、事务隔离级别 五…

权限提升:溢出漏洞.(普通权限 提升 管理员权限.)

权限提升&#xff1a;溢出漏洞 权限提升简称提权&#xff0c;由于操作系统都是多用户操作系统&#xff0c;用户之间都有权限控制&#xff0c;比如通过 Web 漏洞拿到的是 Web 进程的权限&#xff0c;往往 Web 服务都是以一个权限很低的账号启动的&#xff0c;因此通过 Webshell …

日增百亿数据,查询结果秒出, Apache Doris 在 360商业化的统一 OLAP 应用实践

导读&#xff1a; 360商业化为助力业务团队更好推进商业化增长&#xff0c;实时数仓共经历了三种模式的演进&#xff0c;分别是 Storm Druid MySQL 模式、Flink Druid TIDB 的模式 以及 Flink Doris 的模式&#xff0c;基于 Apache Doris 的新一代架构的成功落地使得 360商…

“不幸的是,你知道的太多了”

《平凡的世界》里有一段话是这么说的&#xff1a;“谁让你读了这么多书&#xff0c;又知道了双水村以外还有个大世界。 如果从小你就在这个天地里日出而作&#xff0c;日落而息&#xff0c;那你现在就会和众乡亲抱同一理想&#xff0c;经过几年的辛劳&#xff0c;像大哥一样娶…