算法通关村第五关——HashMap和队列问题分析

1.HashMap

1.1Hash的概念和基本特征

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

假设数组array存放的是1到15这些数,现在要存在一个大小是7的Hash表中,存储的位置计算公式是:

index = number % 7

在这里插入图片描述

对于如何取值,比如要取13,我们同样利用计算存储位置的计算公式13 % 7 = 6,我们访问array[6]13是在的,返回true。如果想看20在不在哈希表里,操作同上20 % 7 = 6,访问array[6],没有20,返回false

通过上面的例子可以发现有一些数据被存放到同一个位置了。有些Hash的位置中可能会存放多个元素,这种两个不同的输入值,根据同一散列函数计算出的散列值相同的现象叫做碰撞。

1.2碰撞的处理方法

1.2.1开放定址法

开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到并将记录存入。

在这里插入图片描述

如上,存7,8,9的时候找到null的位置存储,这样并不会引起存储混乱,如果再存储3,5的话,会继续向后找,找到null的位置然后进行存储。ThreadLocal有一个专门存储元素的TheadLocalMap,每次在get set元素的时候,会先将目标位置前后的空间搜索一下,将标记为null的位置回收掉,这样大部分不用的位置就收回来了。

1.2.2链地址法

将哈希表的每个单元作为链表的头结点,所有哈希地址为i的元素构成一个同义词链表。即发生冲突时就把该关键字链在以该单元为头结点的链表的尾部。

在这里插入图片描述

1.3HashMap的扩容机制

HashMap的默认容量为16,默认的负载因子为0.75,当HashMap中元素个数超过容量乘以负载因子的个数时,就创建一个大小为前一次两倍的新数组,再将原来数组中的数据复制到新数组中。当数组长度到达64且链表长度大于8时,链表转为红黑树。

那么问题来了,为什么数组长度达到64且链表长度大于8时,转为红黑树?

每次遍历一个链表,平均查找的时间复杂度是 O(n)n 是链表的长度。红黑树有和链表不一样的查找性能,由于红黑树有自平衡的特点,可以防止不平衡情况的发生,所以可以始终将查找的时间复杂度控制在 O(log(n))
最初链表还不是很长,所以可能O(n) O(log(n))的区别不大,但是如果链表越来越长,那么这种区别便会有所体现。所以为了提升查找性能,需要把链表转化为红黑树的形式。

那么又有问题了,既然红黑树这么好用,为什么不直接使用红黑树呢?

源码里是这样解释的:

Because TreeNodes are about twice the size of regular nodes,
use them only when bins contain enough nodes to warrant use
(see TREEIFY_THRESHOLD). And when they become too small (due 
removal or resizing) they are converted back to plain bins.

我们可以这样理解,在最开始使用链表的时候,空间占用较少,由于链表比较短,查询时间也较短,随着链表越来越长,需要用红黑树的形式来保证查询的效率。系统里将链表转换成红黑树的阈值设置为8,是因为在理想情况下,链表长度符合泊松分布,各个长度的命中概率依次递减,当长度为8的时候,概率仅为0.00000006。这是一个小于千万分之一的概率,在时间情况中我们的Map里面是不会存储这么多的数据的,所以通常情况下,并不会发生从链表向红黑树的转换。当链表长度降到6的时候就自动转换回链表。

2.队列

2.1队列的概念和基本特征

队列(Queue):具有一定操作约束的线性表。其只能在**一端插入(入队列,AddQ),而在另一端删除(出队列,DeleteQ)。特征是先进先出(FIFO)**。

  • 队列的顺序存储实现:队列的顺序存储结构通常由一个一维数组和一个记录队列头元素位置的变量**front以及一个记录队列尾元素位置的变量rear**组成

  • 顺环队列使用额外标记Sizetag来判断是否已满,求余函数

  • 队列的链式存储实现:队列的链式存储结构也可以用一个**单链表**实现。插入和删除操作分别在链表的两头进行。rear指向队尾节点,front指向队头结点。

这里看一下基于链表的队列实现。只需要在rear后插入元素,在front删除元素即可。

class ListQueue{constructor() {		this.size = 0;this.front = new ListNode(0);this.rear = new ListNode(0);}
}class ListNode {constructor(data, next) {		this.data = (data === undefined ? 0 : data);this.next = (next === undefined ? null : next);}
}/*** 入队* @param {number} val* */ListQueue.prototype.push(val) {const newNode = new ListNode(val);let temp = this.front;while (temp.next) {temp = temp.next;}temp.next = newNode;this.rear = newNode;this.size++;
}/*** 出队* @return {number}* */
ListQueue.prototype.pull() {if (this.front.next === null) {console.log("队列已空")}let firstNode = this.front.next;this.front.next = firstNode.next;this.size--;return firstNode.data;
}/*** 遍历队列* @return {void}**/
ListQueue.prototype.traverse(){let temp = this.front.next;while (temp) {console.log(temp.data + "\t");temp = temp.next;}
}

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

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

相关文章

Android 刷新与显示

目录 屏幕显示原理: 显示刷新的过程 VSYNC机制具体实现 小结: 屏幕显示原理: 过程描述: 应用向系统服务申请buffer 系统服务返回一个buffer给应用 应用开始绘制,绘制完成就提交buffer,系统服务把buffer数据…

7_分类算法—逻辑回归

文章目录 逻辑回归:1 Logistic回归(二分类问题)1.1 sigmoid函数1.2 Logistic回归及似然函数(求解)1.3 θ参数求解1.4 Logistic回归损失函数1.5 LogisticRegression总结 2 Softmax回归(多分类问题&#xff0…

Oracle安装与配置

一 把windows2003拖到vm里去 1.1 加一块虚拟网卡 1.2 把网卡信息改一下 配完之后点一下应用 这个地方改成一个不是1但是在255之内的数,就可以 二 后面调试很久,失败了 后面还有一些步骤,但是总的来说,这次安装失败了&#xf…

适合自己企业的erp系统怎么选?这8条关键因素缺一不可!

一文看懂:如何选择适合自己企业的ERP系统?选型过程中有哪些关键因素需要考虑? 无论你是多大规模的企业,看懂这一篇,你都能受用无穷。 哪怕你需求复杂,现成ERP系统无法满足,最后我也给出了一条…

政府大数据资源中心建设总体方案[56页PPT]

导读:原文《政府大数据资源中心建设总体方案[56页PPT]》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 完整版领取方式 完整版领取方式: 如需…

Zebec Protocol ,不止于 Web3 世界的 “Paypal”

Paypal是传统支付领域的巨头企业,在北美支付市场占有率约为77%以上。从具体的业务数据看,在8月初,Paypal公布的2023年第二季度财报显示,PayPal第二季度净营收为73亿美元,净利润为10.29亿美元。虽然Paypal的净利润相交去…

javaWeb项目--二级评论完整思路

先来看前端需要什么吧: 通过博客id,首先需要显示所有一级评论,包括评论者的头像,昵称,评论时间,评论内容 然后要显示每个一级评论下面的二级评论,包括,评论者的头像,昵称…

6.s081/6.1810(Fall 2022)Lab5: Copy-on-Write Fork for xv6

前言 本来往年这里还有个Lazy Allocation的,今年不知道为啥直接给跳过去了。. 其他篇章 环境搭建 Lab1: Utilities Lab2: System calls Lab3: Page tables Lab4: Traps Lab5: Copy-on-Write Fork for xv6 参考链接 官网链接 xv6手册链接,这个挺重要…

Windows下安装Scala(以Scala 2.11.12为例)

Windows下安装Scala(以Scala 2.11.12为例) 一、Scala2.11.12官网下载二、Scala2.11.12网盘下载三、Scala各版本下载地址四、Scala安装4.1、点击 scala-2.11.12.msi 文件安装4.2、设置环境变量 %SCALA_HOME%4.3、环境变量Path添加条目%SCALA_HOME%\bin 四…

1466. 重新规划路线

题目描述&#xff1a; 主要思路&#xff1a; 将所有有向边抽象为无向边&#xff0c;将原有的方向权重置为1&#xff0c;其余置为0。 从0开始遍历所有城市&#xff0c;ans权重和。 class Solution { public:vector<vector<int>> a,w;int ans0;bool book[500010];v…

使用yarn启动项目报错

使用yarn启动项目报错 解决方法&#xff1a; 1.点击“开始”菜单搜索找到 Windows PowerShell ISE并以管理员身份运行(注&#xff1a;不是以管理员的身份直接运行cmd) 2. 输入 set-ExecutionPolicy RemoteSigned 回车 3.输入&#xff08;选择全是&#xff09; 4.再输入get-Exe…

生成小程序二维码、小程序码

微信自定义生成二维码 使用微信云开发生成自定义二维码、小程序码话不多说&#xff0c;我们先来看最终的展示效果生成码有三种方式操作步骤1. 云环境的初始化2. 在页面上开辟一个容器来展示二维码&#xff08;包括预览和保存到相册的按钮&#xff09;3. 创建云函数4. 生成二维码…

RabbitMQ的6种工作模式

RabbitMQ的6种工作模式 官方文档&#xff1a; http://www.rabbitmq.com/ https://www.rabbitmq.com/getstarted.html RabbitMQ 常见的 6 种工作模式&#xff1a; 1、simple简单模式 1)、消息产生后将消息放入队列。 2)、消息的消费者监听消息队列&#xff0c;如果队列中…

在Raspberry Pi 4上安装Ubuntu 20.04 + ROS noetic(不带显示器)

在Raspberry Pi 4上安装Ubuntu 20.04 ROS noetic&#xff08;不带显示器&#xff09; 1. 所需设备 所需设备&#xff1a; 树莓派 4 B 型 wifi microSD 卡&#xff1a;最小 32GB MicroSD 转 SD 适配器 &#xff08;可选&#xff09;显示器&#xff0c;鼠标等 2. 树莓派…

机器学习---概述(二)

文章目录 1.模型评估1.1 分类模型评估1.2 回归模型评估 2. 拟合2.1 欠拟合2.2 过拟合2.3 适当拟合总结&#xff1a; 3.深度学习3.1层次&#xff08;Layers&#xff09;&#xff1a;3.2 神经元&#xff08;Neurons&#xff09;&#xff1a;3.3 总结 1.模型评估 模型评估是机器学…

【Linux操作系统】Vim:提升你的编辑效率

Vim是一款功能强大的文本编辑器&#xff0c;它具有高度可定制性和灵活性&#xff0c;可以帮助程序员和文本编辑者提高编辑效率。本文将介绍Vim的基本使用方法、常用功能和一些实用技巧。 文章目录 1. Vim的基本使用方法&#xff1a;2. 常用功能&#xff1a;2.1 文件操作&#…

Qt应用开发(基础篇)——时间类 QDateTime、QDate、QTime

一、前言 时间类QDateTime、QDate、QTime、QTimeZone保存了Qt的时间、日期、时区信息&#xff0c;常用的时间类部件都会用到这些数据结构&#xff0c;常用概念有年、月、日、时、分、秒、毫秒和时区&#xff0c;时间和时区就关系到时间戳和UTC的概念。 UTC时间&#xff0c;又称…

Baumer工业相机堡盟工业相机如何通过BGAPI SDK获取相机当前数据吞吐量(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK里函数来获取相机当前数据吞吐量&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的数据吞吐量的技术背景CameraExplorer如何查看相机吞吐量信息在BGAPI SDK里通过函数获取相机接口吞吐量 Baumer工业相机通过BGAPI SDK获取…

x光下危险物品/违禁物品目标识别的模型训练与推理代码

前言 1.安检在公共场合的重要性不言而喻&#xff0c;保障群众人身安全是其首要任务。在各种场合&#xff0c;安检都是不可或缺的环节。x光安检机作为安检的重要工具&#xff0c;尽管其具有人工监控判断成像的特性&#xff0c;但是其局限性也十分明显。 为了解决这一局限性为出…

React 核心开发者 Dan Abramov 宣布从 Meta 离职

导读React.js 核心开发者、Redux 作者 Dan Abramov 在社交平台发文宣布&#xff0c;将辞去在 Meta 的职务&#xff1a; “我感到苦乐参半&#xff0c;几周后我就要辞去 Meta 的工作了。在 Meta 的 React 组织工作是我的荣幸。感谢我过去和现在的同事接纳我&#xff0c;容忍我犯…