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

news2024/11/27 1:38:23

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.coloradmin.cn/o/847703.html

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

相关文章

Asynq: 基于Redis实现的Go生态分布式任务队列和异步处理库

Asynq[1]是一个Go实现的分布式任务队列和异步处理库,基于redis,类似Ruby的sidekiq[2]和Python的celery[3]。Go生态类似的还有machinery[4]和goworker 同时提供一个WebUI asynqmon[5],可以源码形式安装或使用Docker image, 还可以和Prometheus…

【数据结构与算法——TypeScript】哈希表

【数据结构与算法——TypeScript】 哈希表(HashTable) 哈希表介绍和特性 哈希表是一种非常重要的数据结构,但是很多学习编程的人一直搞不懂哈希表到底是如何实现的。 在这一章节中,我门就一点点来实现一个自己的哈希表。通过实现来理解哈希表背后的原理…

oracle容灾备份怎么样Oracle容灾备份

随着科学技术的发展和业务的增长,数据安全问题越来越突出。为了保证数据的完整性、易用性和保密性,公司需要采取一系列措施来防止内容丢失的风险。  Oracle是一个关系数据库管理系统(RDBMS),OracleCorporation是由美国软件公司开发和维护的。该系统功能…

构建Docker容器监控系统(cadvisor+influxDB+grafana)

目录 一、部署 1、安装docker-cd 2、阿里云镜像加速 3、下载组件镜像 4、创建自定义网络 5、创建influxdb容器 6、创建Cadvisor 容器 7、创建granafa容器 一、部署 1、安装docker-cd [rootlocalhost ~]# iptables -F [rootlocalhost ~]# setenforce 0 setenforce: SELi…

22款奔驰GLC260加装原厂香氛负离子系统,清香宜人,久闻不腻

奔驰原厂香氛合理性可通过车内空气调节组件营造芳香四溢的怡人氛围。通过更换手套箱内香氛喷雾发生器所用的香水瓶,可轻松选择其他香氛。香氛的浓度和持续时间可调。淡雅的香氛缓缓喷出,并且在关闭后能够立刻散去。车内气味不会永久改变,香氛…

IELAB-网络工程师的路由答疑10问(2)

各位小伙伴们,接下来的问题可能有些难度,你们做好准备了吗? 7. 动态路由协议做了啥? 这次咱们先解决第一个比较棘手的问题--路由协议,相信初学的同学对于路由协议的学习总是或多或少有些问题,呐&#xff…

UVA1025 城市里的间谍 A Spy in the Metro

实际上这题就是问Mario最少的总等车时间 这题我的做法是 把一个火车从左到右(或从右到左) 的过程 转化成 途中任何车站到左边(或右边)相邻车站 的过程 相当于把他切成了一段一段 (一段就是两个相邻车站中间的部分) 这样更容易操作 具体请看代码 一些注释在代码里请往下看 #inc…

.netcore下grpc概述

一、什么是grpc 是一种与语言无关的高性能远程过程调用 (RPC) 框架。基于http/2标准设计,提供了头部压缩、tcp连接上的多路复用、流量控制、流式处理(客户端流/服务端流/双向流)。提供统一使用的.proto文件,它定义 grpc 服务和消…

屏幕录制app分享,总有适合你的一款

在现今的互联网时代,屏幕录制已经成为了一项必备的技能。然而,要想将自己的屏幕录制下来并分享给别人,就需要一款好用的屏幕录制app。市面上有许多不同的屏幕录制app,每个人的需求也各不相同。本篇文章就将为大家推荐几款适合不同…

技术应用:Docker安全性的最佳实验|聊聊工程化Docker

🔥 技术相关:《技术应用》 ⛺️ I Love you, like a fire! 文章目录 首先,使用Docker Hub控制访问其次,保护密钥写在最后 不可否认,能生存在互联网上的软件都是相互关联的,当我们开发一款应用程序时&#x…

好用的Windows 10磁盘管理工具

​前几天,我给我用的戴尔笔记本电脑装上了全新的SSD,并准备将所有除Windows操作系统以外的数据,特别是游戏,全部转移到SSD上(主要是因为这样能加快游戏的加载速度)。但在我尝试用Windows 10自带的磁盘管理操…

树莓派4B, Purple Pi, Orange Pi 3B对比

1 参数 树莓派4BPurple Pi OHOrange Pi 3BSOCBroadcom BCM2711RockChip 3566RockChip 3566CPUARM Cortex-A72 四核1.5GHz主频ARM Cortex-A55 四核 2.0GHz主频ARM Cortex-A55 四核 2.0GHz主频GPU支持OpenGL ES 3.0 graphicsMali-G52 1-Core-2EE 支持 OpenGL ES 1.1/2.0/3.2&…

Python操作MySQL将数据库表中的数据导出到excel

Author: liukai 2810248865qq.com Date: 2022-08-18 04:28:52 LastEditors: liukai 2810248865qq.com LastEditTime: 2023-06-29 09:35:25 FilePath: \PythonProject01\Python操作MySQL数据库及excel将数据库表中的数据导出到excel中.py Description: 这是默认设置,请设置custo…

独立站如何进行Facebook广告投放?关于广告投放策略的真相

谷歌广告是独立站卖家推广引流的首选渠道,那么谷歌广告该如何投放?在这个过程中有哪些需要特别注意的吗? 创建Facebook广告账户: 访问Facebook广告管理平台(Ads Manager)并创建一个广告账户。您需要提供一…

Android 数据库之GreenDAO

GreenDAO 是一款开源的面向 Android 的轻便、快捷的 ORM 框架,将 Java 对象映射到 SQLite 数据库中,我们操作数据库的时候,不再需要编写复杂的 SQL语句, 在性能方面,greenDAO 针对 Android 进行了高度优化,…

dy六神参数记录分析(立秋篇)

version: 23.9 X-SSSTUB: 搜索:x-tt-dt var hashMap Java.use("java.util.HashMap");hashMap.put.implementation function (a, b) {console.log("hashMap.put: ", a, b);return this.put(a, b);}https://codeooo.blog.csdn.n…

分享一下Steam搬砖常规操作

大家好,我是阿阳,接下来我们会陆续更新一些Steam搬砖项目的操作课程,大家可以自行学习,希望对正在操作的朋友,有一定的帮助。 steam平台,对于大多数游戏玩家应该再清楚不过了,玩过pubg&#xf…

资深测试老鸟整理,性能测试-常见调优详细,卷起来...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 常见的一些性能缺…

【数据结构】单链表OJ题

🔥博客主页:小王又困了 📚系列专栏:数据结构 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、移除链表元素 💡方法一: 💡方法二…

活动发布会邀请媒体6步走

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 邀请媒体参加活动发布会对信息的传播,企业品牌建设有诸多的好处,今天就与大家分享下邀请媒体参加活动报道的6个步骤: 1. 策划与准备: -明…