算法备胎hash和队列的特征——第五关青铜挑战
| 内容 | 1.Hash存储方式 | 
| 2.Hash处理冲突的方式 | |
| 3.队列存储的基本特征 | |
| 4.如何使用链表来实现栈 | 
1.Hash 基础
1.1Hash的概念和基本特征
哈希(Hash)也称为散列,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,这个输出值就是散列值。
很多人可能想不明白,这里的映射到底是什么意思 ,为啥访问的时间复杂度为O(1)?
我们只要看存的时候和读的时候分别怎么映射的就知道了。
我们现在假设数组array存放的是1到15这些数字,现在要存在一个大小是7的Hash表中,该如何存储呢?
我们存储的位置计算公式是:
index=number 模7
这个时候我们将1到6存入的时候,如图所示
这个没有疑问吧,就是简单的取模,然后继续7到13,结果就是这样: 
 最后再存14到15:
这个时候我们会发现有些数据被存到了同一个位置了。接下来,我们看看如何取出来。
假如我要测试13在不在这个结构里,则同样使用上面的公式来进行,很明显13模7=6.我们直接访问array[6],我们直接访问array[6]这个位置,很明显是在的,所以返回true。
假如我要测试20在不在这个结构里,则同样使用上面的公式来进行,很明显20模7=6.我们直接访问array[6],我们直接访问array[6]这个位置,但是只有6和13,所以返回false。
理解这个例子我们就理解了Hash是如何进行最近基本的映射,还有就是为什么访问的时间复杂度O(1)。
1.2碰撞处理方法
上面的例子中,我们发现有些在Hash中很多位置可能要存储两个甚至更多个元素,很明显单纯的数组是不行的,这种两个不同的输入值,根据同一散列函数计算出的散列值相同的现象叫做碰撞。
那该怎么解决呢?常见的方法有:
开放定址法(Java里的Threadlocal)、链地址法(Java里的ConcurrentHshMap)、再哈希法(布隆过滤器)、建立公共溢出区。后两者用的比较少,这里着重看前两个。
1.2.1开放地址法
开放地址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。

例如上面7,8,9的时候,7没有问题,就可以直接存到索引为0位置,8本来应该存到索引为1的位置,但是已经满了,所以继续向后找,索引3的位置是空的,所以8存到3的位置,同理9存到索引6位置。
这里 你是否有一个疑惑:这样鸠占鹊巢的方法会不会引起混乱?
比如再存入3和6的话,本来自己的为孩子好好的,但是被外来户占领了,该如何处理呢?
这个问题直到我在学习java里的ThreadLocal才揭开。具体过成可以学习下一个相关内容,我们这里只说一下基本思想。
ThreadLocal有一个专门存入元素的TheadLocalMap,每次在get和set元素的时候,会先将目标位置前后的空间搜索一下,将标记为null的位置回收,这样大部分不用的位置就受回来了。
1.2.2链地址法
将哈希表的每个单元作为链表的头结点,所有哈希地址为i的元素构成一个同义词链表。即发生冲突 时就把该关键字链在以该单元为头结点的链表的尾部。例如:

这种处理方法的问题就是处理起来代价还是比较高的,落地还要进行很多优化,例如在Java里的ConcurrentHashMap中就使用了这种方式,其中涉及元素尽量均匀、访问和操作速度要快、线程安全、扩容等很多问题。
我们来看一下下面这个Hash结构,下面的图有两处非常明显的错误,请你想想是啥

数组的长度即是2的n次幂,而他的size又不大于数组长度的75%。
HashMap的实现原理是先要找到要存放数组的下标,如果是空的就存进去,如果不是空的就判断key值是否一样,如果一样就替换,如果不一样就以链表的形式存在链表中(从JDK8开始,根据元素数量选择使用链表还是红黑树存储)。
2.队列基础知识
2.1队列的概念和基本特征
队列的特点是节点的排队次序和出队次序按入队时间先后确定,即先入队者先出队,后入队者后出队,即我们常说的FIFO(first in first out)先进先出。
队列实现方式也是两个形式,基于数组和基于链表。对于基于链表,会有点麻烦。我们将其放在黄金挑战里再看,这里只看一下基于链表实现的方法。
2.2实现队列。
基于链表实现队列还是比较好处理的,只要在尾部后插入元素,在front删除处元素就行了。
package com.yugutou.charpter5_queue_map.level1;public class LinkQueue {private Node front; // 队头指针private Node rear;  // 队尾指针private int size;   // 队列中元素个数public LinkQueue() {this.front = new Node(0);  // 构造函数中初始化队头指针this.rear = new Node(0);   // 构造函数中初始化队尾指针}/*** 入队*/public void push(int value) {Node newNode = new Node(value); // 创建一个新节点Node temp = front;              // 从队头开始遍历队列,寻找最后一个节点while (temp.next != null) {temp = temp.next;}temp.next = newNode; // 将新节点插入到队尾rear = newNode;      // 更新队尾指针size++;}/*** 出队*/public int pull() {if (front.next == null) {System.out.println("队列已空");}Node firstNode = front.next; // 找到队头节点front.next = firstNode.next; // 将队头指针指向下一个节点size--;return firstNode.data; // 返回队头节点的值}/*** 遍历队列*/public void traverse() {Node temp = front.next; // 从队头节点开始遍历队列while (temp != null) {System.out.print(temp.data + "\t"); // 打印节点的值temp = temp.next; // 移动指针到下一个节点}}static class Node {public int data;  // 节点的值public Node next; // 指向下一个节点的指针public Node(int data) {this.data = data;}}// 测试main方法public static void main(String[] args) {LinkQueue linkQueue = new LinkQueue(); // 创建队列对象linkQueue.push(1); // 向队列中添加元素linkQueue.push(2);linkQueue.push(3);System.out.println("第一个出队的元素为:" + linkQueue.pull()); // 从队列中取出第一个元素System.out.println("队列中的元素为:");linkQueue.traverse(); // 遍历队列并打印所有元素}
}
相关文章:
算法备胎hash和队列的特征——第五关青铜挑战
内容1.Hash存储方式2.Hash处理冲突的方式3.队列存储的基本特征4.如何使用链表来实现栈 1.Hash 基础 1.1Hash的概念和基本特征 哈希(Hash)也称为散列,就是把任意长度的输入,通过散列算法,变换成固定长度的输出&#…...
LLM之Agent(五)| AgentTuning:清华大学与智谱AI提出AgentTuning提高大语言模型Agent能力
论文地址:https://arxiv.org/pdf/2310.12823.pdf Github地址:https://github.com/THUDM/AgentTuning 在ChatGPT带来了大模型的蓬勃发展,开源LLM层出不穷,虽然这些开源的LLM在各自任务中表现出色,但是在真实环境下作…...
LLM之Agent(三):HuggingGPT根据用户需求自动调用Huggingface合适的模型
 浙大和微软亚洲研究院开源的HuggingGPT,又名JARVIS,它可以根据用户的自然语言描述的需求就可以自动分析需要哪些AI模型,然后去Huggingface上直接调用对应的模型,最终给出用户的解决方案。 一、HuggingGPT的工作流程 它的…...
【上海大学数字逻辑实验报告】五、记忆元件测试
一、实验目的 掌握R-S触发器、D触发器和JK触发器的工作原理及其相互转换。学会用74LS00芯片构成钟控RS触发器。学会用74LS112实现D触发器学会在Quartus II上用D触发器实现JK触发器。 二、实验原理 基本R-S触发器是直接复位-置位的触发器,它是构成各种功能的触发器…...
yaml工作常用语法总结
文章目录 yaml中的| 符号 和 > 符号yaml中的 - 符号工作中常遇到的问题- 命令行中有冒号加空格,导致yaml解析报错 yaml中的| 符号 和 > 符号 在 YAML 中,| 符号表示标量块(Scalar Block)的开始。它用于表示长文本块或保持多…...
bash中通过变量中的内容获取对应的关联数组
bash中通过变量中的内容获取对应的关联数组 Bash declare 手册: https://phoenixnap.com/kb/bash-declare 实际问题: 在 bash 中创建了多个关联数组,需要根据输入的值,获取不同的关联数组。 可以使用 if 进行多次判断ÿ…...
Redis Geo操作地理位置
Redis Geo 使用场景API列表名词API列表Springboot使用mavenyamlTest 注意事项 Redis Geo 是Redis在3.2版本中新增的功能,用于存储和操作地理位置信息 使用场景 滴滴打车:这是一个对地理位置精度要求较高的场景。通过使用Redis的GEO功能,滴滴…...
市面上的AR眼镜:优缺点分析
AR眼镜是近年来备受关注的科技产品之一。它通过将虚拟信息叠加到现实世界中,为用户提供全新的视觉体验。目前,市面上的AR眼镜主要分为两类:消费级AR眼镜和企业级AR眼镜。 消费级AR眼镜 消费级AR眼镜的特点是轻便、时尚、易于佩戴࿰…...
2024年湖南省职业院校技能竞赛高职组电子与信息专业类软件测试赛项竞赛规程及样题
湖南省职业院校技能竞赛 高职组电子与信息专业类软件测试赛项竞赛规程及样题 一、竞赛内容 1.本赛项考查的技术技能和涵盖的职业典型工作任务 任务项 任务名称 职业典型工作任务 任务一 功能测试 测试计划、测试报告文档设计与编写、测试用例 设计、测试执行和 Bug记录 任务二…...
10、pytest通过assert进行断言
官方实例 # content of test_assert1.pydef f():return 3def test_function():assert f() 4def test_assert_desc():a f()# assert a % 2 0assert a % 2 0, "value was odd, should be even"解读与实操 pytest允许你使用标准python断言来验证测试中的期望值&am…...
Webpack技术入门与实践
1.概念: 本质上, webpack是一个现代JavaScript应用程序的静态模块打包器,当webpack处理应用程序时,它会递归地构建一个依赖关系图,其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个bund…...
HarmonyOS开发(九):数据管理
1、概述 1.1、功能简介 数据管理为开发者提供数据存储、数据管理能力。 它分为两个部分: 数据存储:提供通用数据持久化能力,根据数据特点,分为用户首选项、键值型数据库和关系型数据库。数据管理:提供高效的数据管…...
acwing-Linux学习笔记
acwing-Linux课上的笔记 acwing-Linux网址 文章目录 1.1常用文件管理命令homework作业测评命令 2.1 简单的介绍tmux与vimvimhomeworktmux教程vim教程homework中的一些操作 3 shell语法概论注释变量默认变量数组expr命令read命令echo命令printf命令test命令与判断符号[]逻辑运算…...
Python渗透测试——一、数据包的编辑工具——Scapy
Python渗透测试 一、Scapy简介二、Scapy中的分层结构三、Scapy中的常用函数四、在Scapy 中发送和接收数据包五、Scapy 中的抓包函数 一、Scapy简介 提到数据包(这里泛指帧、段和报文等)的构造,我们首先需要了解协议和分层这两个概念。在“互联世界的规则一协议”中…...
使用webstrom编写vue开启提示
1.语言服务器选择 2.文件类型–忽略的文件和文件夹,删去,node_modules,就可以点进去库了 3.禁用JSLint、TSLint 4.开启node辅助 5.如果是vite,开启自动读取,或手动指定 6.如果是Webpack,开启自动读取&#…...
linux远程桌面管理工具(xrdp)、向日葵
Windows远程桌面 linux远程桌面 使用向日葵远程桌面(手机端同理) Windows远程桌面 微软自带Remote Desktop Connection Manager (RDCMan)远程控制管理软件介绍 远程桌面连接管理器 v2.93 linux远程桌面 Windows远程桌面Ubunt…...
【力扣100】8.找到字符串中所有字母异位词
添加链接描述 class Solution:def findAnagrams(self, s: str, p: str) -> List[int]:sildingstrresult[]p.join(sorted(p))for i in range(len(s)):if len(sildingstr)<len(p):sildingstrsildingstrs[i]# print(sildingstr)if len(sildingstr)len(p):sort_sildingstr.j…...
圆通速递查询,圆通速递单号查询,用表格导出查询好的物流信息
批量查询圆通速递单号的物流信息,以表格的形式导出查询好的物流信息。 所需工具: 一个【快递批量查询高手】软件 圆通速递单号若干 操作步骤: 步骤1:运行【快递批量查询高手】软件,并登录 步骤2:点击主界…...
FLStudio中文2024中文最新汉化安装包下载
FLStudio中文21最新版本以其使用速度而闻名,是一个高度复杂的音乐制作环境。FL Studio免费,联合国音序器音频和MIDI每个复合编辑都是音乐。现代的DAW是一种非凡的野兽。首先,它在很大程度上把自己放在了(几乎)每个人记录过程的核心。其次&…...
AI:大语言模型训练方法 - 机器学习
Transformer Transformer是一种深度学习的模型架构,特别适用于自然语言处理任务。Transformer 模型的核心创新在于其 "自注意力"(Self-Attention)机制,这种机制使得模型可以有效地捕捉输入数据中的长距离依赖关系。 T…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
