当前位置: 首页 > news >正文

算法备胎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 进行多次判断&#xff…...

Redis Geo操作地理位置

Redis Geo 使用场景API列表名词API列表Springboot使用mavenyamlTest 注意事项 Redis Geo 是Redis在3.2版本中新增的功能,用于存储和操作地理位置信息 使用场景 滴滴打车:这是一个对地理位置精度要求较高的场景。通过使用Redis的GEO功能,滴滴…...

市面上的AR眼镜:优缺点分析

AR眼镜是近年来备受关注的科技产品之一。它通过将虚拟信息叠加到现实世界中,为用户提供全新的视觉体验。目前,市面上的AR眼镜主要分为两类:消费级AR眼镜和企业级AR眼镜。 消费级AR眼镜 消费级AR眼镜的特点是轻便、时尚、易于佩戴&#xff0…...

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…...

圆通速递查询,圆通速递单号查询,用表格导出查询好的物流信息

批量查询圆通速递单号的物流信息&#xff0c;以表格的形式导出查询好的物流信息。 所需工具&#xff1a; 一个【快递批量查询高手】软件 圆通速递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击主界…...

FLStudio中文2024中文最新汉化安装包下载

FLStudio中文21最新版本以其使用速度而闻名&#xff0c;是一个高度复杂的音乐制作环境。FL Studio免费&#xff0c;联合国音序器音频和MIDI每个复合编辑都是音乐。现代的DAW是一种非凡的野兽。首先&#xff0c;它在很大程度上把自己放在了(几乎)每个人记录过程的核心。其次&…...

AI:大语言模型训练方法 - 机器学习

Transformer Transformer是一种深度学习的模型架构&#xff0c;特别适用于自然语言处理任务。Transformer 模型的核心创新在于其 "自注意力"&#xff08;Self-Attention&#xff09;机制&#xff0c;这种机制使得模型可以有效地捕捉输入数据中的长距离依赖关系。 T…...

为什么你明明很努力,领导却总看不到?问题出在这

许多测试同行在深夜加班排查Bug时&#xff0c;在凌晨赶写自动化脚本时&#xff0c;在对着海量数据做性能分析时&#xff0c;内心都会浮现一个共同的困惑&#xff1a;我明明已经这么拼了&#xff0c;为什么在领导眼里&#xff0c;我依然是个“找茬的”&#xff0c;而不是“创造价…...

Armv9-A架构解析:SVE/SME与安全增强技术

1. Armv9-A架构演进与核心特性全景Armv9-A架构代表了Arm公司面向未来十年计算需求的设计哲学&#xff0c;其核心在于三个维度的突破&#xff1a;性能、安全与专用计算。作为长期从事Arm架构开发的工程师&#xff0c;我见证了从Armv7到Armv9的技术跃迁。与固定宽度向量指令的NEO…...

失传34年的南极DOS游戏LAN - LOK重见天日,背后藏着怎样的历史?

LAN - LOK&#xff1a;失传34年的南极DOS破坏游戏这是一次对历史进行重构&#xff08;或许还会进行现代化改造&#xff09;的尝试。AlphaPixel常处理遗留代码库&#xff0c;接触到80年代和90年代用各种方言和语言编写、存储在难处理容器和介质中的代码。因保密协议&#xff0c;…...

3分钟掌握中兴光猫配置解密:ZET工具终极快速指南

3分钟掌握中兴光猫配置解密&#xff1a;ZET工具终极快速指南 【免费下载链接】ZET-Optical-Network-Terminal-Decoder 项目地址: https://gitcode.com/gh_mirrors/ze/ZET-Optical-Network-Terminal-Decoder 想要自由掌控家中网络却总被光猫配置限制&#xff1f;中兴光猫…...

量子机器学习安全评估:Q-SafeML原理、实现与工程实践

1. 量子机器学习安全评估&#xff1a;为什么需要一套新方法&#xff1f;量子机器学习&#xff08;QML&#xff09;正在从理论走向实践&#xff0c;尤其是在药物发现、材料科学和金融建模等对精度和可靠性要求极高的领域。然而&#xff0c;一个核心挑战也随之而来&#xff1a;我…...

TuxGuitar完整指南:免费开源吉他谱编辑器的终极教程 [特殊字符]

TuxGuitar完整指南&#xff1a;免费开源吉他谱编辑器的终极教程 &#x1f3b8; 【免费下载链接】tuxguitar Open source guitar tablature editor 项目地址: https://gitcode.com/gh_mirrors/tu/tuxguitar TuxGuitar是一款功能强大的开源吉他谱编辑器&#xff0c;支持多…...

Unity Find Reference2 2.5.2版本深度解析与正确接入指南

1. 这不是普通插件下载&#xff1a;Find Reference2 的真实价值与误用重灾区“Unity Find Reference2 2.5.2版本资源下载”——看到这个标题&#xff0c;很多Unity开发者第一反应是点开就找网盘链接、GitHub Release页面或某论坛的打包附件。我试过不下二十次&#xff1a;复制标…...

SuperMap iDesktop中BIM模型缓存生成全攻略:从性能调优到Web端流畅加载的避坑指南

SuperMap iDesktop中BIM模型缓存生成全攻略&#xff1a;从性能调优到Web端流畅加载的避坑指南 当你在深夜加班处理一个大型商业综合体的BIM模型时&#xff0c;iDesktop突然闪退&#xff0c;进度条停留在87%——这种崩溃瞬间是否似曾相识&#xff1f;作为经历过数十个大型BIM项目…...

如何免费破解百度网盘限速:Python直链解析工具终极指南

如何免费破解百度网盘限速&#xff1a;Python直链解析工具终极指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘的龟速下载而烦恼吗&#xff1f;想要免费享受…...

成本优化秘籍:如何通过模型路由(Model Routing)降低 Agent 推理成本?

成本优化秘籍:如何通过模型路由(Model Routing)降低 Agent 推理成本? 1. 引入与连接:推理成本的"隐形黑洞"与破解之道 1.1 引人入胜的开场:一个真实的成本困境 让我们从一个真实故事开始。今年早些时候,我与一家知名科技创业公司的CTO进行了一次深入交流。…...