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

        现有长度为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.rhkb.cn/news/4623.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac 上如何安装Mysql? 如何配置 Mysql?以及如何开启并使用MySQL

前言: 有许多开发的小伙伴,使用的是mac,那么在mac上如何安装,配置Mysql,以及使用Mysql了,今天来一个系统的教程。 安装Mysql 使用mysql前,我们需要先下载mysql,并按照以下几个步骤…

iOS中的设计模式(三)- 工厂方法

引言 几乎在每个用面向对象语言开发的应用程序中,都能见到工厂方法模式的身影。它是 抽象工厂模式 的核心组成部分。通过重载抽象工厂父类中定义的工厂方法,各种具体工厂能够创建属于自己的对象。 在工厂方法模式中,生产者 本身并不一定是抽…

VSCode最新离线插件拓展下载方式

之前在vscode商店有以下类似的download按钮,但是2025年更新之后这个按钮就不提供了,所以需要使用新的方式下载 ps:给自己的网站推广下~~(国内直连GPT/Claude) 新的下载方式1 首先打开vscode商店官网:vscode插件下载…

2024人工智能AI+制造业应用落地研究报告汇总PDF洞察(附原数据表)

原文链接: https://tecdat.cn/?p39068 本报告合集洞察深入剖析当前技术应用的现状,关键技术 创新方向,以及行业应用的具体情况,通过制造业具体场景的典型 案例揭示人工智能如何助力制造业研发设计、生产制造、运营管理 和产品服…

【2024 年度总结】从小白慢慢成长

【2024 年度总结】从小白慢慢成长 1. 加入 CSDN 的契机2. 学习过程2.1 万事开头难2.2 下定决心开始学习2.3 融入技术圈2.4 完成万粉的目标 3. 经验分享3.1 工具的选择3.2 如何提升文章质量3.3 学会善用 AI 工具 4. 保持初心,继续前行 1. 加入 CSDN 的契机 首次接触…

Unity Shader学习日记 part5 CG基础

在了解完Shader的基本结构之后,我们再来看看编写着色器的语言。 Shader编写语言有CG,HLSL两种,我们主要学习CG的写法。 数据类型 CG的基础变量类型 uint a12;//无符号32位整形 int b12;//32位整形float f1.2f;//32位浮点型 half h1.2h;//…

AI Agent:深度解析与未来展望

一、AI Agent的前世:从概念到萌芽 (一)早期探索 AI Agent的概念可以追溯到20世纪50年代,早期的AI研究主要集中在简单的规则系统上,这些系统的行为是确定性的,输出由输入决定。随着时间的推移,…

【24】Word:小郑-准考证❗

目录 题目 准考证.docx 邮件合并-指定考生生成准考证 Word.docx 表格内容居中表格整体相较于页面居中 考试时一定要做一问保存一问❗ 题目 准考证.docx 插入→表格→将文本转换成表格→✔制表符→确定选中第一列→单击右键→在第一列的右侧插入列→布局→合并单元格&#…

计算机网络 (46)简单网络管理协议SNMP

前言 简单网络管理协议(SNMP,Simple Network Management Protocol)是一种用于在计算机网络中管理网络节点的标准协议。 一、概述 SNMP是基于TCP/IP五层协议中的应用层协议,它使网络管理员能够管理网络效能,发现并解决网…

机器人“大脑+小脑”范式:算力魔方赋能智能自主导航

在机器人技术的发展中,“大脑小脑”的架构模式逐渐成为推动机器人智能化的关键。其中,“大脑”作为机器人的核心决策单元,承担着复杂任务规划、环境感知和决策制定的重要角色,而“小脑”则专注于运动控制和实时调整。这种分工明确…

Linux 使用 GDB 进行调试的常用命令与技巧

GDB 调试的常用命令与技巧 1. GDB 常用命令1.1 安装 GDB1.2 启动 GDB1.3 设置程序的参数1.4 设置断点1.5 启动程序并运行至断点1.6 执行一步1.7 打印变量值1.8 查看函数调用栈 2. GDB 调试 Core 文件2.1 生成 Core 文件2.2 使用 GDB 调试 Core 文件 3. GDB 调试正在运行的程序3…

光谱相机如何还原色彩

多光谱通道采集 光谱相机设有多个不同波段的光谱通道,可精确记录每个波长的光强信息。如 8 到 16 个甚至更多的光谱通道,每个通道负责特定波长范围的光信息记录。这使得相机能分辨出不同光谱组合产生的相同颜色感知,而传统相机的传感器通常只…

AUTOSAR从入门到精通-线控底盘技术

目录 几个高频面试题目 为何高阶智能驾驶需要线控底盘 线控底盘与传统底盘有何区别? 算法原理 线控技术发展背景 国外研究现状 国内研究现状 什么是线控底盘? 组成结构是什么? 线控底盘的发展: 线控底盘名词解释: 汽车线控系统关键技术 线控底盘的组成 电子…

跨境电商使用云手机用来做什么呢?

随着跨境电商的发展,越来越多的卖家开始尝试使用云手机来协助他们的业务,这是因为云手机具有许多优势。那么,具体来说,跨境电商使用云手机可以做哪些事情呢? (一)实现多账号登录和管理 跨境电商…

springboot项目属性配置方式

基于上篇博客 springboot项目部署到本地,本博客主要讲springboot项目属性配置方式,这篇文章将在后几天持续维护、更新。

Java 多态/向下转型/instanceof

1. 多态 1.1 概述 多态:事务的不同形态,如 动物,其有多种形态:猫,狗之类的; 1.2 使用方法 虚拟方法(父类被重写的方法在多态中叫做虚拟方法)调用: 父类引用指向子类…

【Maven】resources-plugin

在使用maven的项目中,它默认加载的是resources目录下的资源文件,像properties、xml 这类资源文件,但有时候可能会定义在java 源码目录下,这时候运行项目就会报找不到资源文件的错误 来到classpath 下,发现没有这个xsd…

我的创作纪念日——我与CSDN一起走过的365天

目录 一、机缘:旅程的开始 二、收获:沿路的花朵 三、日常:不断前行中 四、成就:一点小确幸 五、憧憬:梦中的重点 一、机缘:旅程的开始 最开始开始写博客是在今年一二月份的时候,也就是上一…

Restormer: Efficient Transformer for High-Resolution Image Restoration解读

论文地址:Restormer: Efficient Transformer for High-Resolution Image Restoration。 摘要 由于卷积神经网络(CNN)在从大规模数据中学习可推广的图像先验方面表现出色,这些模型已被广泛应用于图像复原及相关任务。近年来&…

Nginx location 和 proxy_pass 配置详解

概述 Nginx 配置中 location 和 proxy_pass 指令的不同组合方式及其对请求转发路径的影响。 配置效果 1. location 和 proxy_pass 都带斜杠 / location /api/ {proxy_pass http://127.0.0.1:8080/; }访问地址:www.hw.com/api/upload转发地址:http://…