算法通过村第五关-队列和Hash青铜笔记|队列和Hash

文章目录

  • 前言
  • 1. Hash基础
    • 1.1 Hash的概念和基本特征
    • 1.2 碰撞处理方法
      • 1.2.1 开放地址法
      • 1.1.2 链地址法
  • 2. 队列的基础
    • 2.1 队列的概念和基本特征
    • 2.2 队列的实现
  • 总结


前言


提示:幸福的秘密是尽量扩大自己的兴趣范围对感兴趣的人和物尽可能的友善 --波特兰·罗素

谈完栈,我们今天就来聊聊队列和Hash,这也是很常见的数据结构,尤其是Hash。

1. Hash基础

哈希(Hash)也称为是散列表,就是把任意长度的输入,通过散列算法,变成固定长度的输出,这个输出也称为散列值。

1.1 Hash的概念和基本特征

很多人对于映射这个东西,很难理解,为啥就说Hash的访问时间复杂度就是O(1)?我们今天就来谈谈这个东西是真么回事。🥰

假设我们现在要将1-15存放如数组长度为7的array中,我们应该怎么存储呢?我给你一个公式:

index = number % 7

这个时候我们先将1-6出入的时候,看图:
在这里插入图片描述
这里没有问题吧,那我们接着存储7-17,如下图:
在这里插入图片描述
不是还有14、15呢,是这样的,看图:
在这里插入图片描述
这个时候我们会发现有些数据被存放在同一个位置了,我们后面再讨论这个问题,接下来我们看看,我们将如何取值?

假如我要测试13在不在结构,我是不是还需要上面的公式,计算一下index = 13 % 7 6 ,我么你直接访问array[6]这个位置就可以拿到结果,然后返回true;

同样的我想知道20在不在呢?也是用上面的公式,即 index = 20 % 7 6 这是我们再访问array[6]这个位置,但是这里面只有6和13 没有20,我们就返回 false。

理解了这个例子我们就理解了Hash是如何做最基本的映射的,还有就是说问什么它的访问时间复杂度为O(1)。

1.2 碰撞处理方法

上面的例子重构,我们发现有些Hash中很多位置要存储两个甚至多个元素,很明显单纯的数组是行不通的,这种两个不同的输入值,根据统一的散列函数计算出的散列值相同的现象就叫做碰撞啦

那我我们要怎么解决呢?常见的方法:

  • 开放地址法(Java中的Threadlocal)
  • 链地址法(Java里的ConcurrentHashMap)
  • 再哈希法(布隆过滤器)
  • 建立公共溢出区

后面两种方法目前不常见,我们重点看看前面的两个。

1.2.1 开放地址法

开放地址法就是一旦发生冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总是可以找到的,并记录存入的。
在这里插入图片描述
如上图:存储7,8,9的时候,对于7的话,可以直接存储在索引的位置0,8应该存储在1的位置,但是现在满了怎么办呢?就继续向后寻找,找到3的位置是空,所以8存储在3的位置上,同理9的位置也是这样。

这里你是否有一个疑问:这样的话鸠占鹊巢的方法会不会引起混乱?不如再存3和6的话,本来自己的位置好好的,但是现在却被占用了,我们该怎么处理呢?这个问题Java里的ThreadLocal会有答案,感兴趣的话可以学习一下。ThreadLocal有一个专门存储元素的ThreadLocalMap,每次在get和set元素的时候,会将目标位置前后的空间搜索一下,将标记为null的位置回收掉,这样大部分不用的位置就收回了。还有一点Hash处理该问题的过程也是非常复杂,设计弱引用等等,这些也都是Java技术面试的高频考点。

1.1.2 链地址法

将哈希表的每个单元作为链表的头节点,所有的哈希地址为i的元素构成一个同义词链表。即发生冲突时就把该关键词链在该单元为头节点的链表的尾部。比如:
在这里插入图片描述
这种处理的方法问题在于处理起来的代价有点高,要落地还需要很多优化,比如在Java里ConcurrentHashMap中就使用了这种方式,其中涉及元素尽量均匀,访问和操作速度要快,线程安全,扩容等等。

我们来看看这个Hash结构,限免的图有两处很严重的错误,麻烦找出来:
在这里插入图片描述
首先数组的长度必须时2的n次幂,长度9,明显有问题,然后Entry的个数不能大于数组长度的75%,如果大于就要触发扩容机制,这里明显发育75%,正确的呢?应该是下面这样:
在这里插入图片描述
记住一下两点:

  1. 数组的长度即是2的n次幂
  2. Size不是超过数组长度的75%

顺便说一下,Hash的实现原理是先找到存放数组的下标,如果是空着就存进去,如果不是空的就判断key值是否一样,如果一样就替换掉,如果不一样就一链表的形式存储在后面(从JDK8开始,根据元素数量选择使用链表是红黑树存储)

2. 队列的基础

2.1 队列的概念和基本特征

队列的特点是节点的排序次序和出队次序按照入队时间先后确定,也就是常说的先进先出呗。【FIFO】。队列的实现有两种方法(形式),基于数组的实现和基于链表的实现,由于链表的长度可以随时改变,实现起来也比较简单。相反基于数组就比较麻烦,这里后面再来实现,我们先看一下基于链表的实现。

2.2 队列的实现

基于链表实现队列还是比较好处理的,只要在尾部插入元素,在front删除元素就可以了。

public class LinkQueue {private Node front;private Node rear;private int size;public LinkQueue() {// 带头尾节点的遍历front = new Node(0);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){throw new IllegalStateException("front.next is null");}Node firstNode = front.next;front.next = firstNode.next;size--;return firstNode.data;}/*** 遍历队列*/public void traverse() {Node temp = front.next;while (temp.next != null){System.out.println(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.print("队列中的元素为:");linkQueue.traverse();}
}

总结

提示:对Hash的理解和认识,掌握解决哈希冲突的两种方法,使用链表实现对列。

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

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

相关文章

说说Omega架构

分析&回答 Omega架构我们暂且称之为混合数仓。 什么是ECS设计模式 在谈我们的解法的时候,必须要先提ECS的设计模式。 简单的说,Entity、Component、System分别代表了三类模型。 实体(Entity):实体是一个普通的对象。通常&#xff0c…

在window上安装hadoop3.3.4

暑假不知道啥原因电脑死机啦。环境需要重新配一下 首先需要配置Hadoop集群,但是为了代码调试方便需要先在Windows上配置Hadoop环境。 1.前期准备 首先在搭建Hadoop环境之前需要先安装JDK,并且配置好Java环境变量。 这里有个bug就是Java环境变量中不允许…

视频动态壁纸 Dynamic Wallpaper for Mac中文

Dynamic Wallpaper是一款Mac平台上的动态壁纸应用程序,它可以根据时间等因素动态切换壁纸,提供更加生动和多样化的桌面体验。 Dynamic Wallpaper包含了多个动态壁纸,用户可以根据自己的喜好选择和切换。这些动态壁纸可以根据时间等因素进行自…

【Android Framework系列】第13章 SVG矢量图形自定义组件(绘制中国地图)

1 前言 本章节我们来了解下什么是SVG矢量图形,怎么通过SVG实现图形的绘制,通过SVG实现不规则的自定义控件,项目实现一个中国地图,实现每个省都能够点击,项目地址在文末请自取。 2 SVG概念 2.1 SVG矢量图形 SVG 指可…

二叉树的构建及遍历

目录 题目题目要求示例 解答方法一、实现思路时间复杂度和空间复杂度代码 方法二、实现思路时间复杂度和空间复杂度代码 题目 二叉树的构建及遍历 题目要求 题目链接 示例 解答 方法一、 先构建二叉树,再中序遍历。 实现思路 按照给出的字符串创建二叉树&am…

分布式定时任务框架选型,讲的太好了

1. 前言 我们先思考下面几个业务场景的解决方案: 支付系统每天凌晨1点跑批,进行一天清算,每月1号进行上个月清算电商整点抢购,商品价格8点整开始优惠12306购票系统,超过30分钟没有成功支付订单的,进行回收处理商品成…

.netcore grpc截止时间和取消详解

一、截止时间概述 截止时间功能让 gRPC 客户端可以指定等待调用完成的时间。 超过截止时间时,将取消调用。 设定一个截止时间非常重要,因为它将提供调用可运行的最长时间。它能阻止异常运行的服务持续运行并耗尽服务器资源。截止时间对于构建可靠应用非…

【Git】(六)子模块跟随主仓库切换分支

场景 主仓库:TestGit 子模块:SubModule 分支v1.0 .gitmodules文件 [submodule "Library/SubModule"]path Library/SubModuleurl gitgitee.com:sunriver2000/SubModule.gitbranch 1.0.0.0 分支v2.0 .gitmodules文件 [submodule "Li…

用Socket实现网络通信

文章目录 背景网络编程网络编程三要素 2.DatagramSocket之UDP通信程序2.1 UDP发送数据2.2UDP接收数据2.3 3. Socket之TCP通信程序3.1TCP发送数据3.2TCP接收数据 背景 网络编程 ● 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线…

IP网络广播系统有哪些优点

IP网络广播系统有哪些优点 IP网络广播系统有哪些优点? IP网络广播系统是基于 TCP/IP 协议的公共广播系统,采用 IP 局域网或 广域网作为数据传输平台,扩展了公共广播系统的应用范围。随着局域网络和 网络的发展 , 使网络广播的普及变为可能 …

《Flink学习笔记》——第十一章 Flink Table API和 Flink SQL

Table API和SQL是最上层的API,在Flink中这两种API被集成在一起,SQL执行的对象也是Flink中的表(Table),所以我们一般会认为它们是一体的。Flink是批流统一的处理框架,无论是批处理(DataSet API&a…

北京已收录2023开学了《乡村振兴战略下传统村落文化旅游设计》中国建筑出版传媒许少辉八一新书

北京已收录2023开学了《乡村振兴战略下传统村落文化旅游设计》中国建筑出版传媒许少辉八一新书

RDMA QP数量和RDMA性能

QP数量上升性能下降 ​​​​​​https://icnp21.cs.ucr.edu/papers/icnp21camera-paper30.pdf 在现代云数据中心中,大规模分布式应用通常构建在许多机器上,需要使用大量并发连接进行频繁的网络通信[4]–[6]。但是,RDMA的性能会随着连接数的…

自动化运维工具-----Ansible入门详解

目录 一.Ansible简介 什么是Ansible? Ansible的特点 Ansible的架构 二.Ansible任务执行解析 ansible任务执行模式 ansible执行流程 ansible命令执行过程 三.Ansible配置解析 ansible的安装方式 ansible的程序结构(yum安装为例) ansibl…

信息安全-应用安全-蚂蚁集团软件供应链安全实践

8月10日,由悬镜安全主办、以“开源的力量”为主题的DSS 2023数字供应链安全大会在北京国家会议中心隆重召开。蚂蚁集团网络安全副总经理程岩出席并发表了《蚂蚁集团软件供应链安全实践》主题演讲。 图1 蚂蚁集团网络安全副总经理程岩发表主题演讲 以下为演讲实录&am…

阿里云 MSE 助力开迈斯实现业务高增长背后带来的服务挑战

开迈斯新能源科技有限公司于 2019 年 5 月 16 日成立,目前合资股东分别为大众汽车(中国)投资有限公司、中国第一汽车股份有限公司、一汽-大众汽车有限公司[增资扩股将在取得适当监督(包括反垄断)审批后完成]、万帮数字…

显示本地 IP 地址和相应的 QR 码,方便用户共享和访问网络信息

这段代码使用了 wxPython、socket、qrcode 和 PIL(Python Imaging Library)模块来生成一个具有本地 IP 地址和相应 QR 码的窗口应用程序。 C:\pythoncode\new\showipgenqrcode.py 让我们逐行解释代码的功能: import wx:导入 wx…

jdbc235

概念:java database connectivity java数据库连接 java语言操作数据库 定义了一套操作所有关系型数据库的规则(接口) 本质:其实是官方公司定义了一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接…

百度“AI智障”到AI智能体验之旅

目录 前言一、百度PLATO1.抬杠第一名2.听Ta瞎扯淡3.TA当场去世了4.智障与网友的高光时刻 二、文心一言1.设计测试用例2.随意发问3.手机端约会神器 三、体验总结:四、千帆大模型 前言 最近收到了文心一言3.5大模型的内测资格,正巧之前也体验过它的前身&q…

医疗小程序:让服务更高效,用户体验更优化

随着移动互联网的快速发展,小程序已经成为了一个热门的开发方向。医疗健康类小程序也不例外,拥有广泛的市场需求和前景。本文将为你提供一份完整的医疗健康类小程序开发攻略,帮助你快速开发上线一个专业成熟的小程序商城。 一、选择合适的小程…