数据结构与算法之hashmap散列表查找

本文介绍了哈希查找的基本原理,通过关键字与散列函数建立存储地址关系,阐述了散列表在解决查找问题上的优势。通过生活中的例子,解释了哈希表中地址冲突的四种处理方法:开放定址法、再散列函数法、链地址法和公共溢出区法。
摘要由CSDN通过智能技术生成

哈希表:关键字、地址与查找

哈希查找是一种常用的查找方式,通常通过自定义函数F(关键字)来实现对于元素的查找,并返回关键字的存储地址(查找成功)或“查找失败”讯息。

散列表不同于线性表、树、图等存储/查找方法,散列表的各个记录之间没有逻辑关系——它是专门用于查找的存储结构,与外界的唯一联系就是关键字

  • 关键字与存储关键字的地址之间存在自定义的函数关系F,这个F被称为关键字与地址之间的散列函数

计算机根据函数关系F,使用散列技术将每一个元素的记录存放在连续的一块存储空间中,每个关键字对应的元素存储位置就被称为散列地址

散列表查找与普通查找最大的区别在于散列表没有任何可依靠的逻辑关系——散列表的元素与元素之间既没有共同特点(比如属于同一个集合),也没有内在联系(比如可以推导的数学公式),就好像你每次去公园遇到的人,他们的年龄、性别、职业、健康状况等都各不相同,唯一能够识别他们的可能就只有长相,以及你给他们起的”绰号“(每个人的绰号是独一无二的,所以”绰号“在这里就成为了”去公园遇到的人“这张”散列表“里的地址“。

  • 那么我们如何通过”关键字“找到对应的人呢?

如果你遇到了”大腹便便的光头阿强“,自然能认出是他,而当你看到另外一个人,也是男性,也有着肚腩和光头,这个时候他的形象就和”大腹便便的光头阿强“形成了冲突,但由于前一个有着肚腩和光头的男性已经得到了”大腹便便的光头阿强“这个绰号了,你只能根据后者体貌特征中与前者不同的点,再给他起一个新”绰号(地址)”,比如”大腹便便的雷哥“,进而确保下次见到他的时候你不会把他们两人弄混。

就这样,你给你在公园见到的每一个人(他们的形象就是关键字),都起了一个独一无二的绰号(****散列表中的地址),并把这些人都记在了“我在公园见到的人”这张“散列表(哈希表)”中,独一无二的”绰号“就成为了他们独一无二的标识符——地址

在”我在公园见到的人“这张散列表中,有很多记录(每个人就是一个元素)的特征很相似,所以你为了避免”绰号“的冲突,就为他们起了不同的”绰号“,解决了地址的冲突。


以上就是关于“哈希表的一个例子,相信大家读完应该会对哈希表(又称散列表)和哈希算法有一个简单的认识。

在上面的例子中,我们通过”起绰号“的方式成功避免了地址的冲突,确保了哈希表中每一个元素有且只有一个不与其他元素重复的”绰号“。

接下来,我们讲一讲,对于散列表(你在公园见到的人)中,如何避免”绰号“(地址)的冲突:

  • 开放定址法
  • 再散列函数法
  • 链地址法
  • 公共溢出区法

冲突是不可避免的,在生活中我们常常遇到这样的场景:你到了一所新学校或一个新公司工作,坐在你对面的女孩五官清秀、身材高挑,你对她很有好感。可是当你进一步打听关于她的消息,却发现人家已经有男朋友甚至已经结婚了,可能孩子都上幼儿园了。这时,你无法再对你心仪的女孩展开追求,只能另寻女友。


在这个场景中,你和这个女孩的男朋友/老公在”地址(这个女孩的对象)“所处的位置形成了一次冲突,而为了避免这种冲突,我们必须帮助你找到一位单身且符合你的审美的年轻女性,这就涉及到冲突的处理。

  • 开放定址法
    当你发现你心仪的女孩已经有了对象时,你保持了你的审美——该喜欢双眼皮还喜欢双眼皮,该喜欢长头发还喜欢长头发,然后某天,你不经意间发现那个女孩有个和她长得很像的妹妹,而且妹妹是单身。你立刻展开了猛烈的追求,最终得偿所愿,娶回了以为貌若天仙的双眼皮长头发美女。
    此时,我们可以把”这个妹妹的对象“看作一个空的地址,与之相对的,”姐姐的对象“就是一个已经被占用的地址

  • 再散列函数法
    当你发现上文所说的”姐姐“已经有了对象后,你的审美发生了改变——你以前喜欢单眼皮、长头发的女生,但某一天你突然发现坐在你后排的某位单眼皮、短头发的女生有着她独特的美,接着,你开始追求她,并获得了成功。从此,你就在”班级/公司的情侣“这张散列表中获得了”后排女生的对象“这个地址

  • 链地址法
    在公司呆了一段时间之后,你发现暗恋过上文说过的”姐姐“的人不止你一个,早你几个月来到公司的小刘、程序员大张、外卖小哥小徐,这些人都暗恋过”姐姐“。此时,你、小刘、大张、小徐,你们这些人就有了一个共同点——暗恋过”姐姐“。此时我们可以以个人身份为关键字,被暗恋的对象为地址新建一张哈希表。在这张新建的哈希表里面,你、小刘、大张、小徐的地址都是”姐姐“,所以产生了冲突。为了避免这种冲突,我们将你、小刘、大张和小徐存储在一个单链表里,并将这张单链表命名为同义词子表,在哈希表中只储存同义词子表的头指针。

  • 公共溢出区法
    假设你暗恋”姐姐“失败后没有得知关于”妹妹“的信息,而是一直单身,我们就把你,还有公司的其他单身人士存储在一个名为”无对象人士“的溢出表里面。这样一来,你在”公司的情侣“这张哈希表中就没有了地址。不过,在公司大多数人已经有对象的情况下,别人要查找你这个人,就可以直接在”无对象人士“这张溢出表中一个个找,用不了多久,就能找到你了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值