Hash表、Hash函数及冲突解决
#1.Hash表
哈希表(Hash table,也叫散列表),是根据key而直接进行访问的数据结构。也就是说,它通过把key映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
以数据中每个元素的关键字K为自变量,通过散列函数H(k)计算出函数值,以该函数值作为一块连续存储空间的的单元地址,将该元素存储到函数值对应的单元中。
哈希表存储的是键值对,其查找的时间复杂度与元素数量多少无关,哈希表在查找元素时是通过计算哈希码值来定位元素的位置从而直接访问元素的,因此,哈希表查找的时间复杂度为O(1)。
#2.哈希表的构造方法
##2.1直接定址法
取关键字或者关键字的某个线性函数值作为哈希地址,即 H(Key)=Key或者H(Key)=a*Key+b(a,b为整数) 这种散列函数也叫做自身函数.如果H(Key)的哈希地址上已经有值了,那么就往下一个位置找,直到找到H(Key)的位置没有值了就把元素放进去. 此法仅适合于:地址集合的大小 等于 关键字集合的大小
##2.2 数字分析法
分析一组数据,比如一组员工的出生年月,这时我们发现出生年月的前几位数字一般都相同,因此,出现冲突的概率就会很大,但是我们发现年月日的后几位表示月份和具体日期的数字差别很大,如果利用后面的几位数字来构造散列地址,则冲突的几率则会明显降低. 因此数字分析法就是找出数字的规律,尽可能利用这些数据来构造冲突几率较低的散列地址. 此法适于:能预先估计出全体关键字的每一位上各种数字出现的频度。 ##2.3 平方取中法
以关键字的平方值的中间几位作为存储地址(哈希地址)。求“关键字的平方值” 的目的是“扩大差别” ,同时平方值的中间各位又能受到整个关键字中各位的影响。
此法适于:关键字中的每一位都有某些数字重复出现频度很高的现象。 ##2.4 折叠法
将关键字分割成若干部分,然后取它们的叠加和为哈希地址。两种叠加处理的方法:移位叠加:将分 割后的几部分低位对齐相加;间界叠加:从一端沿分割界来回折叠,然后对齐相加。 此法适于:关键字的数字位数特别多。
##2.5随机数法
设定哈希函数为:H(key) = Random(key)其中,Random 为伪随机函数 此法适于:对长度不等的关键字构造哈希函数。
##2.6除留余数法
取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址.即 哈希函数为:H(key) = key MOD p ( p≤m ),其中, m为表长,p 为不大于 m 的素数。
#3.哈希表冲突解决方法
哈希表处理冲突主要有开放寻址法、再散列法、链地址法(拉链法)和建立一个公共溢出区四种方法。 通过构造性能良好的哈希函数,可以减少冲突,但一般不可能完全避免冲突,因此解决冲突是哈希法的另一个关键问题。 “处理冲突” 的实际含义是:为产生冲突的关键字寻找下一个哈希地址。 ##3.1开放定址法 一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。
###3.1.1线性探测
冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。
公式:
fi(key) = (f(key)+di) MOD m (di=1,2,3,......,m-1)
###3.1.2二次探测法
冲突发生时,在表的左右进行跳跃式探测,双向寻找到可能的空位置。
公式:
fi(key) = (f(key)+di) MOD m (di = 12, -12, 22, -22,……, q2, -q2, q <= m/2)
###3.1.3随机探测法
在冲突时,对于位移量 di 采用随机函数计算得到,我们称之为随机探测法。
公式:
fi(key) = (f(key)+di) MOD m (di是一个随机数列)
线性探测再散列容易产生“二次聚集”,即在处理同义词的冲突时又导致非同义词的冲突。 线性探测再散列的优点是:只要哈希表不满,就一定能找到一个不冲突的哈希地址,而二次探测再散列和伪随机探测再散列则不一定。
##3.2链地址法
将所有哈希地址相同的记录都链接在同一链表中。各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况。 处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;
##3.3再哈希法
这种方法是同时构造多个不同的哈希函数:
Hi=RH1(key),i=1,2,3,…,n.
当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间。
##3.4建立公共溢出区
这种方法的基本思想是:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表.(注意:在这个方法里面是把元素分开两个表来存储)
Hash表、Hash函数及冲突解决相关推荐
- 哈希表及哈希冲突解决办法
哈希表及哈希冲突解决办法 目录 什么是哈希表? 哈希表的数据结构 哈希冲突 哈希冲突解决办法 1. 什么是哈希表? 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直 ...
- Hash(散列)冲突解决 线性探测再散列和二次探测再散列
线性探测再散列 例如 哈希函数为: H(key) = key %13,key 为关键字,采用开放地址法中的线性探测再散列解决冲突,依次输入 11 个关键字,16,74,60,43,54,90,46 ...
- CODE【VS】1553 互斥的数(hash表+map函数)
题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y满足y = P*x,那么就认为x,y这两个数是互斥的,现在想知 ...
- 原创:PHP内核研究:HASH表和变量
PHP HASH表 在PHP中,所有的数据 无论变量,常量,类,属性 都用Hash表来实现. 先要说说 HASH表 [c]typedef struct bucket { ulong h; /* Use ...
- 数据结构:通过hash表建立一个宝可梦图鉴管理系统
1. 建立工程文件夹 bin.obj.src.include 2.创建主makefile文件 OBJS:=test.o pokemon.o CC:=gcc CFLAGS:=-c -g -Wall My ...
- 【除留余数法定义hash函数+线性探测法解决hash冲突】数据结构实验之查找七:线性之哈希表
Think: 1知识点:除留余数法定义hash函数+线性探测法解决hash冲突 数据结构实验之查找七:线性之哈希表 Time Limit: 1000MS Memory Limit: 65536KB P ...
- 用链表和数组实现HASH表,几种碰撞冲突解决方法
Hash算法中要解决一个碰撞冲突的办法,后文中描述了几种解决方法.下面代码中用的是链式地址法,就是用链表和数组实现HASH表. he/*hash table max size*/ #define HA ...
- Hash——哈希法概念、哈希函数构造方法、哈希冲突解决办法(重点讨论链地址法)
声明:本篇博客根据回顾老师上课知识和书籍<数据结构--用C语言描述>(耿国华)整理得出,仅作知识回顾学习用. 1.哈希法 哈希法又称散列法.杂凑法.关键字地址计算法.相对应的表称为哈希表. ...
- Hash函数与算法、哈希查找、哈希冲突解决方法总结
Hash哈希知识点导航 1.基本概念 2. 哈希函数 2.1 直接寻址法 2.2 数字分析法 2.3 平方取中法 2.4 折叠法 2.5 随机数法 2.6 除留余数法 3. 哈 ...
- 哈希表(散列表)—Hash表解决地址冲突 C语言实现
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.具体的介绍网上有很详 ...
最新文章
- spring ioc原理解析
- Linux Kconfig及Makefile学习
- 5G + 云网融合,加速万物互联
- 浏览器兼容性问题解决方案 · 总结
- termux安装gcc
- 关于PTC保险丝工作原理总结
- sqlserver 误删除数据恢复
- 使用tensorboard遇到:Output 0 of UnbindBackward is a view and is being modified inplace.....
- 什么是gpo,gpt,gpc(活动目录组策略)
- linux命令和选项作用,linux tar 命令中 -f选项作用
- The machine learning algorithm cheat sheet
- 工业级环网交换机是什么呢?它又有什么作用
- Java 并发之Concurrent 包综述
- 【刷机】nubia z17 root 刷入twrp
- 省市区三级行政区数据获取和GeoJson地图下载
- sqlserver varbinary to base64
- 0221沙发的制作过程(使用3DsMAX2016)
- Point-NeRF:基于点的神经辐射场(CVPR 2022)
- 2022年第四季度DAMA-CDGA/CDGP数据治理认证报名开启啦!
- 用企业微信如何做私域运营?
热门文章
- 7-4 用天平找小球 (10 分)
- Android设备中直接通过shell操作GPIO或者上层c服务直接操作GPIO
- Java 调用执行其他语言的程序
- 工作闲暇-曾经的“伪”前端+切图工作
- 读《广州的一场春梦》有感
- BlogEngine.Net架构与源代码分析系列part13:实现分析(上)——HttpHandlers与HttpModules...
- Jmeter多机联合产生负载 (转)
- 动态路由之OSPF协议综合实验
- 在metasploitable里面搭建ZVulDrill
- 输入网址的时候,浏览器是如何判断你是http协议还是https协议的