哈希(hashing)、哈希函数(Hash Function)、哈希表(Hash Table)、哈希冲突(Hash Collision)

news2025/1/21 18:32:25

        现有长度为7、初始为空的散列表HT,散列函数H(k)=k % 7,用线性探测再散列法解决冲突。将关键字22,43,15依次插入到HT后,查找成功的平均查找长度是(   )

        A.1.5      B.1.6     C.2      D.3 

首先,我们需要了解,什么是哈希?什么是哈希函数?什么是哈希表?什么是哈希冲突?什么是平均查找长度ASL?

哈希(hashing)

  1. 即一种方法,通过合理选择哈希函数关键字(Key)映射到表中一个位置,直接定位数据位置,无需进行比较,避免了逐一遍历,从而加快查找插入删除的速度,用时为常数平均时间这里讲到的表即为哈希表

    1. 哈希函数(Hash Function)

      1. 也称为散列函数,是一种能把输入值影射为输出字符串的算法。哈希函数产生的哈希值具有唯一性,罕见情况下会产生碰撞问题。

    2. 关键字(key)

      1. 也就是项的某个部分

      2. 关键字对应的记录存储位置称为哈希地址(Hash Address

      3. 若对于关键字集合中的任一个关键字,经哈希函数映象到地址集合中任何一个地址的概率是相等的,则称此类哈希函数为均匀哈希函数

        1. 均匀哈希函数(Uniform Hash function)

          1. 使关键字经过哈希函数得到一个“随机的地址”,从而减少冲突。

    3. 哈希表(Hash Table)

      1. 也被称为散列表。是一种使用哈希将记录存储在一块连续的存储空间中的表,它是通过关键字值(Key value)直接进行访问的数据结构,底层数据结构是包含一些项的数组。

        1. 根据给定的关键字key,用该表对应的哈希函数求得哈希地址,判断该地址的记录与key是否相同。

          1. 相同

            1. 结构为Set(集合)。

          2. 不相同

            1. 结构为Map(键值对集合)。

            2. 用此哈希表处理冲突的方法来找到下一个哈希地址,直到哈希地址的记录为空或者找到与key值相同的记录为止。

      2. 时间复杂度

        1. 时间复杂度为O(1)。

        2. 通过牺牲一定的存储空间来换取时间上的优势【算法上称为“空间换时间”】。

        3. 查找过程和造表过程基本一致。

          1. 能够在数据库索引‌、缓存‌、词频统计‌中保持高效的性能,极大地提高了数据高效访问、处理的效率。

          2. 但对于有序访问却没有办法应对。

    4. 哈希冲突(Hash Collision)

      1. 由于关键码集合通常比地址集合大,有时候会出现不同的键映射到同一个位置的情况,这种情况叫哈希冲突,需要进行处理,均匀地将数据分布到整个哈希表中,有两种处理方法:

        1. 开放地址法(Open Addressing)
          1. 这种方法会在遇到冲突时尝试寻找其他空闲位置存储元素,空间利用率较高,但实现复杂度较大。
            1. 线性探测法
              1. Hᵢ(key) = ( key + dᵢ ) % p (p≤m) m为哈希表表长
                1. dᵢ=0,1,2,3,......,m-1
              2. 线性探测再散列法
                1. 再散列法
                  1. 这种方法会在遇到冲突时尝试更换以下提到的不同的哈希方法计算哈希地址从而解决冲突。​​​​​​​​​​​​​​​​​​​​​​​​​​​​
                    1. 除留余数法【最常用】

                      1. ​​​​​​​​​​​​​​​​​​​​H(key) = key % p (p≤m) m为哈希表表长。

                        1. 如果p选得不好,就很容易出现同义冲突的情况。

                          1. 同义词(Synonym)

                            1. 两个标识符经过哈希函数运算后所得的数值相同,即称这两个标识符为该哈希函数的同义词。

                    2. 随机数法

                    3. 折叠法

                    4. 平方取中法

                    5. 数字分析法

                    6. 直接寻址法

            2. 二次探测法
              1. Hᵢ(key) = ( key + dᵢ ) % p (p≤m) m为哈希表表长
                1. dᵢ=1²,-1²,2²,-2²,......,q²,-q²,q≤m/2
                2. 即变成平方的这种,减少冲突的可能性
        2. 链地址法(Separate Chaining)【别名:链式法、分离链接法】
          1. 每个哈希桶存储一个链表,所有映射到相同位置的键值对都存储在这个链表中。即使多个键映射到同一个桶,它们也可以通过链表组织在一起,避免了哈希表的性能下降‌。
            1. 桶(Bucket)
              1. 也就是哈希表中多个存储记录的位置
                1. 槽(Slot)
                  1. 也就是​​​​​​​​​​​​​​每一个记录包含的多个字段
              2. 桶中元素过少
                1. 也就是负载因子过小,会造成空间浪费。
                  1. 负载因子【也称为加载密度(Loading Factor),一般用α表示
                    1. α=标识符使用数目/(每一个桶里面的槽数×桶的个数)
              3. 桶中元素较多
                1. 也就是负载因子过大,容易导致冲突。
                2. 桶溢出
                  1. 经过哈希函数运算后桶满了,就会发生桶溢出。
            2. 链表
              1. 可以动态调整指针进行扩展,无需预先确定大小,当发生冲突时,直接在链表中高效地添加和删除元素,即可以容纳多个发生冲突的键值对‌。
                1. 但链表长度过长,时间复杂度可能退化为O(n)‌1。
                2. 链表中的每个节点需要额外的指针来连接,空间利用率较低。
                  1. 需要额外的空间去存储,甚至需要使用其他数据结构。

回到题目,

        现有长度为7、初始为空的散列表HT,散列函数H(k)=k % 7,用线性探测再散列法解决冲突。将关键字22,43,15依次插入到HT后,查找成功的平均查找长度是(   )

        A.1.5      B.1.6     C.2      D.3 

        

        由上可知:

  1. 再散列法这种方法会在遇到冲突时尝试更换不同的哈希方法计算哈希地址从而解决冲突。
    1. 最常用的莫过于除留余数法

      1. ​​​​​​​​​​​​​​​​​​​​H(key) = key % p (p≤m) m为哈希表表长。

  2. 线性探测法的方法如下:
    1. Hᵢ(key) = ( key + dᵢ ) % p (p≤m) m为哈希表表长(p≤m) m为哈希表表长​​​​​​​
      1. dᵢ=0,1,2,3,......,m-1
    2. ​​​​​​​​​​​​​​其实可以看出用的方法就是除留余数法
  3. ​​​​​​​故而,​​​​​​​​​​​​​​线性探测再散列法可以理解为我第一次用了除留余数法,那么遇到冲突了,那我就再散列,也就是再次使用除留余数法,只不过其中的Hᵢ(key) = ( key + dᵢ ) % p 的dᵢ发生了变化,如下:
    1. 已知散列函数H(k)=k % 7,
      1. 第1个关键字是22,那么第1次算时dᵢ=0,(22+0)%7=22%7=1
        1. 因为余数=1,所以在下表序号1这里写关键字22
        2. 余数【也就是哈希地址的索引下标】0123456
          关键字22
      2. 第2个关键字是43,又dᵢ=0,1,2,3,......,m-1那么dᵢ=0时,(43+0)%7=1
        1. 又是余1,结果就冲突了,那么我们就再散列,即后退1位【即右移1位】,即dᵢ=1,故(43+1)%7=2,余数是2,这下不冲突,因为余数=2,所以在下表序号2这里写关键字43​​​​​​​​​​​​​
        2. 余数【也就是哈希地址的索引下标】0123456
          关键字2243
      3. 第2个关键字是15,又dᵢ=0,1,2,3,......,m-1那么dᵢ=1时,(15+1)%7=2
        1. 又是余2,结果就冲突了,那么我们就再散列,即后退1位【即右移1位】,即dᵢ=2,故(15+2)%7=3,余数是3,这下不冲突,因为余数=3,所以在下表序号3这里写关键字15​​​​​​
        2. 余数【也就是哈希地址的索引下标】0123456
          关键字224315

平均查找长度ASL(Average Search Length)

        在查找成功的情况下,平均查找长度是查找树中从根节点到被查找键路径长度平均值

        故我们得到的

余数【也就是哈希地址的索引下标】0123456
关键字224315

        其中的0,1,2,3,4,5,6就是分别从根节点到被查找键的路径长度

                要找关键字22,从根节点到被查找键的路径长度为1

                要找关键字43,从根节点到被查找键的路径长度为2

                要找关键字15,从根节点到被查找键的路径长度为3

                个数n=3,

                故将关键字22,43,15依次插入到HT后,最后查找成功的平均查找长度是

                ASL成功= (1+2+3)/3=6/3=2,故选C

                

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2279958.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle 深入学习 Part 14:Managing Password Security and Resources(管理密码安全性和资源)

Profiles Profile 是一个以名称标识的集合,用于管理 密码 和 资源限制。 每个用户都对应一个profiles,可以通过 CREATE USER 或 ALTER USER 命令分配给用户。 Profiles 可以启用或禁用。 Profiles 可以关联到默认的 DEFAULT Profile。 密码管理&…

Qt 5.14.2 学习记录 —— 십칠 窗口和菜单

文章目录 1、Qt窗口2、菜单栏设置快捷键添加子菜单添加分割线和菜单图标 3、工具栏 QToolBar4、状态栏 QStatusBar5、浮动窗口 QDockWidget 1、Qt窗口 QWidget,即控件,是窗口的一部分。在界面中创建控件组成界面时,Qt自动生成了窗口&#xf…

计算机视觉模型的未来:视觉语言模型

一、视觉语言模型 人工智能已经从识别数据中的简单模式跃升为理解复杂的多模态数据。该领域的发展之一是视觉语言模型 (VLM) 的兴起。这类模型将视觉和文本之间联系起来,改变了我们理解视觉数据并与之交互的方式。随着 VLM 的不断发展,它们正在为计算机视觉设定一个新的水平…

从前端视角看设计模式之结构型模式篇

上篇我们介绍了 设计模式之创建型模式篇,接下来介绍设计模式之结构型模式篇 适配器模式 适配器模式旨在解决接口不兼容的问题,它通过创建一个适配器类,将源对象的接口转换成目标接口,从而使得不兼容的接口能够协同工作。简单来说…

计算机的错误计算(二百一十七)

摘要 大模型能确定 sin(2.6^100) 的符号吗?实验表明,无法确定。因为正弦的自变量值比较大,虽然大模型尝试了许多种方法。这个大模型特别认真负责。 例1. sin(2.6^100) 的符号? 下面是与一个大模型的对话。 点评: …

解决wordpress媒体文件无法被搜索的问题

最近,我在wordpress上遇到了一个令人困扰的问题:我再也无法在 WordPress 的媒体库中搜索媒体文件了。之前,搜索媒体非常方便,但现在无论是图片还是其他文件,似乎都无法通过名称搜索到。对于我这样需要频繁使用图片的博主来说,这简直是个大麻烦。 问题源头 一开始,我怀…

源代码保密技术的工作原理解析

SDC沙盒加密技术:深度解析与工作原理 在数据安全领域,加密技术是保护敏感信息免受泄露和未授权访问的关键手段。SDC沙盒采用了一系列先进的加密技术,确保数据在创建、存储、传输和使用过程中的全程加密,为企业提供了全方位的数据…

详解共享WiFi小程序怎么弄!

在数字化时代,共享WiFi项目​正逐渐成为公共场所的新标配,它不仅为用户提供了便捷的上网方式,还为商家带来了额外的收入来源。那么共享wifi怎么弄,如何搭建并运营一个成功的共享WiFi项目呢? 共享WiFi项目通过在公共场所…

C# 给定欧氏平面中的一组线可以形成的三角形的数量

给定欧氏平面中的一组线可以形成的三角形的数量(Number of Triangles that can be formed given a set of lines in Euclidean Plane) 给定欧氏平面上的 n 条不同直线的集合 L {l 1 , l 2 , ………, l n }。第i 条直线由形式为 a i x b i y c i的方程给出。求出可以使用集合…

KubeKey安装K8s和kubesphere

安装指南 在 Linux 上安装 Kubernetes 和 KubeSphere 卸载 Kubernetes 和 KubeSphere 前置工作-网络问题 yum -y install socat conntrack etables ipsetalias kkkubectl -n kubesphere-systemexport http_proxy10.10.x.x:7890 export https_proxy10.10.x.x:7890Docker设置网…

国内有哪些著名的CRM系统提供商?

嘿,你有没有想过,在这个信息爆炸的时代里,企业怎么才能更好地管理客户关系呢?答案就是使用高效的CRM系统。今天我就来给大家聊聊那些在国际上非常有名的CRM系统提供商吧。 悟空CRM 首先不得不提的就是悟空CRM了!这可…

聊一聊 vPC Peer-gateway 网关增强功能

默认情况下 vPC 对等设备收到目的 MAC 地址为交换机上配置的 HSRP/VRRP 的虚拟 MAC 的数据报文,该交换机将根据其本地路由表对数据包进行路由并会用新的源目 MAC

基于深度学习的微出血自动检测及解剖尺度定位|文献速递-视觉大模型医疗图像应用

Title 题目 Toward automated detection of microbleeds with anatomical scale localization using deep learning 基于深度学习的微出血自动检测及解剖尺度定位 01 文献速递介绍 基于深度学习的脑微出血(CMBs)检测与解剖定位 脑微出血&#xff…

金融项目实战 07|Python实现接口自动化——连接数据库和数据清洗、测试报告、持续集成

目录 一、投资模块(投资接口投资业务) 二、连接数据库封装 和 清洗数据 1、连接数据库 2、数据清洗 4、调用 三、批量执行测试用例 并 生成测试报告 四、持续集成 1、代码上传gitee 2、Jenkin持续集成 一、投资模块(投资接口投资业务…

Video-RAG:一种将视频RAG新框架

1. 摘要及主要贡献点 摘要: 检索增强生成(RAG)是一种强大的策略,通过检索与查询相关的外部知识并将其整合到生成过程中,以解决基础模型生成事实性错误输出的问题。然而,现有的RAG方法主要集中于文本信息&…

2024嵌入式系统的未来发展与技术洞察分享

时间如白驹过隙,不知不觉又是一年,这一年收获满满。接下来,将本年度对技术的感悟和洞察分析如下,希望对大家有所帮助。 在过去几十年里,嵌入式系统技术迅速发展,成为现代电子设备和智能硬件的核心组成部分。…

对人型机器人的研究和展望

目录 概述 1 核心软硬件部件 1.1 运动控制部分 1.1.1 减速机 1.1.2 编码器 1.1.3 直流无刷电机 1.2 智能仿生手 1.3 控制板卡 2 人型机器人的应用 3 未来展望 概述 如果现在有人问:当前那个行业最火?毫无疑问答案肯定是人型机器人了。当前各类机…

创建 pdf 合同模板

创建 pdf 合同模板 一、前言二、模板展示三、制作过程 一、前言 前段时间要求创建“pdf”模板,学会了后感觉虽然简单,但开始也折腾了好久,这里做个记录。 二、模板展示 要创建这样的模板 三、制作过程 新建一个“Word”,这里命…

欧拉(Euler 22.03)安装ProxySQL

下载离线安装包 proxysql-2.0.8-1-centos7.x86_64.rpm 链接: https://pan.baidu.com/s/1R-SJiVUEu24oNnPFlm9wRw 提取码: sa2w离线安装proxysql yum localinstall -y proxysql-2.0.8-1-centos7.x86_64.rpm 启动proxysql并检查状态 systemctl start proxysql 启动proxysql syste…

Comsol 空气耦和超声表面波法检测PMMA表面裂纹

空气耦合超声表面波法是一种常用于检测材料表面裂纹的无损检测技术。下面是一些步骤,您可以使用这种方法来检测PMMA(聚甲基丙烯酸甲酯)表面裂纹: 1. 准备工作:准备一台超声波检测设备,包括超声发射器和接收…