快速理解哈希(Hash)表的运作原理

这篇具有很好参考价值的文章主要介绍了快速理解哈希(Hash)表的运作原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

哈希表是什么

哈希表(hash table)又叫散列表。

和二叉树、链表这一类一样。它是一种数据结构,设计出来用于存放数据。

百科解释:

散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表

  

需要的基础知识

指针和数组

链表

模运算

    

哈希表的构建方法

  1. 创建一个固定大小的数组(哈希表),其中每个位置都有一个关联值为null或空链表
  2. 对需要存储的数据应用哈希函数(核心)---- 使用取模运算符将数据转换为数组的下标(即关键字 x -- f(x)(哈希函数)--> 下标)
  3. 将数据存储在该下标位置处(便于查找)。

如下:

数组

指针

指针

指针

指针

指针

下标

0

1

2

3

4

5

6

7

8

...

    

哈希函数是根据关键字设计的,有很多种函数,主要的原理就是根据数组的大小求模运算。

(关键字) % (数组大小)

例如:20048157 % 17 (结果在0-16)

数组的大小一般设计为质数 -- ?--> 保证均匀分布(即:将输入数据随机(均匀)散布到哈希表的各个位置,避免出现过多冲突)。

   

遇到冲突怎么办

1、链表式解决(Separate Chaining)

写结构体的时候加入next指针(和链表一样)

数据 Next->数据 Next

遇到冲突的时候,把数据写到next的位置.

例如:

数据关键字

15 22 24 16

数组大小

7

哈希函数

下标 = 关键字 mod 7

快速理解哈希(Hash)表的运作原理

 ↓↓结果

下标

数据

0

1

15

->

22

2

16

3

24

4

5

6

产生冲突时,往后面放指针(15->22->...)


  

2、开放地址(Open Addressing)

不用next指针,把其他下标的位置都对外开放。

    

开放地址的方法:

a. 线性探测法

如果遇到冲突,就往下一个地址寻找空位。

如果遇到冲突,新位置=原始位置+ i(i是冲突的次数)

     

例如:

数据关键字

28 4 12

数组大小

13

哈希函数

下标=关键字 mod 13

快速理解哈希(Hash)表的运作原理

↓↓结果

数组

12

15

2

28

4

38

下标

0

1

2

3

4

5

6

7

8

9

10

11

12

缺点:容易产生“二次聚集”---- 不同基地址的元素争夺同一个单元的现象叫作“二次聚集”。(也即扎堆)


b. 平方探测法(二次方探测)

如果遇到冲突,就往(原始位置 + i方 )的位置

寻找空位(i 代表冲突的次数)

如果遇到冲突,新位置 = 原始位置 + i方

   

例如:

数据关键字

15 2 28 19 10

数组大小

13

哈希函数

下标 = 关键字 mod 13

快速理解哈希(Hash)表的运作原理

↓↓结果

数组

15

2

19

28

10

下标

0

1

2

3

4

5

6

7

8

9

10

11

12


c.双哈希

要设置第二个哈希的函数,例如: hash2(key)=R-(key mod R)

R要取比数组尺寸小的质数。

例如R=7: hash2(关键字)= 7- (关键字% 7 )

也就是说,二次哈希的结果在1-7之间,不会等于0;

如果遇到冲突,新位置=原始位置+ i . hash 2(关键字)

例如:

数据关键字

15 2 18 28

数组大小

13

哈希函数

下标=关键字 mod 13

哈希函数2

7-(关键字 mod 7)

如果遇到冲突,新位置=原始位置+i.hash 2(关键字)

快速理解哈希(Hash)表的运作原理

↓↓结果

数组

15

18

2

28

下标

0

1

2

3

4

5

6

7

8

9

10

11

12



哈希表满了怎办?

再次哈希(Rehashing)

当哈希表数据存储量超过70%,那么就自动新建一个新的哈希表

新表的尺寸是旧表的2倍以上,选择-一个质数

把之前的数据再次通过哈希计算搬到新表里

     

如果往旧表里再插入-一个数据,那么旧表的存储量将会超过70%

旧表:

6

15

2

24

13

0

1

2

3

4

5

6

旧表:下标=关键字mod 7

新表:下标=关键字mod 17

新表:

2

24

6

13

15

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

     

为什么设计哈希表

因为哈希表查找的性能快,它比搜索叉树的速度还快。

搜索二叉树的查找速度是0(log2 N),而哈希表发挥稳定的话

可以达到0(1)。

    

哈希表的缺点

表越满,性能越差文章来源地址https://www.toymoban.com/news/detail-428438.html

到了这里,关于快速理解哈希(Hash)表的运作原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 哈希表(Hash Table)-----运用实例【通过哈希表来管理雇员信息】(java详解) (✧∇✧)

    目录 一.哈希表简介: 实例介绍:  类的创建与说明: 各功能图示:  1.class HashTab{  };  2. class EmpLinkedList{ }; 3. class Emp{ }; 4.测试: 运行结果: 最后,完整代码: 哈希表(Hash Table):也叫做散列表。是 根据关键码值(Key Value)直接进行访问的数据结构。 哈希表通过「

    2024年02月20日
    浏览(30)
  • leetcode分类刷题:哈希表(Hash Table)(一、数组交集问题)

    1、当需要快 速判断某元素是否出现在序列中 时,就要用到哈希表了。 2、本文针对的总结题型为给定 两个及多个数组 ,求解它们的 交集 。接下来,按照由浅入深层层递进的顺序总结以下几道题目。 3、以下题目需要共同注意的是:对于两个数组,我们总是尽量把短数组转

    2024年02月11日
    浏览(32)
  • Java学数据结构(4)——散列表Hash table & 散列函数 & 哈希冲突

    1.散列表,key,散列函数; 2.哈希冲突的解决; 3.string中的hashCode; 查找树ADT,它允许对元素的集合进行各种操作。本章讨论散列表(hash table)ADT,不过它只支持二叉查找树所允许的一部分操作。散列表的实现常常叫作散列(hashing)。散列是一种用于以常数平均时间执行插入、删除和

    2024年02月10日
    浏览(47)
  • leetcode分类刷题:哈希表(Hash Table)(四、前缀和 处理连续子数组)

    1、leetcode题目里对于 元素加和 的考察可谓是屡见不鲜,包括 简单的限定一个有效答案 的两个或多个元素求和leetcode分类刷题:哈希表(Hash Table)(一、简单的两数之和)、在有序数组内对加和等于target的 三元组、四元组 等的求解leetcode分类刷题:基于数组的双指针(三、

    2024年02月10日
    浏览(25)
  • OpenCV #以图搜图:均值哈希算法(Average Hash Algorithm)原理与实验

    均值哈希算法(Average Hash Algorithm,简称aHash) 是哈希算法的一种,主要用来做相似图片的搜索工作。   均值哈希算法(aHash)首先将原图像缩小成一个固定大小的像素图像,然后将图像转换为灰度图像,通过缩小图像的每个像素与平均灰度值的比较,生成一组哈希值。最后,

    2024年02月08日
    浏览(29)
  • 哈希表的原理

    线性表、树结构的查找方式都是以的比较为基础,查找效率比较低, 顺序表的时间复杂度是O(n),平衡树中为树的高度,即O(logn) ,搜素的效率取决于搜索过程的元素比较次数。 理想的搜素方法 :可以用 不经过比较,一次直接从表中得到要搜素的元素 。如果构造

    2024年02月16日
    浏览(22)
  • OpenCV #以图搜图:感知哈希算法(Perceptual hash algorithm)的原理与实验

    感知哈希算法(Perceptual Hash Algorithm,简称pHash) 是哈希算法的一种,主要可以用来做以图搜索/相似图片搜索工作。   感知哈希算法(pHash)首先将原图像缩小成一个固定大小的像素图像,然后将图像转换为灰度图像,通过使用离散余弦变换(DCT)来获取频域信息。然后,根

    2024年02月05日
    浏览(44)
  • 【哈希表】为什么哈希表的插入/删除/查找时间复杂度为O(1)

    在使用哈希表时,往往会出现哈希冲突,此时就会通过 链表/红黑树 的方法来解决冲突,此时引入 链表/红黑树 那么时间复杂度就不是严格的O(1)。 我们首先要明白N代表什么,N是指问题的规模大小。 在使用哈希表时,所有的数据个数为N,链表的长度肯定不是N,( 因为存在

    2024年03月21日
    浏览(45)
  • Spark原理之Cache Table的工作原理及实现自动缓存重复表的思考

    使用此语法,可以由用户自定义要缓存的结果集,实际上就是一个临时表,不过数据存储在Spark集群内部,由Application所分配的executors管理。 一旦定义了一个 缓存表 ,就可以在SQL脚本中随处引用这个表名,提高数据检索速度,同时也会资源不必要的资源开销。 用户可以通过

    2024年04月27日
    浏览(30)
  • 全面理解哈希,哈希的底层原理是如何实现的,哈希题型的做题思路与题目清单(不断更新)

    哈希(Hash)是一种算法,它接受一个输入(或“消息”),并返回一个固定大小的字符串。这个输出字符串的大小通常以字节为单位,输出的内容看起来是随机的且整个过程是单向的。 哈希的一些关键特性包括: 不管你输入的信息有多大,哈希值的大小总是固定的。 即使只

    2024年02月04日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包