开放定址法(线性探测),拉链法 -Hash算法

2023-10-29

总结:

哈希别名为:Hash 或者 散列表;
开放定址法是为了解决hash值碰撞后的处理;


哈希表查找(杂凑法):(http://c.biancheng.net/cpp/html/1031.html
查找:(http://blog.csdn.net/yang_yulei/article/details/26104921

散列表(哈希)是算法在时间和空间上作出权衡的经典例子。

如果没有内存限制,我们可以直接将键作为(可能是一个超大的)数组的索引,那么所有查找操作只需要访问内存一次即可完成。但这种情况不会经常出现,因此当键很多时需要的内存太大。
另一方面,如果没有时间限制,我们可以使用无序数组并进行顺序查找,这样就只需要很少的内存。而散列表则使用了适度的空间和时间并在这两个极端之间找到了一种平衡。

开放定址法

所谓开放定址法,即是由关键码得到的哈希地址一旦产生了冲突,也就是说,该地址已经存放了数据元素,就去寻找下一个空的哈希地址,只要哈希表足够大,空的哈希地址总能找到,并将数据元素存入。

线性探测法

Hi=(Hash(key)+di) mod m ( 1≤i < m )
其中:
Hash(key)为哈希函数
m 为哈希表长度
di 为增量序列1,2,……,m-1,且di=i
步骤:
而Hash(3)=3,哈希地址上冲突,由
H1=(Hash(3)+1) mod 11=4 仍然冲突;
H2=(Hash(3)+2) mod 11=5 仍然冲突;
H3=(Hash(3)+3) mod 11=6 找到空的哈希地址,存入。

原理:
这里写图片描述

当碰撞发生时,我们直接检查散列表中的下一个位置(将索引值加1),如果不同则继续查找,直到找到该键或遇到一个空元素。
注意:
Hash表的长要大于需要插入元素值,不然最后数据无法找到空元素。

二次探测法

Hi=(Hash(key)±di) mod m
其中:
Hash(key)为哈希函数
m 为哈希表长度,m 要求是某个4k+3 的质数(k 是整数)
di 为增量序列12,-12,22,-22,……,q2,-q2 且q≤1/2 (m-1)
步骤:
对关键码寻找空的哈希地址只有3 这个关键码与上例不同,
Hash(3)=3,哈希地址上冲突,由
H1=(Hash(3)+12) mod 11=4 仍然冲突;
H2=(Hash(3)-12) mod 11=2 找到空的哈希地址,存入。

双哈希函数探测法

Hi=(Hash(key)+i*ReHash(key)) mod m (i=1,2,……,m-1)
其中:
Hash(key),ReHash(key)是两个哈希函数,
m 为哈希表长度
步骤:
双哈希函数探测法,先用第一个函数Hash(key)对关键码计算哈希地址,一旦产生地址冲突,再用第二个函数ReHash(key)确定移动的步长因子,最后,通过步长因子序列由探测函数寻找空的哈希地址。

比如,Hash(key)=a 时产生地址冲突,就计算ReHash(key)=b,则探测的地址序列为
H1=(a+b) mod m,H2=(a+2b) mod m,……,Hm-1=(a+(m-1)b) mod m

拉链法

也就是这里说。(http://blog.csdn.net/cy_cai/article/details/53609019

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开放定址法(线性探测),拉链法 -Hash算法 的相关文章

随机推荐

  • junit测试案例

    JUnit测试是以Java写成的 使用Java测试Java软件形成一个介于测试及程序代码间的无缝 seamless 边界 在测试的控制下测试变成整个软件的扩充同时程序代码可以被重整 Java编译器的单元测试静态语法检查可已帮助测试程序并且确
  • TCP的三次握手与四次挥手理解及面试题

    序列号seq 占4个字节 用来标记数据段的顺序 TCP把连接中发送的所有数据字节都编上一个序号 第一个字节的编号由本地随机产生 给字节编上序号后 就给每一个报文段指派一个序号 序列号seq就是这个报文段中的第一个字节的数据编号 确认号ack
  • LeetCode: 91 解码方法

    方法一 用递归来做 这道题一开始以为是简单的递归问题 按照从前往后的顺序递归 总是在 10 这个输入上报错 按照从后向前的方法递归 应对短序列没有问题 但是面对长序列 因为存在大量重复计算 所以超时 如果用递归来做 应该用记忆化递归 cla
  • 【linux操作系统】——页表的深入理解

    作者 努力学习的少年 个人简介 双非大二 一个正在自学c 和linux操作系统 写博客是总结知识 方便复习 目标 进大厂 如果你觉得文章可以的话 麻烦你给我点个赞和关注 感谢你的关注 在每一个进程中 每个进程都有自己的虚拟内存空间 该内存空
  • 【SpringBoot】yml配置时区的配置项

    时区参数定义yml文件 environment TZ Asia Shanghai services systemManage image ports 8082 8082 environment spring profiles active
  • git回滚reset到指定分支

    在git中我们经常会遇到提交代码之后需要进行回滚的操作 可以通过git reset 命令进行回滚 首先找到需要回滚到的提交的commit id 然后通过 git reset hard 老的commit id 然后更新当前分支到最新提交 gi
  • 16 单台与多台机器配置https证书、全站https(以discuzx为例)

    HTTPS 1 HTTPS基本概述 为什么需要使用HTTPS 因为HTTP不安全 当我们使用http网站时 会遭到劫持和篡改 如果采用https协议 那么数据在传输过程中是加密的 所以黑客无法窃取或者篡改数据报文信息 同时也避免网站传输时信
  • angularJS1笔记-(1)-多控制器

    前端写好 div div div div
  • ubuntu安装lxml

    ubuntu安装lxml 可以参考一下 先执行 sudo apt get install libxml2 dev libxslt dev python dev 然后执行 sudo easy install lxml
  • 用户态、内核态的基本概念及切换方式

    用户态 内核态 一 用户态 内核态的基本概念 二 用户态 内核态的切换方式 一 用户态 内核态的基本概念 用户态 用户态运行的进程可以直接读取用户程序的数据 内核态 内核态运行的进程或程序几乎可以访问计算机的任何资源 不受限制 两者最重要的
  • MySQL8.0.15重置密码 windows10 64位 (忘记密码或者无法登录)

    经过多次试验最终 重置密码的步骤如下 1 以管理员身份 打开命令窗口cmd 输入命令 net stop mysql 停止MySQL服务 2 开启跳过密码验证登录的MySQL服务 输入命令 mysqld console skip grant
  • Linux Ubuntu 设置脚本开机启动

    主要参考下面这个博客 ubuntu18开机启动脚本 但是要注意 有的ubuntu里面并不存在这个目录 在一开始的 vim etc systemd system rc local service 这一步就会失败 比如我的系统 最后我使用fin
  • runtime engine VM的一些随想

    这篇文章还是我在写作的新书 新时期的Node js 入门的一部分 一些比喻 我们可以通过一些现实的比喻来理解接下来要讲述的概念 苏联是社会主义的一种运行时 这大概是我这辈子能想到的最贴切的比喻了 笑 社会主义只是一种思想 可以看做是一门编程
  • 控制流图怎么画

    一 什么是控制流图 控制流图 Control Flow Graph CFG 也叫控制流程图 是一个过程或程序的抽象表现 是用在编译器中的一个抽象数据结构 由编译器在内部维护 代表了一个程序执行过程中会遍历到的所有路径 它用图的形式表示一个过
  • FPGA实现图像二值形态学滤波——腐蚀膨胀

    一 二值图像 二值图像 Binary Image 是指图像上的每一个像素只有两种可能的取值或灰度等级状态 简言之 在图像中灰度等级只有两种0或255 黑或白 二 形态学 形态学 即数学形态学 Mathematical Morphology
  • 解决 required a single bean, but 2 were found的spring注入bean错误

    背景介绍 个人定义了一个interface 为了抽象与规范使用泛型进行约束 名字举例为 ITestService java public interface ITestService
  • 希沃展台如何使用_气化街小学开展希沃触摸一体机使用方法培训

    为进一步推进气化街小学信息化教学 帮助教师熟悉希沃教学触摸一体机设备的使用功能 掌握希沃教学触摸式一体机的基本操作技巧 充分发挥触摸一体机的教学辅助作用 5月29日上午10点 万柏林区气化街小学组织一 二 三年级全体任课老师 在王学光老师的
  • 老生常谈session,cookie的区别,安全性

    老生常谈session cookie的区别 安全性 张映 发表于 2010 07 25 分类目录 php 一 为什么session cookie经常会有人提到 做web开发的人基本上都会用session和cookie 但是仅仅只是会用 并不
  • 《五分钟科普ChatGPT》系列专栏---介绍 ChatGPT未来的发展方向

    VI ChatGPT未来的发展方向 聊天机器人技术的未来发展方向包括以下几个方面 6 1 强化学习和自主学习能力 强化学习是一种让机器代理通过与环境的交互学习并改进自身策略的方法 ChatGPT未来可能会融合强化学习技术 使其能够从与用户的
  • 开放定址法(线性探测),拉链法 -Hash算法

    总结 哈希别名为 Hash 或者 散列表 开放定址法是为了解决hash值碰撞后的处理 哈希表查找 杂凑法 http c biancheng net cpp html 1031 html 查找 http blog csdn net yang