关于哈希表的小白笔记(力扣刷题有感)

什么是哈希表

哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素,如下图所示:
如图所是就是一张哈希表
在我的理解里,哈希表就是一个数组,数组索引与里面的元素有着很大的联系与“重要性”,以至于他的一般作用就是快速判断一个元素是否出现在集合中。举个例子,如果你将一个班的学生的名字装在哈希表数组里,那如果你要判断“张三”,你只需要O(1)的事件复杂度即可。

什么是哈希函数

先看图:
在这里插入图片描述
就像我在之前说的,去查“张三”的名字在不在名单里,但我们不可能让计算机听得懂我们的“中文”,我们要利用 hashcode 的编码形式将每一个名字映射成其对应的哈希表上的索引数值,就类似于数组的下标。如果有溢出那就对对应的 code 取模,但如果取模之后与原先的数据冲突了,那就需要哈希碰撞出场了。

什么是哈希碰撞

在这里插入图片描述
为什么会有哈希碰撞上段有说,就是位置冲突了,如图“小李”与“小王”都被映射到了索引值为1 的位置上。解决哈希碰撞的方法有两个:1.拉链法;2.线性探测法。

拉链法

在这里插入图片描述
如图,很简单,就是利用单链表来存储(这个好像数据结构也有具体提到)。我就不多说的了。

线性探测法

这个就比较硬核,就是保证哈希表的大小一定会大于数值个数大小。如果冲突,那就按照存储规律找一个空的地方将他存下来(这个空的地方在哪里也是有相关定义的),我记得这个有在数据结构哪里讲过,我到时候得去复习一下,大家如果知道也可以提前告诉我。

常见的哈希表的三个结构

  1. 数组(常见、简单理解)
  2. set(集合)(理解成数学上的集合就行了)
  3. map(映射)

以下是不同的 set 对比:在这里插入图片描述
注意: 你可以冲里面看出除了multiset 其他的 set 的数值都不能存重复的!而且 unordered_set 存的都是无序的!这里要注意一下。

以下是不同的 map 对比
在这里插入图片描述
这里需要注意的是 map 是 <key,value>的数据结构,map对key是有限制的,具体我还没用到,用到我再好好研究。

总结一下

当你遇到要查找元素在某一个集合的时候,优先要考虑哈希法!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值