哈希表查找详解

哈希表查找

  • 定义
  • 基本概念

1、定义

哈希表查找又称散列表查找,通过查找关键字不需要比较就可以获得需要记录的存储位置,它是通过在记录的存储位置和它的关键字之间建立的一个确定的关系f,使得每个关键字key对应一个存储位置f(key)。即:
–存储位置=f(关键字),其中f为哈希函数。

  1. 哈希表最适合的求解问题是查找与给定值相等的记录。
  2. 哈希查找不适合同样的关键字对应多条记录的情况,如使用关键字"男"去找找某个同学。
  3. 不适合范围查找,比如查找班级18~22岁的同学。

2、基本概念

  • 1、哈希函数的构造方法

怎么样的才算是好的哈希函数?
1、计算简单。哈希函数的计算时间(指的是产生地址的时间),不应该超过其他查找技术与关键字比较的时间。
2、地址分布均匀。尽量让哈希地址均匀分布在存储空间中,这样可以使空间有效的利用。

(1)直接定址法

我们可以去关键字的某个线性函数的值作为哈希地址,如下图所示
在这里插入图片描述

这种哈希函数优点是比较简单、匀称,也不会产生冲突,但是需要实现知道关键字的分布情况,适合查找表比较小且连续的情况。在实际中不常用。

(2)数字分析法

可以使用关键字的一部分来计算哈希存储的位置,比如手机号码的后几位(或者反转、左移右移等变换)。
在这里插入图片描述
通常适用于处理关键字位数比较大的情况,如果事先知道关键字的分布且关键字的若干位分布均匀,就可以考虑用这种方法。

(3)除留余数法

这是最为常用的构造哈希函数的方法,对于哈希表长度为m的哈希表函数为:
在这里插入图片描述
mod是取模(求余数)的意思。事实上,如果p选得不好,就很多容易出现同义冲突的情况:

在这里插入图片描述
如上图所示,选择p = 11,就会出现key = 12、144的冲突。

根据经验,若哈希表表长为m,
通常p为小于或者等于表长的最小质数或不包含小于20质因子的合数。
(质数又称素数。是一个大于1的自然数,并且因数只有1和它自身,
不能整除其他自然数。合数则因数除了1和本身还有其他因数的数。)

2、哈希函数的构造方法

从刚才的除留余数法可以看出,设计再好的哈希函数也不可能完全避免冲突(key1!=key2,但是f(key1 = f(key2))),下面介绍几种常用的避免冲突方法。

(1)开放定址法

该方法是一旦发生冲突,就去寻找下一个空的哈希表地址,只要哈希表足够大,空的哈希地址总能找到,并将其记录存入。
在这里插入图片描述

二次探测法

在这里插入图片描述
增加平方项,主要是为了不让关键字都集中在某一块区域,避免不同的关键字争夺一个地址的情况。

随机探测法

在这里插入图片描述
di使用随机函数计算而来,是前面方法的改进。

(2)链地址法

在这里插入图片描述
在这里插入图片描述
如上图所示,取12位除数,进行除留余数法,无论存在多少冲突,都只是在当前位置给单链表增加节点而已。

如上图所示,取12为除数,进行除留余数法,无论存在多少冲突,都只是在当前位置给单链表增加节点而已。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
哈希表是一种常用的数据结构,它通过哈希函数将键映射到存储位置,以实现高效的数据查找和插入操作。哈希函数是一种提取数据特征的算法,根据不同的数据形式和场景,可以选择不同的哈希算法。常见的哈希算法包括MD5等。\[1\] 在哈希表中,哈希函数的优劣直接影响到哈希表查找效率。优秀的哈希函数可以减少冲突的发生,提高查找效率。哈希函数的设计方法有多种,其中常见的包括直接寻址法、除留余数法、平方取中法等。不同的哈希函数适用于不同的数据类型和规律。\[3\] 哈希冲突是指不同的键经过哈希函数计算后得到相同的哈希值,导致数据存储位置冲突的情况。为了解决哈希冲突,常用的方法有开放寻址法和链地址法。开放寻址法是指当发生冲突时,通过一定的规则在哈希表中寻找下一个可用的位置来存储数据。链地址法是指在哈希表的每个位置上维护一个链表,将哈希值相同的键值对存储在同一个链表中。\[2\] 总结来说,哈希表是一种通过哈希函数将键映射到存储位置的数据结构,常用的哈希算法有多种,哈希函数的设计方法也有多种,而哈希冲突的处理方法包括开放寻址法和链地址法。这些算法和数据结构的选择取决于具体的应用场景和需求。 #### 引用[.reference_title] - *1* [详解哈希数据结构,手写哈希表](https://blog.csdn.net/CRMEB/article/details/120820682)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [数据结构之哈希表以及常用哈希的算法表达(含全部代码)](https://blog.csdn.net/weixin_53050357/article/details/126666617)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [哈希表-数据结构(C语言)](https://blog.csdn.net/weixin_44681349/article/details/124782035)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值