0
点赞
收藏
分享

微信扫一扫

Hash算法的底层细节

自由情感小屋 2022-04-23 阅读 96

今天呢,我们总结一下。Hash散列的一些方法,技术和原理。散列不只是JAVA一种散列方式,而是还有多种的散列方法。那么今天参考的这本书是《数据结构与算法分析》java语言描述的。Hash表的作用是什么?其实是为了更快的去找到对应的数据。相对于列表、数组来说,那么数组如果说是我们要插入于一条数据的时候,比如我插在啊中间,那么它需要。去重新的把这个表去拷贝出来,然后呢,再再。把新的值插到这个中间的这个位置,所以它整个插入的动作。在时间效率上来说是非常昂贵的。另外一方面,如果要删除中间一段数据。也是数据拷贝到新的数组。那Hash的出现,他就解决了这样的一个问题。那他是怎么去解决的呢?
他首先的话。我要插入一个一个值的话,根据这个Hash函数。找到对应的位置索引,那如果说是插入的位置为空,那么值接插入。那如果是删除的时候。那我们值接删除就好了,而我们不需要去改变数组的内容。如果产生一个冲突,比如我已经在二的位置上已经存储了一个数据,那么我又要插入一个数据,那么怎么办呢?解决冲突的办法。首先的话,我们有一个非常好的办法,就是分离链接法,那么我就把这个新加的数据,指针的方式去链接起来。查找时,如果说这个地方还是不等于,第二个值后面又是为空,那么我们就值接返回空,就说没有找到这个值。
那么还有其他的方式,不用分离链接法,那就是开放寻址法。那么第一种的是说是线性探测,在整个数据里面。整个数组里面,那么。啊?这里要补充一下Hash值的一个。一个使用范围。就是说,呃,Hash。 map 的一个范围就是。首先的话是一个,线性探测,那什么是线性探测,那假如说我,呃,Hash,值到了一个位置,比如说是三。我到了三以后能发现这个地方。已经有值了,那怎么办?那我就要。找下一个值是不是。下一个位置是不是空的,那么我。就找到一个四是这个位置是不是是不是空的哦?我发现。四是空的,那么 ok, 那我就把心插入的纸放在四这个位置,那么整个插入的话就结束了。那如果说是
这个,我发现是这个位置,也是。不为空的,那么我就找四的下个位置就五这个位置是不是为空的啊?那一此类推就一值找到。一个空的位置就好了。
那么如果说是这种线性探测法的话,它会导致什么,会导致聚集,就是说会在数组连续一块空间中,都已经有值,那么因为我们很多次就会。呃,散列到二这狗子,那么二这个是三这个字,那么就是整个23子的话,就。非常快速的会这一块的地址都会。已经有值了,所以说呢,那么我们就会有。另外一种方法,就把这个这一块呢的值呢,再去啊,做一个大跨步的一个寻址–平方探测法。平方探测法,它的基本思入探测第i个位置,i^2位置是否为空,如果为空,则将值插入这位置。导致一个问题–二次聚集。那么同样的会导致说我在探测的地方还和社会有一快内容就全部都是已有存储数据,那么现在的话就是还有一个 方法要解决这个问题,提出了一个双散列,
双散列
双散列的意思就是就是这样子,就是我探知道这个地有方冲突。我们就会去选择另外一个散列函数,那这规则的话就是说,我们选取一个这速数,就是说,当前总容量 n 小于 n 的一个素数 K。再对 k 那么把这个位置再对应到。下一个位置进行,去插入到额。数组的下一个地方。

那么冲突以后,我们会导致整体的概率,整个的冲突到底发生的概率是多少,那么现就有一个。理论就是说,将 n 个球随机的放入 n^2盒子里面,这种情况下有冲突的概率,也是说每一个盒子有两个或者更多球的概率呢,是小于1/2的。所以呢,那么根据这个定理,衍生许多散列方法。其中一个方法的名字是完美散列。

完美散列链

那么完美散列链接法是相似的,只不过呢,那么分离链接法。他后面我们是,呃,找到冲突以后,那么我们会,假如说我在二这个点。有有冲突。但是,呃,然后呢,那么在这个点的话,我又。发现了有,呃,有两个元素, ok, 那么我们在。这个分离链接的地方,再去给它去散列,那么22的平方是四。那么两个元素啊,散略到四个空间里面,那么就可以去解决这个。冲突的问题。那么这个地方我们会去考虑一点,就是说我二。呃,下一次呃只散列的时候,那么只闪力又有一个。空间,比如说,我们每一个点都去闪那个平方,那么。它总共。呃呃,一般的期望的啊空间值是多少,那这里已经证明了,最多是2n个。那总共的,空间数,是多少,比如说我们是 n 个。元素要散列到。第一个是 n,n的

一个啊?空间就是第一阶的散列,第二阶的散列是二n。所以说呢,总共加起来就是有要三个。空间。那么还有一种啊散力方法呢,就叫做啊,扑谷鸟散列,那么破谷鸟散列的啊?方丝。是说,哎,我用两个。散列空间,那么一个空间的话,使用一个散列函数,另外一个空间。使用另外一个散列函数,两个散列函数是独立的。那么当第一个散列空间啊,为。呃,没呃,为空的时候,那么我插入这个数据就值接插入这个上。那么第二个空间就。就不去记录了,那么第一个空间,如果说是我发现有值了,在。这个位置上, ok, 那么我们值接啊,把第二个。呃,第一个空间的值移到第二个散列空间里面,这样就。解决了一个冲突的问题,啊?再讲一下加我中的。Hash家伙中的Hash表的话,就是一个。哈是 map, 那么Hash map 它的实现原理的话,是通过啊。分离链接法。那么首先Hash麦普它里面的数据结构的话,是一个。数。主啊,那数组里面的元素的类型,是一个 no 的,而 no 的。的是一个类,那么它累的数

据成员,是有这么一些。一的话是Hash值。第二个是啊 kids, 第三个是 value 值,第四个是一个纸针 指针就是说只向下一个 Node 的一个指针值。因为,这样的话就是说,如果是有冲突的话,散列在同一个位置上会指向下一个Node值。那哈是麦普,他的耳妆。甜樱子就是是3/0.754就是说。我的填充率是75%。那如果说是他会有冲突的话,那么通过啊,多个链接,把元素链接到一个点上,那链接的最大。的一个长度8如果超过了,把这个同一个链接的地方。通过转换转换成红黑树,那红黑树的查找速度,就相对来说就会可控。因为知道我刚才Hash map, 他对于空间的一个利用,会。比较的,不高效。因为它里面有,呃,我们看到它会存组哈,呃,还是 code val 有值, k 子,还有。有next指针,

那它那里面,啊Hashm,它还会去存储一个。啊, m 群这样的一个数组,所以呢,它整个一个Hash迈搏,要存组数据的时候,特别在啊数量比较小的时候,那么它升讯的空间是非常多的。所以呢,在安卓里面,他为了提高这个,哈哈是 map 的一个使用情况,所以呢,它会。在卓里面会提供了一个新的一个含一个类。啊,他就这 spiries a 就是稀疏数组在那一个东西。那他的一个实践方式的话就是说,他的 k 子是一个硬的型,然后 y 流值的话,是任意的是一个对象啊,那么他的一个,呃,存储方式的话,呃,存储方式的话就比较的简单高效一点。那特别是在小容量的时候,那么它会是比较高效的。那他会根据这个印差值。进行一个,阿分查找,那么如果说是阿分查找,如果是在这个地方的话,那么 ok, 它会。找到这个值得对应的所引位置,那么这个对应的所引的位置在。找到 value 值的所引的对应的所引的位置就是 value 值。这是一点空间上的一个,呃,利用提高效率,第二天话它,因为我们哈是 map 的时候,它会有一个。哦。装箱跟拆箱的一个操作,这个地方也会有一个性能的消耗。啊?装箱拆箱的话就是说啊,我们有一个硬特值,那么印特值的一个。对象可以值接啊父子给inter类型

举报

相关推荐

0 条评论