数据结构学习笔记:哈希表

哈希表(Hash table,也叫散列表),是根据key而直接进行访问的数据结构。也就是说,它通过把key映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表

以数据中每个元素的关键字K为自变量,通过散列函数H(k)计算出函数值,以该函数值作为一块连续存储空间的的单元地址,将该元素存储到函数值对应的单元中。(也就是通过散列函数将关键字k映射为一个地址,然后将具体的值存储到这个地址对应的单元中)

哈希表在查找元素时是通过计算哈希码值来定位元素的位置从而直接访问元素的,因此,哈希表查找的时间复杂度为O(1)。

哈希表的构造方法

直接定址法

取关键字或者关键字的某个线性函数值作为哈希地址,即H(Key)=Key或者H(Key)=a*Key+b(a,b为整数)       
这种散列函数也叫做自身函数.如果H(Key)的哈希地址上已经有值了,那么就往下一个位置找,直到找到H(Key)的位置没有值了就把元素放进去.    

此法仅适合于:地址集合的大小 等于 关键字集合的大小

数字分析法

分析一组数据,比如一组员工的出生年月,这时我们发现出生年月的前几位数字一般都相同,因此,出现冲突的概率就会很大,但是我们发现年月日的后几位表示月份和具体日期的数字差别很大,如果利用后面的几位数字来构造散列地址,则冲突的几率则会明显降低.   

因此数字分析法就是找出数字的规律,尽可能利用这些数据来构造冲突几率较低的散列地址.     

此法适于:能预先估计出全体关键字的每一位上各种数字出现的频度。

平方取中法

关键字的平方值的中间几位作为存储地址(哈希地址)。
求“关键字的平方值” 的目的是“扩大差别” ,同时平方值的中间各位又能受到整个关键字中各位的影响。 

此法适于:关键字中的每一位都有某些数字重复出现频度很高的现象。

折叠法

将关键字分割成若干部分,然后取它们的叠加和为哈希地址。
此法适于:关键字的数字位数特别多。 

随机数法

设定哈希函数为:H(key) = Random(key)其中,Random 为伪随机函数

此法适于:对长度不等的关键字构造哈希函数。

除留余数法

取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址. 
哈希函数为:H(key) = key MOD p ( p≤m ),其中, m为表长,p 为不大于 m 的素数。

冲突解决

哈希表处理冲突主要有开放寻址法再散列法链地址法(拉链法)建立一个公共溢出区四种方法。   

通过构造性能良好的哈希函数,可以减少冲突,但一般不可能完全避免冲突,因此解决冲突是哈希法的另一个关键问题。  

“处理冲突” 的实际含义是:为产生冲突的关键字寻找下一个哈希地址。

开放定址法

一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。

  • 线性探测:冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。
  • 二次探测法:冲突发生时,在表的左右进行跳跃式探测,双向寻找到可能的空位置。
  • 随机探测法:在冲突时,对于位移量 di 采用随机函数计算得到,我们称之为随机探测法。

线性探测再散列的优点是:只要哈希表不满,就一定能找到一个不冲突的哈希地址,而二次探测再散列和伪随机探测再散列则不一定。

链地址法

将所有哈希地址相同的记录都链接在同一链表中。各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况。   

处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;

这里写图片描述

再哈希法

这种方法是同时构造多个不同的哈希函数。当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间。

建立了公共溢出区

这种方法的基本思想是:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表.(注意:在这个方法里面是把元素分开两个表来存储)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
尚硅谷数据结构韩顺平老师在讲解数据结构时也提到了哈希表哈希表是一种常用的数据结构,它通过哈希函数将关键字映射到一个数组中的位置,以实现快速的查找和插入操作。哈希表的特点是可以在常数时间内进行查找、插入和删除操作,因此在实际应用中被广泛使用。 然而,哈希表也有一些不足之处。首先,哈希表中的数据是没有顺序的,所以不能以一种固定的方式来遍历其中的元素。其次,通常情况下,哈希表中的key是不允许重复的,不能放置相同的key,用于保存不同的元素。 尽管哈希表存在一些不足之处,但是它在实际应用中的性能优势仍然是非常显著的。在处理大量数据时,哈希表可以提供较高的查找效率,使得我们能够更快地找到所需的数据。 因此,尚硅谷数据结构韩顺平老师在讲解数据结构时也强调了哈希表的重要性,帮助学习者了解并掌握这一常用的数据结构。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [韩顺平老师尚硅谷Java数据结构与算法194集笔记](https://download.csdn.net/download/weixin_52184392/32076811)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【尚硅谷|韩顺平】数据结构和算法](https://blog.csdn.net/ZEZHEN0222/article/details/128624496)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [数据结构与算法-哈希表 | 尚硅谷韩顺平](https://blog.csdn.net/weixin_54232666/article/details/127043618)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值