算法通关村第五关—Hash基础知识(青铜)

            Hash基础

一、Hash的概念和基本特征

哈希(Hash)也称为散列,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,这个输出值就是散列值。
很多人可能想不明白,这里的映射到底是啥意思,为啥访问的时间复杂度为O(1)?我们只要看存的时候和读的时候分别怎么映射的就知道了。
我们现在假设数组array存放的是1到15这些数,现在要存在一个大小是7的Hash表中,该如何存呢?我们存储的位置计算公式是:
index = number % 7
截屏2023-11-30 20.49.48.png

假如我要测试13在不在这里结构里,则同样使用上面的公式来进行,很明显13%7=6,我们直接访问array[6]这个位置,很明显是在的,所以返回true。
假如我要测试20在不在这里结构里,则同样使用上面的公式来进行,很明显20模7=6,我们直接访问array[6]这个位置,但是只有6和13,所以返回false。
理解这个例子我们就理解了Hash是如何进行最基本的映射的,还有就是为什么访问的时间复杂度为O(1)。

二、碰撞处理方法(2种)

在上面的例子中,我们发现有些在Hsh中很多位置可能要存两个甚至多个元素,很明显单纯的数组是不行的,这种两个不同的输入值,根据同一散列函数计算出的散列值相同的现象叫做碰撞。
那该怎么解决呢?常见的方法有:开放定址法(Java里的Threadlocal)、链地址法(Java里的ConcurrentHashMap)、再哈希法(布隆过滤器)、建立公共溢出区。后两种用的比较少,重点看前两个。

1.开放定址法

开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。截屏2023-11-30 20.53.57.png
例如上面要继续存7,8,9的时候,7没问题,可以直接存到索引为0位置。8本来应该存到索引为1的位置,但是已经满了,所以继续向后找,索引3的位置是空的,所以8存到3位置。同理9存到索引6位置。
这里是否有一个疑惑:这样鸠占鹊巢的方法会不会引起混乱?比如再存3和6的话,本来自己的位置好好的,但是被外来户占领了,该如何处理呢?这个问题直到我在学习Java里的ThreadLocal才解开。具体过程可以学习一下相关内容,我们这里只说一下基本思想。ThreadLocal?有一个专门存储元素的TheadLocalMap,每次在get和set元素的时候,会先将目标位置前后的空间搜索一下,将标记为nul的位置回收掉,这样大部分不用的位置就收回来了。这就像假期后你到公司,每个人都将自己的位子附近打扫干净,结果整个工作区就很干净了。当然Hsh处理该问题的整个过程非常复杂,涉及弱引用等等,这些都是Java技术面试里的高频考点。

2.链地址法

将哈希表的每个单元作为链表的头结点,所有哈希地址为的元素构成一个同义词链表。即发生冲突时就把该关键字链在以该单元为头结点的链表的尾部。例如:
截屏2023-11-30 20.54.08.png
这种处理方法的问题是处理起来代价还是比较高的,要落地还要进行很多优化,例如在Java里的ConcurrentHashMap中就使用了这种方式,其中涉及元素尽量均匀、访问和操作速度要快、线程安全、扩容等很多问题。
我们来看一下下面这个Hash结构,下面的图有两处非常明显的错误,请你先想想是啥。
截屏2023-11-30 20.54.18.png

首先是数组的长度必须是2的n次幂,这里长度是9,明显有错,然后是enty的个数不能大于数组长度的75%,如果大于就会触发扩容机制进行扩容,这里明显是大于75%,正确的图应该是这样的:
截屏2023-11-30 20.54.31.png

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】firewall防火墙配置-解决Zookeeper未授权访问漏洞

背景: zookeeper未授权访问漏洞,进行限制访问,采用防火墙访问策略 配置步骤: ##查看firewall配置清单 firewall-cmd --list-all ##查到为关闭态,启动防火墙 systemctl start firewalld ## 添加端口,这里…

lv11 嵌入式开发 轮询与中断13

1 CPU与硬件的交互方式 轮询 CPU执行程序时不断地询问硬件是否需要其服务,若需要则给予其服务,若不需要一段时间后再次询问,周而复始 中断 CPU执行程序时若硬件需要其服务,对应的硬件给CPU发送中断信号,CPU接收到中…

训练自己的个性化Stable diffusion模型,LORA

一、背景 需要训练自己的LORA模型 二、分析 1、有sd-webui有训练插件功能 2、有单独的LORA训练开源web界面 两个开源训练界面 1、秋叶写的SD-Trainer https://github.com/Akegarasu/lora-scripts/ 没成功,主要也是cudnn和nvidia-smi中的CUDA版本不一致退出 2…

window10家庭版中文转专业版流程

1.确认当前为家庭中文版 2.用管理员权限打开cmd窗口 3.输入 dism /online /get-targeteditions ,查询当前支持的升级的版本 4.专业版密钥:VK7JG-NPHTM-C97JM-9MPGT-3V66T 5.changepk.exe /productkey VK7JG-NPHTM-C97JM-9MPGT-3V66T

.NET开源的处理分布式事务的解决方案

前言 在分布式系统中,由于各个系统服务之间的独立性和网络通信的不确定性,要确保跨系统的事务操作的最终一致性是一项重大的挑战。今天给大家推荐一个.NET开源的处理分布式事务的解决方案基于 .NET Standard 的 C# 库:CAP。 CAP项目介绍 CA…

深入了解Rabbit加密技术:原理、实现与应用

一、引言 在信息时代,数据安全愈发受到重视,加密技术作为保障信息安全的核心手段,得到了广泛的研究与应用。Rabbit加密技术作为一种新型加密方法,具有较高的安全性和便捷性。本文将对Rabbit加密技术进行深入探讨,分析…

DDD落地:从携程订单系统重构,看DDD的巨大价值

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题: 谈谈你的DDD落地经验? 谈谈你对DDD的理解&#x…

【人工智能Ⅰ】实验3:蚁群算法

实验3 蚁群算法的应用 一、实验内容 TSP 问题的蚁群算法实现。 二、实验目的 1. 熟悉和掌握蚁群算法的基本概念和思想; 2. 理解和掌握蚁群算法的参数选取,解决实际应用问题。 三、实验原理 1.算法来源 蚁群算法的基本原理来源于自然界…

前馈全连接层

B站教学视频链接:2.3.4前馈全连接层-part2_哔哩哔哩_bilibili

麒麟操作系统网桥配置

网桥概念: Bridge 是 Linux 上用来做 TCP/IP 二层协议交换的设备,其功能可 以简单的理解为是一个二层交换机或者 Hub;多个网络设备可以连接 到同一个 Bridge,当某个设备收到数据包时,Bridge 会将数据转发 给其他设备。…

【JMeter】运行方式

第一种: 使用GUI 操作: 在JMeter界面菜单导航上点击运行按钮 一般用作创建TestPlan和调试脚本增加java堆空间来满足测试环境 第二种:使用CLI(Command Line) 性能测试一般请求量比较大,为了节省资源 CLI参数用法: 字段…

C/C++ 实现FTP文件上传下载

FTP(文件传输协议)是一种用于在网络上传输文件的标准协议。它属于因特网标准化的协议族之一,为文件的上传、下载和文件管理提供了一种标准化的方法,在Windows系统中操作FTP上传下载可以使用WinINet库,WinINet&#xff…

免费的电脑AI写作工具-5款好用的智能AI写作软件

随着人工智能(AI)技术的不断进步,电脑AI写作已经成为现代写作领域的一项不可或缺的工具。通过深度学习和自然语言处理的融合,AI写作软件得以模拟人类的创造性和表达能力,为我们提供了快速、高效地生成优质文字内容的可…

详解HTTP协议(介绍--版本--工作过程--Fiddler 抓包显示--请求响应讲解)

目录 一.HTTP协议的介绍 1.1HTTP是什么? 1.2HTTP版本的演变 二.HTTP的工作过程 三.使用Fiddler抓包工具 3.1简单讲解Fiddler 3.2Fiddler工作的原理 3.3抓包结果分析 四.HTTP请求 4.1认识URL 4.2关于URL encode 4.3认识方法 4.3.1认识get和post 4.3.…

网络唤醒原理浅析(Wake On LAN)

原理 将唤醒魔术包发送的被唤醒机器的网卡上,魔术包指AMD公司开发的唤醒数据包,具有远程唤醒的网卡都支持这个标准,用16进制表示如下: 6对“FF”前缀16次重复MAC地址,举个例子假如我的网卡MAC地址是:AA:BB:CC:DD:EE:…

切水果小游戏

欢迎来到程序小院 切水果 玩法&#xff1a;点击鼠标左键划过水果&#xff0c;快去切水果&#xff0c;看你能够获划出多少水果哦^^。开始游戏https://www.ormcc.com/play/gameStart/205 html <div id"game" class"game" style"text-align: center;…

常用的设计模式

常用的设计模式&#xff1a; 一、单例模式 java中单例模式是一种常见的设计模式&#xff0c;单例模式的写法有好几种&#xff0c;这里主要介绍三种&#xff1a;懒汉式单例、饿汉式单例、双重检查锁定 1、单例模式有以下特点&#xff1a;   a、单例类只能有一个实例。   b…

JUC并发编程 01——多线程基础知识

一.线程应用 异步调用 以调用方角度来讲&#xff0c;如果 需要等待结果返回&#xff0c;才能继续运行就是同步 不需要等待结果返回&#xff0c;就能继续运行就是异步 应用 比如在项目中&#xff0c;视频文件需要转换格式等操作比较费时&#xff0c;这时开一个新线程处理视…

手持机|三防智能手机_4寸/5寸/6寸安卓系统三防手机PDA手持终端方案

随着科技的不断发展&#xff0c;三防手持机作为一种多功能设备&#xff0c;正逐渐在各行业得到广泛应用。这款手持机采用高性能处理器&#xff0c;支持高精度北斗定位和工业本安防爆功能&#xff0c;并具备IP67级防水防尘性能和1.5米防跌落能力。因此&#xff0c;它在仓储管理、…

力扣题:字符的统计-11.29

力扣题-11.29 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;032. 有效的字母异位词 解题思想&#xff1a;直接遍历即可 class Solution(object):def isAnagram(self, s, t):""":type s: str:type t: str:rtype: bool""…