查找算法【哈希表】 - 处理冲突的方法:开放地址法-二次探测法 & 随机探测法 & 再散列法

这篇具有很好参考价值的文章主要介绍了查找算法【哈希表】 - 处理冲突的方法:开放地址法-二次探测法 & 随机探测法 & 再散列法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

查找算法【哈希表】 - 处理冲突的方法:开放地址法-二次探测法 & 随机探测法 & 再散列法

【二次探测法】

二次探测法指采用前后跳跃式探测的方法,发生冲突时,向后1位探测,向前1位探测,向后2^2 位探测,向前2^2 位探测……以跳跃式探测,避免堆积。

二次探测的增量序列为di =1^2 , -1^2 , 2^2 , -2^2 , …, k^2 , -k^2(k ≤m /2)。

【举个栗子】

例如,有一组关键字(14,36,42,38,40,15,19,12,51,65,34,25),若表长为15,散列函数为hash(key)=key%13,则可采用二次探测法处理冲突,构造该散列表。

【构造流程】

按照关键字的顺序,根据散列函数计算散列地址,如果该地址空间为空,则直接放入;如果该地址空间已存储数据,则采用线性探测法处理冲突。

① hash(14)=14%13=1,将14放入1号空间(下标为1)hash(36)=36%13=10,将36放入10号空间;hash(42)=42%13=3,将42放入3号空间;hash(38)=38%13=12,将38放入12号空间。

查找算法【哈希表】 - 处理冲突的方法:开放地址法-二次探测法 & 随机探测法 & 再散列法

② hash(40)=40%13=1,1号空间已存储数据,采用二次探测法处理冲突。

hash′(40)=(hash(40)+di )%m ,di =1^2 , -1^2 , 2^2 , -2^2 , …, k^2 ,-k^2 (k ≤m /2)

d 1 =1^2 :hash′(40)=(1+1^2 )%15=2,2号空间为空,将40放入2号空间。

即hash(40)=40%13=1→2。

查找算法【哈希表】 - 处理冲突的方法:开放地址法-二次探测法 & 随机探测法 & 再散列法

③ hash(15)=15%13=2,2号空间已存储数据,发生冲突,采用二次探测法处理冲突。

hash′(15)=(hash(15)+di )%m ,di =1^2 , -1^2 , 2^2 , -2^2 , …, k^2 ,-k^2 (k ≤m /2)

  • d1 =1^2 :hash′(15)=(2+1^2 )%15=3,3号空间已存储数据,继续进行二次探测。
  • d2 =-1^2 :hash′(15)=(2-1^2 )%15=1,1号空间已存储数据,继续进行二次探测。
  • d3 =2^2 :hash′(15)=(2+2^2 )%15=6,6号空间为空,将15放入6号空间。
  • 即hash(15)=15%13=2→3→1→6。

查找算法【哈希表】 - 处理冲突的方法:开放地址法-二次探测法 & 随机探测法 & 再散列法

④ hash(19)=19%13=6,6号空间已存储数据,采用二次探测法处理冲突。

d1 =1^2 :hash′(19)=(6+1^2 )%15=7,7号空间为空,将19放入7号空间。

即hash(19)=19%13=6→7。

hash(12)=12%13=12,12号空间已存储数据,采用二次探测处理冲突。

d1 =1^2 :hash′(12)=(12+12 )%15=13,13号空间为空,将12放入13号空间。

即hash(12)=12%13=12→13。

查找算法【哈希表】 - 处理冲突的方法:开放地址法-二次探测法 & 随机探测法 & 再散列法

⑤ hash(51)=51%13=12,12号空间已存储数据,采用二次探测处理冲突。

  • d1 =1^2 :hash′(51)=(12+12 )%15=13,13号空间已存储数据,继续进行二次探测。
  • d2 =-1^2 :hash′(51)=(12-12 )%15=11,11号空间为空,将51放入11号空间。

即hash(51)=51%13=12→13→11。

查找算法【哈希表】 - 处理冲突的方法:开放地址法-二次探测法 & 随机探测法 & 再散列法

⑥ hash(65)=65%13=0,将65放入0号空间;hash(34)=34%13=8,将34放入8号空间。

查找算法【哈希表】 - 处理冲突的方法:开放地址法-二次探测法 & 随机探测法 & 再散列法

⑦ hash(25)=25%13=12,12号空间已存储数据,采用二次探测法处理冲突。

注意:在二次探测过程中如果二次探测地址为负值,则加上表长即可。

  • d1 =1^2 :hash′(25)=(12+12 )%15=13,已存储数据,继续进行二次探测。
  • d2 =-1^2 :hash′(25)=(12-12 )%15=11,已存储数据,继续进行二次探测。
  • d3 =2^2 :hash′(25)=(12+22 )%15=1,已存储数据,继续进行二次探测。
  • d4 =-2^2 :hash′(25)=(12-22 )%15=8,已存储数据,继续进行二次探测。
  • d5 =3^2 :hash′(25)=(12+32 )%15=6,已存储数据,继续进行二次探测。
  • d6 =-4^2 :hash′(25)=(12-32 )%15=3,已存储数据,继续进行二次探测。
  • d7 =4^2 :hash′(25)=(12+42 )%15=13,已存储数据,继续进行二次探测。
  • d8 =-4^2 :hash′(25)=(12-42 )%15=-4,-4+15=11,已存储数据,继续进行二次探测。
  • d9 =5^2 :hash′(25)=(12+52 )%15=7,已存储数据,继续进行二次探测。
  • d10 =-5^2 :hash′(25)=(12-52 )%15=-13,-13+15=2,已存储数据,继续进行二次探测。
  • d11 =6^2 :hash′(25)=(12+62 )%15=3,已存储数据,继续进行二次探测。
  • d12 =-6^2 :hash′(25)=(12-62 )%15=-9,-9+15=6,已存储数据,继续进行二次探测。
  • d13 =7^2 :hash′(25)=(12+72 )%15=1,已存储数据,继续进行二次探测。
  • d14 =-7^2 :hash′(25)=(12-72 )%15=-7,-7+15=8,已存储数据,继续进行二次探测。

即12→13→11→1→8→6→3→13→11→7→2→3→6→1→8。

已探测到(m /2)^2 ,还没找到位置,探测结束,存储失败,此时仍有4个空间,却探测失败。

注意: 二次探测法是跳跃式探测方法,效率较高,但是会出现有空间却探测不到的情况,因而存储失败。而线性探测法只要有空间就一定能够探测成功。

【算法实现】

int Seconddetect(int HT[] , int H0 , int key , int &cnt){
	int Hi;
	for(int i = 1 ; i <= m / 2 ; ++i){
		int i1 = i * i;
		int i2 = -i1;
		cnt ++;
		Hi = (H0 + i1) % m; //采用线性探测法计算下一个哈希地址Hi
		if(HT[Hi] == NULLKEY){ //若单元Hi 中元素的关键字为key
			return Hi;
		}
		cnt ++;
		Hi = (H0 + i2) % m; //采用探测法计算下一个哈希地址Hi
		if(Hi < 0 ){
			Hi += m;
		}
		if(HT[Hi] == NULLKEY){ //若单元Hi为空,则所查元素不存在
			return Hi;
		}
		else if(HT[Hi] == key){ //若单元Hi 中元素的关键字为key
			return Hi;
		}
	}
	return -1;
}

【随机探测法】

随机探测法采用伪随机数进行探测,利用随机化避免堆积。随机探测的增量序列为di =伪随机序列。

【再散列法】

再散列法指在通过散列函数得到的地址发生冲突时,再利用第2个散列函数处理,称之为双散列法。再散列法的增量序列为di =hash2(key)。

注意: 采用开放地址法处理冲突时,不能随便删除表中的元素,若删除元素,则会截断其他后续元素的探测,若要删除一个元素,则可以做一个删除标记,标记其已被删除。文章来源地址https://www.toymoban.com/news/detail-498968.html

到了这里,关于查找算法【哈希表】 - 处理冲突的方法:开放地址法-二次探测法 & 随机探测法 & 再散列法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 比特币 ZK 赏金系列:第 2 部分——查找哈希冲突

    在我们的零知识赏金 (ZKB) 系列的第二部分中,我们将其应用于解决哈希冲突难题。在这样的谜题中,两个不同的输入散列到相同的输出。此类赏金可用于: 充当煤矿中的金丝雀,给我们一个有价值的提醒。存在冲突是散列函数较弱的标志,因此我们可以尽早升级以减轻损失

    2024年02月08日
    浏览(48)
  • 【Python查找算法】二分查找、线性查找、哈希查找

    目录 1 二分查找算法  2 线性查找算法 3 哈希查找算法         二分查找(Binary Search)是一种用于在有序数据集合中查找特定元素的高效算法。它的工作原理基于将数据集合分成两半,然后逐步缩小搜索范围,直到找到目标元素或确定目标元素不存在。 以下是二分查找的

    2024年02月08日
    浏览(52)
  • 什么是redis中的哈希桶、哈希冲突及解决方法

    Redis中的哈希桶是一种数据结构,用于在Redis的哈希表(如字典结构)中存储键值对。 哈希桶是哈希表数组中的每个元素,可以视为一个容器或槽位,用于存放数据。在Redis中,当插入一个新的键值对时,会根据键的哈希值计算出一个索引,该索引指向特定的哈希桶。 每个哈

    2024年04月08日
    浏览(50)
  • 解决哈希冲突的几种方法

    哈希函数是一个映像,把任意长度的输入,通过Hash算法变换成固定长度的输出,这个输出就是Hash值; 当两个不同的输入,产生了同一个输出值即为哈希冲突 开放寻址法的核心思想是, 如果出现了散列冲突,我们就重新探测一一个空闲位置,将其插入 。比如,我们可以使用

    2024年01月17日
    浏览(37)
  • 【算法系列 | 9】深入解析查找算法之—哈希表查找

    心若有阳光,你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力,成为更好的自己! 今天第9讲,讲一下查找算法的哈希表查找 查找算法是计算机科学中的一类

    2024年02月08日
    浏览(55)
  • Java 语言哈希查找算法实现

    哈希查找,也称为散列查找,是一种高效的查找算法。它利用哈希函数将映射到数组中的一个位置,通过直接访问该位置来获取元素,从而实现快速查找。Java语言提供了一些类和接口,例如 HashMap 和 HashTable ,使得我们可以方便地使用哈希查找算法。本文将详细介绍

    2024年02月10日
    浏览(46)
  • 数据结构,查找算法(二分,分块,哈希)

    一、查找算法         1、二分查找:(前提条件: 必须有序的序列) 2、分块查找:(块间有序,块内无序)     索引表  +  源数据表     思路:     (1)先在索引表中确定在哪一块中     (2)再遍历这一块进行查找 //索引表 typedef  struct  {     int max; //块中最大值

    2024年02月11日
    浏览(60)
  • 哈希(Hash)查找算法详解之C语言版

    哈希查找是一种快速查找算法,该算法不需要对进行比较,而是以为自变量,以该在存储空间中的地址为因变量,建立某种函数关系,称为哈希函数,这样在查找某一的时候,就可以通过哈希函数直接得到其地址,有效的提高了查找效率。 选取哈希

    2024年01月19日
    浏览(39)
  • C++哈希表:一种快速查找和插入的方法

    哈希表是一种非常重要的数据结构,它在各种场合中都有广泛的应用。在C++中,哈希表通常是通过 标准模板库(STL)中的unordered_map或unordered_set来实现 的。本篇文章将向读者介绍哈希表的基本概念、原理、实现方法以及优化策略。通过掌握哈希表,我们可以实现高效的查找和插

    2024年02月08日
    浏览(45)
  • ip地址冲突导致ping时通时断显示超时问题处理过程

    目录 1 现象     2 Ping的过程:    3 可能的原因: 4 排查过程 类似问题:ip冲突问题解决和复现过程_wj31932的博客-CSDN博客 无法上网故障排查过程及复现过程系ip冲突造成_wj31932的博客-CSDN博客_arp获取不到网关mac地址        一天,同事反馈他的pc出现ping外网时通时断,一会

    2024年01月21日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包