01

知识框架

02

知识点详解

1

散列表的相关概念

①什么是散列表和散列函数?

是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,记为 Hash(key) = Addr 这里的地址是数组下标、索引或内存地址等)。 存放记录的数组叫做散列表

②什么是同义词和冲突?

散列函数可能会把两个或两个以上的不同关键字映射到同一地址,称这种情况为冲突,这些发生碰撞的不同关键字称为同义词。一方面,设计得好的散列函数应尽量减少这样的冲突;另一方面,由于这样的冲突总是不可避免的,所以还要设计好处理冲突的方法。

2

散列函数

下面介绍几种常见的散列函数:

①直接定址法

取关键词的某个线性函数值为散列地址,即H(key) = a × key + b (a、b为常数)适用情况:它适合关键字的分布基本连续的情况,若关键字分布不连续,空位较多,则会造成存储空间的浪费。

②除留余数法

散列函数为:H(key) = key mod p(假定散列表的长度为m,取一个不大于m但是接近于m的质数p)它是一种最简单、最常见的方法。

③数字分析法

分析数字关键字在各位上的变化情况,取比较随机的位作为散列地址。适用情况:这种方法适合于己知的关键字集合,若更换了关键字,需要重新构造新的散列函数。

④平方取中法

这种方法取关键字的平方值的中间几位作为散列地址。具体取多少位要视实际情况而定,这种方法得到的散列地址与关键字的每位都有关系。因此使得散列地址分布比较均匀。适用情况:适用于关键字的每位取值都不够均匀或均小于散列地址所需的位数。

3

散列函数

①开放定址法

开放定址法就是一旦发生冲突,就去寻找下一个空的散列地址。它的递推公式为:

Hi= (H(key) + di) % m

其中H(key)为散列函数;i=0,1,2,...,k(k<=m-1);m表示散列表的长度;di表示增量序列。这里增量序列的不同表示处理方式也不同,增量序列一旦被确立之后,处理方式也就确立了。通常,增量序列有以下四种取值方式:

(1)

线性探测法:当di=0,1,2,..,m-1时,称为线性探测法。

探测方式:冲突发生时,顺序查看表中下一个单元(探测到表尾地址m- 1时,下一个探测地址是表首地址0),直到找出一个空闲单元(当表未填满时一定能找到一个空闲单元) 或查遍全表。缺点:线性探测法的探测方法会使大量元素在相邻的散列地址上”堆积”起来,这样大大降低了查找效率。(2) 平方探测法:当di=0,12,-12,22,-22,...,k2, -k2时,称为平方探测法,其中k<=m/2,散列表长度m必须是一个可以表示成4k+ 3的素数,这样的方法又称二次探测法。探测方式:与线性探测法类似。但它可以避免出现“堆积”问题。缺点:由于di为某数的平方,不能探测到散列表上的所有单元,但至少能探测到一半单元。(3) 再散列法:当di= Hash2(key)时,称为再散列法,又称双散列法。需要使用两个散列函数。探测方式:当通过第一个散列函数H(key)得到的地址发生冲突时,则利用第二个散列函数Hash2(key)计算该关键字的地址增量。它的具体散列函数形式如下:

Hi= (H(key) + i×Hash2(key)) % m

初始探测位置H0= H(key)%m。i是冲突的次数,初始为0。(4) 伪随机序列法:当di=伪随机数序列时,称为伪随机序列法。缺点:用同样的随机种子,将得到相同的数列。开放定址法缺点:① 使用探测序列,有时计算的时间成本过高,导致散列表的处理性能降低② 删除记录时较麻烦。不能随便物理删除表中的已有元素,因为若删除元素,则会截断其他具有相同散列地址的元素的查找地址。因此,要删除一个元素时,可给它做一个删除标记,进行逻辑删除。但这样做的副作用是执行多次删除后,表面上看起来散列表很满,实际上有许多位置未利用,因此需要定期维护散列表,要把删除标记的元素物理删除。

②拉链法(链地址法)

所有关键字为同义词的记录存储在一个单链表中,称这种表为同义词子表,在散列表中只存储所有同义词子表的头指针。拉链法适用于经常进行插入和删除的情况。优点:

① 对于记录总数频繁可变的情况,处理的比较好。

② 删除记录比较方便,直接通过指针操作即可。缺点:存储的记录是随机分布在内存中的,这样在查询记录时,相比结构紧凑的数据类型(比如数组),散列表的跳转访问会带来额外的时间开销。

4

性能分析

①平均查找长度

(1) 查找成功时的平均查找长度是指找到表中已有表项的平均比较次数,它是找到表中各个已有表项的平均比较次数。(2)查找不成功的平均查找长度是指在表中找不到待查的表项,但找到插入位置的平均比较次数。它是在表中所有可能散列到的地址,上插入新元素时,为找到空位置而进行探查的平均次数。

②装填因子

Tips:散列表的平均查找长度与关键字个数n无关,而与装填因子a有关

下面我们来看一个例子:

Q:

用关键字序列{2, 34,23,11, 25, 35,12,14}创建一个Hash表,装填因子a为1/2,试确定表长m,采用除留余数法构造Hash函数,采用链地址法来处理冲突,并计算查找成功与不成功时的平均查找长度ASL1和ASL2(只将与关键字的比较计算在内)。A:(1) 由装填因子a的定义知道,a=n/m, 其中n为关键字个数,m为表长,因此可以求出m为16。(2) 除留余数法的Hash函数构造公式为H(key)=key mod p,其中p为不大于表长的最大素数,因表长m为16,所以p取13,Hash函数为H(key)=key Mod 13。(3) 用(2)中构造的Hash函数并用链地址法处理冲突所建立的Hash过程如下:2 mod 13 = 2,将2插在地址为2的链表表尾34 mod 13 = 8,将34插在地址为8的链表表尾23 mod 13 = 10,将23插在地址为10的链表表尾11 mod 13 = 11,将11插在地址为11的链表表尾25 mod 13 = 12,将25插在地址为2的链表表尾35 mod 13 = 9,将35插在地址为9的链表表尾12 mod 13 = 12,将12插在地址为12的链表表尾14 mod 13 = 1,将14插在地址为1的链表表尾得到如下散列表:(4)求ASL1ASL1=(1+1+2+1+1+1+1+1)/8=1.125关键字比较次数:(5) 求ASL2ASL2=(0+1+2+0+0+0+0+0+1+1+1+1+1)/13=0.615地址比较次数:

03

相关习题

01

( 2014统考)用哈希(散列)方法处理冲突(碰撞)时可能出现堆积(聚集)现象, 下列选项中,会受堆积现象直接影响的是()

A、存储效率

B、散列函数

C、装填(装载)因子

D、平均查找长度

(点击选项查看答案)Tips:产生堆积现象,即产生了冲突。平均查找长度会因为堆积而增大。

02

(2018统考真题)现有长度为7、初始为空的散列表HT,散列函数H(k)=k % 7,用线性探测再散列法解决冲突。将关键字22, 43, 15 依次插人到HT后,查找成功的平均查找长度是()。

A、1.5

B、 1.6

C、2

B、与时俱进

C、实事求是

D、持续稳定

D、3

(点击选项查看答案)Tips:根据题目要求可以画出散列表,根据散列表可以得到ASL成功=(1+2+3)/3=2

03

(2019统考真题)现有长度为 11且初始为空的散列表HT,散列函数是H (key)=key%7,采用线性探查(线性探测再散列)法解决冲突。将关键字序列87, 40, 30, 6, 11,22, 98, 20依次插入HT后,HT查找失败的平均查找长度是()。

A、4

B、5.25

C、6

B、与时俱进

C、实事求是

D、持续稳定

D、6.29

(点击选项查看答案)Tips:由于H(key)=0~6,查找失败时对应的可能地址有七个,要特别注意的是,散列函数不可能计算出地址7。故ASL失败=(9+8+7+6+5+4+3)/7=6

抓码计算机考研qq群

总群:625590924

广大:1143982604

暨大:1071137230

广工:938111325

华工:428389734

深大:729770764

浙大:978938582

厦大:1125268501

中大:921801084

南航:281118241

华农:515681663

重邮:736197896

北邮:1126650806

南邮:1109929146

广外:976231252

东北大学:1128523098

华南师大:428389734

南昌大学:923249141

给个“在看”支持一下我

ds哈希查找—二次探测再散列_哈希算法高大上?也不过如此相关推荐

  1. ds哈希查找—二次探测再散列_大白话之哈希表和哈希算法

    哈希表概念 哈希表(散列表),是基于关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数(哈希函数 ...

  2. 二次探测再散列_杭州二次元影像测量仪

    二次元影像g2fe1a测量仪杭州 三次元是指三坐标测量机,它是指在一个六面体的空间范围内,能够表现几何形状.长度及圆周分度等测量能力的仪器,又称为三坐标测量仪或三坐标量床.三坐标测量仪可定义为&quo ...

  3. Hash(散列)冲突解决 线性探测再散列和二次探测再散列

    线性探测再散列 例如  哈希函数为: H(key) =  key %13,key 为关键字,采用开放地址法中的线性探测再散列解决冲突,依次输入 11 个关键字,16,74,60,43,54,90,46 ...

  4. Hash(散列)冲突解决之线性探测再散列和二次探测再散列

    线性探测再散列 H(key) = key %13,key 为关键字,采用开放地址法中的线性探测再散列解决冲突,依次输入11 个关键字,16,74,60,43,54,90,46,31,29,88,77, ...

  5. 【哈希表】线性探测再散列的相关知识与计算

    注意概念: 装填因子 等概率下查找成功的平均查找长度 等概率下查找不成功的平均查找长度 线性探测再散列时以 存储空间的长度来取余 查找时比较次数,如在 {12}中查找12,12跟12也要进行一次比较. ...

  6. 【哈希冲突解决】线性探测再散列和二次探测再散列

    定义 散列(Hashing)是计算机科学中一种对资料的处理方法,通过某种特定的函数/算法(称为散列函数/算法)将要检索的项与用来检索的索引(称为散列,或者散列值)关联起来,生成一种便于搜索的数据结构( ...

  7. 二次探测再散列举例_二次探测散列法

    展开全部 二次再散e68a84e8a2ad3231313335323631343130323136353331333431366365列法是指第一次散列产生哈希地址冲突,为了解决冲突,采用另外的散列函 ...

  8. 哈希查找解决地址冲突的两种最常见方法(线性探测再散列,链地址法)C++实现

    哈希查找解决地址冲突的两种最常见方法(线性探测再散列,链地址法)C++实现 参考文章: (1)哈希查找解决地址冲突的两种最常见方法(线性探测再散列,链地址法)C++实现 (2)https://www. ...

  9. 散列表相关题目(线性探测再散列法)

    散列表相关题目(线性探测再散列法) 一.题目 将关键字序列(7.8.30.11.18.9.14)散列存储到散列表中.散列表的存储空间是一个下标从0开始的一维数组,散列函数为H(key)=(key×3) ...

  10. 线性探测再散列法计算asl

    再散列和平方散列不同,再散列是遇到冲突时前进一位. 计算查找失败的平均查找长度,要特别注意防止思维定式,在查找失败的情况下,既不是根据表中的元素个数,也不是根据表长来计算平均查找长度.查找失败时,在等 ...

最新文章

  1. python输入列表方法_Python用input输入列表的方法
  2. 块级元素内联并列显示
  3. uboot-spl编译流程
  4. 使用coding.net上传项目
  5. linux内核配置与编译
  6. Django的model中日期字段设置默认值的问题
  7. 为什么Java在后来的版本中,给接口增加了默认方法、静态方法、私有方法?
  8. 领域驱动设计和开发实战总结
  9. 做python开发要用多大的内存_Python 在分配内存需要考虑的问题
  10. matlab padarray
  11. [AtCoder Beginner Contest 133]F - Colorful Tree
  12. Java查看某个类的帮助文档
  13. 服务器的原理,服务器原理
  14. java超市运行程序源代码_Java课程设计超市库存管理系统附源代码可以直接运行...
  15. MeGui原滤镜使用心得
  16. mysql的备份与还原步骤_MySQL备份与还原
  17. matplotlib画圆
  18. java绘图- 绘图用法(基于Graphics2D)
  19. SpringBoot整合Shiro学习(上)
  20. 丹露 datav数据大屏经验总结

热门文章

  1. poj 3080 Blue Jeans【字符串】
  2. mktime 夏令时
  3. Csharp四种简单的排序算法
  4. 关于数据分析师的4个你问我答,你曾有过这些困扰吗?
  5. smbinning包:R语言下的分箱处理工具
  6. 使用 Visual Studio 2012进行C语言开发
  7. 第六章 who can see what
  8. spring security 使用 application/json 接收数据
  9. Rxjs初体验:制作语音测试工具
  10. Win7下安装Flash低版本