散列·跳房子散列

2023-10-07 18:50
文章标签 散列 跳房子

本文主要是介绍散列·跳房子散列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

跳房子散列

1、定义

前言:

​ 线性探测法是在散列位置的相邻点开始探测,这会引起很多问题,于是各种优化版本例如平方探测、双散列等被提出来改进其中的聚集问题。但是探测相邻位置和第二次散列相比,显然探测相邻位置更有优势,所以线性探测仍然是实用的,甚至是最佳选择。

1.1 描述

​ 跳房子散列的思路:用事先确定的,对计算机底层体系结构而言最优的一个常数,给探测序列的最大长度加个上界。这样做可以给出常数级的最坏查询时间,并且与布谷鸟散列一样,查询可以并行化,以同时检查可用位置 的有限集。

布谷鸟散列:

https://blog.csdn.net/dhcao1112/article/details/127050821

​ 要点:

​ a)依然是线性探测

​ b)探测长度 i i i有个上限

​ c)上限是提前定好的,跟计算机底层体系结构有关系

1.2 图解

​ 跳房子散列规则:

​ a)最大探测上界MAX_DIST​ = 4

​ b)散列位置 h a s h ( x ) hash(x) hash(x),则探测位置为 h a s h ( x ) + 0 hash(x)+0 hash(x)+0 h a s h ( x ) + 1 hash(x)+1 hash(x)+1 h a s h ( x ) + 2 hash(x)+2 hash(x)+2 h a s h ( x ) + 3 hash(x)+3 hash(x)+3

​ c)下例:在这里插入图片描述
在这里插入图片描述
图解说明:

​ 图1展示A~G的元素,右侧是他们的散列值。图表中的Hop表示探测位置是否被占用,比如“0010”,说明 h a s h ( x ) + 2 hash(x)+2 hash(x)+2位置被使用。用四位码表示具体位置。

​ a)插入A,A的散列位置是7,则Hop[7]的第0个位置被占用,记作“1000”;

​ b)插入B,B的散列位置是9,则Hop[9]的第0个位置被占用,记作“1000”;

​ c)插入C,C的散列位置是6,则Hop[6]的第0个位置被占用,记作“1000”;以上未发生冲突。

​ d)插入D,D的散列位置是7,发生冲突,位置7已经存在值A,开始线性探测,探测下一个位置 h a s x ( x ) + 1 = 8 hasx(x)+1 = 8 hasx(x)+1=8,位置8未被占用,可插入,则Hop[7]的第1个位置被占用,将Hop[7]记作“1100”;

​ e)插入E,E的散列位置是8,发生冲突,位置8已经存在值D,开始线性探测,探测下一个位置 h a s x ( x ) + 1 = 9 hasx(x)+1 =9 hasx(x)+1=9,位置9已经存在值B,继续探测下一个位置 h a s x ( x ) + 2 = 10 hasx(x)+2 = 10 hasx(x)+2=10,位置10未被占用,可插入,测试Hop[8]的第2个位置被占用,将Hop记作“0010”;

​ f、g)插入F、G。未发生冲突,同上插入。

​ 上述跳房子插入很简单,我们插入一个值,如果在它的hash位置发生冲突,即在上界范围内线性探测下一个位置,直到达到上界,如果有空位置则插入

问:如果线性探测,直到上界都无法插入呢?

答:当我们上界设置得不够大时,这种情况是必须考虑的。此时的插入流程将会稍微复杂。

例如:我们在上述例子中继续插入H,散列值为9。我们探测位置9、10、11、12都被占用,只能到13,但是位置13明显超过上界,即 h a s h ( x ) + 3 hash(x)+3 hash(x)+3都未能找到可插入点。那我们将找一个值y来替换掉。并把它重置到位置13。可以去到位置13的值只有散列值为10、11、12、13的值。如果我们检查Hop[10],它的值为“0000”,没有可以替换的候选项,于是我们检查Hop[11],它的值为“1000”,其值为G,可以被放到位置13。于是我们将元素G放到位置13,将11空出来,插入H。

2、总结

​ 跳房子散列比较简单,是一种比较新的算法,但是初始的实验结果很有前途,特别是对那些使用多处理器并且需要大量并行和并发的应用而言。

​ 但是布谷鸟散列和跳房子散列还处于实验室状态,能否在实际中代替线性探测法或者平方探测法,还有待验证。

这篇关于散列·跳房子散列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/159742

相关文章

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

github源码指引:共享内存、数据结构与算法:基于共享内存的散列存储hash

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。         相关专题:共享内存、数据结构与算法_初级代码游戏的博客-CSDN博客         相关文章:20、基于共享内存的散列存储hash-CSD

Javascript实现Java的HashMap(链表散列)

前言 如果你研究过Java中HashMap的源码,你就会知道HashMap底层的存储结构。Java中的HashMap是以链表散列的形式存储的,也就是数组+链表:HashMap中有一个Entry数组,默认的数组长度是16。这个值必须是2的整数次幂,以保证在通过key的hash值来计算entry应该放置的数组下标时可以尽量做到平均分配。而Entry数组中的每一个非空Entry都是一个Entry链表的

两种对 URL 的散列效果很好的函数

http://www.jos.org.cn/1000-9825/15/179.pdf http://wenku.baidu.com/link?url=irOpsGkPESNv76CWnpJXPLxJnguiudD7NRnM96hwkPu4MwS5AsCVrNe_o-Ihr7nw7aY1zhq268cHLsiE3QguF7tzQzLHIjp7X9n7Z81tnV_

Hash散列算法解析

虽然hash算法种类很多很多。然而,由于有先例(MD5,SHA-1,ripemd都不安全),我们很难保证使用那些标准的hash算法不会导致将来的不安全。于是,自己设计一个新的保密的hash算法就成了绝佳的选择。如何设计呢?       作者认为,至少有以下3种方法: 按照普通Hash算法模式设计修改标准Hash算法利用加密算法来构造Hash算法       第一种办法设计到的东西和内容

河中跳房子(信息学奥赛一本通-T1247)

【题目描述】 每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一个岩石跳到另一个岩石。这项激动人心的活动在一条长长的笔直河道中进行,在起点和离起点L远 (1 ≤ L≤ 1,000,000,000) 的终点处均有一个岩石。在起点和终点之间,有N (0 ≤ N ≤ 50,000) 个岩石,每个岩石与起点的距离分别为Di (0 < Di < L)。 在比赛过程中,奶牛轮流从起点出发,尝试到达终

【shiro】shiro学习笔记3-散列功能

对于密码,有很多种加密方式散列是其中 最常用的,shiro提供了直接支持。 环境 <dependencies><!-- shiro --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.2.4</version></dependency><!--日志

SM3国密算法:优秀的密码散列函数

随着信息技术的飞速发展,信息安全已成为全球关注的焦点。密码学作为保障信息安全的核心技术,其重要性不言而喻。中国在密码学领域也取得了显著的成就,其中SM3国密算法就是中国自主设计并推广使用的密码学标准之一。 一、SM3算法概述 SM3算法是中国国家密码管理局于2010年发布的一种密码散列函数,旨在为信息安全提供保障。该算法基于密码学原理,能够生成固定长度的散列值,用于验证数据的完整性和真实性。S

散列算法与散列码

在 Statistics.java 中,标准类库中的类(Integer)被用作 HashMap 的“键”。它运作 得很好,因为它具备了“键”所需的全部性质。但是,如果你创建自己的类作为 HashMap 的“键”使用,通常会犯一个错误。例如,考虑一个天气预报系统,将 Groundhog(土拨 鼠)对象与 Prediction(预测)对象联系起来。看起来相当简单,创建这两个类,使用 G