C++面试问题合集之哈希

1.什么是哈希

哈希(Hash)是一种将数据映射到固定大小的值(哈希值)的过程。在计算机科学中,哈希函数将任意长度的数据(输入)转换为固定长度的哈希值(输出)。哈希函数通过对输入数据进行计算和转换,生成一个唯一的哈希值。

哈希函数具有以下特点:

  1. 唯一性:不同的输入数据应该生成不同的哈希值,确保哈希值的唯一性。
  2. 一致性:相同的输入数据始终生成相同的哈希值,保证了数据的一致性。
  3. 散列性:即使输入数据的稍微变化,生成的哈希值也应该有较大的差异,避免碰撞(不同数据生成相同哈希值)的发生。

需要注意的是,由于哈希函数将无限数量的输入映射到有限数量的哈希值,因此可能会出现哈希碰撞的情况,即不同的输入数据生成相同的哈希值。

2.哈希冲突是什么

哈希冲突(Hash Collision)指的是不同的输入数据经过哈希函数计算后,生成了相同的哈希值。也就是说,在哈希函数的映射过程中,不同的输入数据被映射到了同一个位置或同一个哈希桶。

3.解决哈希冲突的方法

  1. 链表法(Chaining):将哈希表的每个位置(桶)维护一个链表,当发生哈希冲突时,将冲突的元素插入到对应位置的链表中。这样可以解决同一个位置多个元素的哈希冲突问题。
  2. 开放寻址法(Open Addressing):当发生哈希冲突时,通过一定的探查序列(如线性探查、二次探查等)去寻找下一个可用的位置进行插入。这样可以在哈希表中直接找到元素的位置,避免了链表的使用,提高了内存的利用效率。
  3. 再哈希法(Rehashing):当发生哈希冲突时,在哈希表中重新计算一个哈希值,然后将元素插入到新的位置。再哈希法可以采用不同的哈希函数或者在同一个哈希函数上应用不同的哈希算法来计算新的哈希值,以期望分布更均匀,减少冲突的概率。
  4. 建立公共溢出区域(Overflow Area):为哈希表设置一个特殊的区域,用于存储发生冲突的元素。当发生哈希冲突时,将冲突的元素插入到该区域中,以避免链表和探查序列的使用。但是,这种方法会增加查找的复杂性。

4.链地址法的弊端与优化

弊端:

  1. 内存占用:链表需要额外的存储空间来存储指针或链接信息,因此在哈希表的每个位置上都有一个链表节点会增加内存的开销。
  2. 缓存效率低:由于链表节点在内存中不一定是连续存储的,降低了访问效率。
  3. 链表长度不均衡:长时间运行后,可能会出现某些链表过长,导致查找、插入和删除等操作的时间复杂度变高,影响性能。

优化措施:

  1. 动态调整哈希表大小:随着元素的插入和删除,动态调整哈希表的大小,使得哈希表的负载因子保持在一个合理的范围内。当链表过长时,可以考虑增大哈希表的大小,以减少冲突的概率。
  2. 使用更好的哈希函数:选择高散列性的哈希函数,使得元素能够均匀地分布在不同的链表中,减少链表长度差异。
  3. 链表优化:可以采用一些优化策略来提高链表的性能,例如使用双向链表或跳表替代普通链表,减少遍历的时间复杂度。

5.为什么哈希表采用链地址法而不是开放地址法

  1. 冲突处理效率:

链地址法相对于开放地址法,在处理冲突时更加高效。因为链地址法在哈希表的每个位置上维护一个链表,当发生冲突时,只需要将冲突元素插入到对应链表中即可,操作简单且时间复杂度是 O(1)。而开放地址法需要逐个地探测下一个可用位置,直到找到一个空闲槽位或者探测次数达到某个限制,从而导致插入、查找和删除操作的时间复杂度增加。

  1. 存储空间利用率:

链地址法不需要保持元素间的顺序,可以让每个位置存储多个元素(通过链表等数据结构连接),因此可以更好地利用存储空间。而开放地址法需要保持元素间的顺序,因此在处理冲突时会需要额外的空间来存储探测冲突的元素,这会导致存储空间的浪费。

  1. 动态调整:

链地址法相对于开放地址法,更容易进行动态调整。在链地址法中,当负载因子较高时,可以通过增加哈希桶的数量来分散元素,从而减少冲突发生的概率,并保持较低的平均查找时间。而开放地址法需要考虑到探测序列的连续性,因此在动态调整时会比较复杂。

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

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

相关文章

SpringBoot项目打包

1.在pom.xml的build>plugins中加入如下配置 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.1.0</version><configuration>…

C++ STL--->stack和queue

文章目录 stackstack实现参考源码 queuequeue实现参考源码 stack stack文档 stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行 元素的插入与提取操作。stack是作为容器适配器被实现的&#xff0c;容器适配器…

什么是Nginx

概念 Nginx (engine x)是一个高性能的HTTP和反向代理web服务器同时也提供IMAP/POP3/SMTP服务 主要功能反向代理 通过配置文件可以实现集群和负载均衡 静态资源虚拟化 图解 常见服务器 apache 超过百万并发后性能下降 nginx 操作简单支持并发量大 什么是代理 代理简单来说&a…

html+css 浮动、清除浮动、什么是BFC?、如何开启BFC

浮动 介绍&#xff1a; 其实早期的浮动是用来文字环绕图片效果,但是后来发现浮动还可以设置页面布局问题 块元素在文档流中默认垂直排列&#xff0c;如果希望块元素在页面中水平排列&#xff0c;可以使块元素脱离文档流 特点&#xff1a; 哪个元素设置浮动&#xff0c;哪个…

VUE3,自定义控制keep-alive缓存

安装插件 npm install vite-plugin-vue-setup-extend --save 在vite.config.ts中 import VueSetupExtend from vite-plugin-vue-setup-extend ..... plugins&#xff1a;[ vue(), VueSetupExtend(), ..... ] useKeepalive.ts import { ref } from "vue" export const…

win10系统postgresql重装软件后原数据如何迁移

1、备份postgresql安装目录下的data文件夹 2、重新安装postgresql同一版本的软件 3、停止postgresql-x64-12服务 4、替换data文件夹 删除postgresql安装后新的的data文件夹 删除后将第一步备份的data文件夹粘贴过来&#xff0c;还是同一位置 5、启动postgresql-x64-12服务 …

树莓派调用usb摄像头(三)

查看是否检索到摄像头 因为我的摄像头是usb 的所以使用一下命令查看摄像头 安装fswebcam sudo apt-get install fswebcam输入以下命令&#xff0c;开启摄像头 fswebcam --no-banner -r 640x480 image3.jpg sudo apt-get install cmake libjpeg8-dev 提示&#xff1a;Packag…

配置dns主从服务器,能够实现正常的正反向解析

一.DNS域名服务器原理及作用等介绍 1.DNS简介&#xff1a; DNS是互联网上的一项服务&#xff0c;担任域名和IP地址相互映射的一个分布式数据库&#xff0c;相较于IP&#xff0c;域名更便于记忆能够使人更方便的访问互联网。但是计算机只能基于IP来识别对方&#xff0c;而且要上…

vue3+ts+vite配置项目引入@surely-vue/table less报错

在项目当中报错Inline JavaScript is not enabled. Is it set in your options? 修改配置如下&#xff1a; return {css: {preprocessorOptions: {less: {javascriptEnabled: true //开启less编译&#xff0c;注意&#xff1a;这个很重要}}},}

怿星科技测试实验室获CNAS实验室认可,汽车以太网检测能力达国际标准

2023年12月27日&#xff0c;上海怿星电子科技有限公司测试实验室&#xff08;下称&#xff1a;EPT LABS&#xff09;通过CNAS实验室认可批准&#xff0c;并于2024年1月5日正式取得CNAS实验室认可证书&#xff08;注册号CNAS L19826&#xff09;&#xff0c;标志着怿星科技的实验…

mysql group_concat函数使用

CREATE TABLE aa (id int(11) DEFAULT NULL,name varchar(50) DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8mb41、基本查询 SELECT * FROM aa;2、以id分组&#xff0c;把name字段的值打印在一行&#xff0c;逗号分隔(默认) select id,group_concat(name) from aa group …

mac pro “RESP.app”意外退出 redis desktop manager

文章目录 redis desktop manager下载地址提示程序含有恶意代码“RESP.app”意外退出解决办法&#xff1a;下载python3.10.并安装重新打开RESP如果还是不行&#xff0c;那么需要替换错误路径&#xff08;我的没用&#xff09;外传 最近在研究redis的消息&#xff0c;看到了strea…

iOS UI掉帧和卡顿优化解决方案记录

UI卡顿原理 在 VSync 信号到来后&#xff0c;系统图形服务会通过 CADisplayLink 等机制通知 App&#xff0c;App 主线程开始在 CPU 中计算显示内容&#xff0c;比如视图的创建、布局计算、图片解码、文本绘制等。随后 CPU 会将计算好的内容提交到 GPU 去&#xff0c;由 GPU 进行…

vba设置excel单元格背景色

vba设置excel单元格背景色位蓝色 Sheet1.Cells(hang, 2).Interior.Color RGB(0, 0, 255) 参考链接 【VBA】给单元格设置背景色_vba 将一行底色置绿色-CSDN博客https://blog.csdn.net/s_h_m114_2/article/details/105787093 参考2 知乎 VBA--单元格的背景色设置 特此…

一文读懂【北交所】开通条件及交易规则!

近期市场持续萎靡不振&#xff0c;北交所却在大涨调整后&#xff0c;还能继续拉升&#xff0c;前些天还打起了“麻将”&#xff0c;“东南西北中”花式齐飞。这带给投资者朋友们极大的信心&#xff01;那么有些朋友还没有跟上吃肉&#xff0c;还不了解什么是北交所&#xff1f;…

GitLab Runner 实现项目 CI/CD 发布

Gitlab Runner简介 Gitlab实现CICD的方式有很多&#xff0c;比如通过Jenkins&#xff0c;通过Gitlab Runner等&#xff0c;今天主要介绍后者。Gitlab在安装的时候&#xff0c;就默认包含了Gitlab CI的能力&#xff0c;但是该能力只是用于协调作业&#xff0c;并不能真的去执行…

如何使用Docker一键部署WBO白板并实现固定公网地址远程访问

文章目录 前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cpolar4. 配置WBO公网访问地址5. 公网远程访问WBO白板6. 固定WBO白板公网地址 前言 WBO在线协作白板是一个自由和开源的在线协作白板&#xff0c;允许多个用户同时在一个虚拟的大型白板上画图。该白板对所有线上用…

在线项目实习|2024寒假项目实战火热报名中!

一、在线实习项目分类 二、在线实习项目流程 三、在线实习项目优惠及项目特色 1、师傅带练教学模式&#xff0c;手把手教你掌握 采用“师带徒”的教学模式&#xff0c;课程以“项目前置知识学习 师傅带练 项目实战”贯穿&#xff0c;强调动手实操&#xff0c;内容以代码落地为…

cellchat安装

官方安装文档&#xff1a; GitHub - jinworks/CellChat: R toolkit for inference, visualization and analysis of cell-cell communication from single-cell and spatially resolved transcriptomics 我安装过的命令&#xff1a; install.packages(NMF) devtools::instal…