1.定义

哈希函数就是将关键字和它的存储位置之间建立一个确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应。按这个思想建立的表为哈希表

2.哈希函数的构造方法

2.1 直接定址法

取关键字或关键字的某个线性函数值为哈希地址。即:
            H(key) = key 或 H(key) = a · key + b

2.2 数字分析法

假设关键字是以r为基的数(如:以10为基的十进制数),并且哈希表中可能出现的关键字都是事先知道的,则可取关键字的若干数位组成哈希地址。

2.3 平方取中法

取关键字平方后的中间几位为哈希地址。

2.4 折叠法

将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位)作为哈希地址,这方法称为折叠法。

2.5 除留余数法

取关键字被某个不大于哈希表表长m的数p除后所得余数为哈希地址。即:
            H(key) = key MOD p, p<=m

2.6 随机数法

选择一个随机函数,取关键字的随机函数值为它的哈希地址,即H(key) = random(key),其中random为随机函数。

3.冲突处理方法

冲突是指由关键字得到的哈希地址的位置上已存有记录。处理冲突是为该关键字的记录找到另一个“空”的哈希地址。

在处理冲突的过程中可能得到一个地址序列Hi(i=1,2,…,k),即在处理哈希地址的冲突时,若得到的另一个哈希地址H1 仍然发生冲突,则再求下一个地址H2 ,若H2 仍然冲突,再求H3 。以此类推,直至Hk 不发生冲突为止,则Hk 为记录在表中的地址。

通常处理冲突的方法有以下几种:

3.1 开放地址法:

Hi = (H(key) + di) MOD m (i = 1, 2, … , k. k<m)
其中:H(key)为哈希函数;m为哈希表表长;di 为增量序列。
di 可有下列3中取法:

  1. 线性探测再散列:di = 1, 2, 3, …, m-1;
  2. 二次探测再散列:di = 12 , -12 , 22 , -22 , 32 , … , ±k2 , (k<=m/2);
  3. 伪随机探测再散列:di = 伪随机数序列。

从线性探测再散列可以发现:当表中i, i+1, i+2位置上已填有记录时,下一个哈希地址为i, i+1, i+2和i+3的记录都将填入i+3的位置,这种在处理冲突过程中发生的两个第一个哈希地址不同的记录争夺同一个后继哈希地址的现象称作二次聚集,即在处理同义词的冲突过程中又添加了非同义词的冲突。

3.2 再哈希法

Hi = RHi(key) (i = 1, 2, … , k)
RHi 均是不同的哈希函数,即在同义词产生地址冲突时计算另一个哈希函数地址,直到冲突不再发生。这种方法不易产生“聚集”,但增加了计算的时间。

3.3 链地址法

将所有关键字为同义词的记录存储在同一线性链表中。

4.查找长度

虽然哈希表在关键字与记录的存储位置之间建立了直接映像,但由于“冲突”的产生,使得哈希表的查找过程仍然是一个给定值和关键字进行比较的过程。因此,仍需以平均查找长度作为衡量哈希表的查找效率的量度。

在一般情况下,处理冲突方法相同的哈希表,其平均查找长度依赖于哈希表的装填因子

哈希表的装填因子定义为
   α = nm\frac nmmn​
n为表中填入的记录数,m为哈希表的长度
采用链地址法时,α也是每个链表的平均长度。

设平均查找长度为Sn , 则
  Sn ≈ - 1α\frac 1αα1​ln(1-α)

因此,哈希表的平均查找长度是α的函数,而不是n的函数。不管n多大,我们总可以选择一个合适的装填因子以便将平均查找长度限定在一个范围内。

如果哈希表的长度与元素的个数成比例,则n = o(m),那么
  α = nm\frac nmmn​ = o(m)m{o(m) \over m}mo(m)​ = o(1)
因此,查找都是常量时间。

参考资料: 《数据结构》(清华大学出版社)

哈希表、冲突处理方法、查找长度相关推荐

  1. 【数据结构笔记40】哈希表冲突处理方法:开放地址法(线性探测、平方探测、双散列、再散列),分离链接法

    本次笔记内容: 11.3.1 开放定址法 11.3.2 线性探测 11.3.3 线性探测-字符串的例子 11.3.4 平方探测法 11.3.5 平方探测的实现 11.3.6 分离链接法 文章目录 冲突 ...

  2. 查找算法【哈希表】 - 散列查找及性能分析

    查找算法[哈希表] - 散列查找及性能分析 散列表虽然建立了关键字和存储位置之间的直接映像,但冲突不可避免,在散列表的查找过程中,有的关键字可以通过直接定址1次比较找到,有的关键字可能仍然需要和若干关 ...

  3. 哈希表处理冲突的方法?

    哈希表处理冲突的方法? 一.基本概念 二.处理冲突的方法 (1) 链地址法 (2) 开放定址法 (3) 再散列法 (4) 建立一个公共溢出区 一.基本概念 哈希表,也叫散列表,是根据关键字而直接进行访 ...

  4. 哈希表的构造和查找算法

    实现哈希表的构造和查找算法,要求:用除留余数法构造哈希函数,分别用一次探测再散列.二次探测再散列解决冲突. #include<stdio.h> #include<stdlib.h&g ...

  5. 哈希表冲突及处理冲突的方法(含例子)

    一.哈希函数和哈希冲突的基本概念 1.哈希函数: 哈希法又称散列法.杂凑法以及关键字地址计算法等,相应的表成为哈希表. 基本思想:首先在元素的关键字K和元素的位置P之间建立一个对应关系f,使得P=f( ...

  6. 哈希表(散列查找)(c/c++)

    通过哈希表进行查找的特点是:不需要比较关键字,而是通过哈希函数计算出关键字的位置.一般来讲,为了进行高效率的查找,要求哈希函数简单均匀.空间利用率高.关键字之间的冲突少. 关于散列查找的实现需要着重考 ...

  7. 数据结构的学生信息哈希表的建立与查找

    设有若干个学生的考试成绩,采用除留余数求哈希地址,将学生的信息存储到该地址空间,并且采用线性探测法解决冲突问题. #include <iostream.h>#include <con ...

  8. hash表冲突处理方法

    为提高hash表查找性能,除了考虑选择合适的hash表表长和完美的hash函数外,还必须考虑hash表处理冲突的能力.当hash函数对两个不同的数据项产生了相同的hash值时,冲突就产生了.对于冲突的 ...

  9. 哈希表处理冲突的方法

    1.开放定址法(三种线性探测.二次探测.伪随机探测再散列 ) 2.链地址法,也叫拉链法 3.再哈希法 4.溢出区法

最新文章

  1. Eclipse复制或修改项目后,把项目部署后发现还是原来的项目名称
  2. R语言ggplot2可视化增大图例字体实战
  3. Spark的RDD持久化
  4. 我是如何阅读编程书的
  5. Js中的style,currentStyle,getComputedStyle()区别
  6. Spring - Java/J2EE Application Framework 应用框架 第 14 章 JMS支持
  7. “德国屈臣氏”来天猫!欧洲3000家门店,优质低价背后有啥秘密
  8. word中viso/math type公式比文字大
  9. 在android开发中使用multdex的方法-IT蓝豹为你整理
  10. SAP Cloud for Customer移动端应用SAP推荐的网络时延参数
  11. VS2012 使用条件断点和内存断点
  12. 解决unity3d发布的网页游戏放到服务器上无法使用的问题
  13. 基于单片机倾角检测仪设计分享
  14. zabbix监控华为USG6000防火墙
  15. 深入浅出讲解梯度消失和梯度爆炸问题(原因、解决方法)
  16. 写好软文标题的10个方式
  17. 资料员培训建筑八大员培训建筑工程施工资料管理中存在的问题
  18. 苹果cms常见100个问题及解决方法
  19. Teranex AV标准转换器
  20. GitHub 上超屌的 9 个 Vue 开源项目

热门文章

  1. python multiprocessing 得到多进程返回的结果
  2. python判断数据在某个区间
  3. python函数注解
  4. php自动裁剪黑边,视频画面裁剪怎么将视频四周的黑边去除?
  5. python app mysql_Python 操作 MySQL 的5种方式
  6. Splash resource_timeout 属性
  7. mysql 8.0.11安装教程
  8. ubuntu16.04(其他版本也可)批量修改图片名---shell编程
  9. C# Serializable学习
  10. android studio第三方调试,Android Studio直接运行调试签名包