xsl判断节点存在_HashMap1.8之节点删除分析

HashMap之节点删除

大家一直关注的都是HashMap如何添加节点,当节点数量大于8的时候转化为红黑树,否则使用链表等等,但大家是否有看过删除节点的处理逻辑呢? 今天来看看HashMap删除节点的神来之笔

问题来源

在查看HashMap源码时,有个以下字段,在删除的时候,判断节点数量,最多在小于6的时候,会untreeifying(树转化为链表),在点击这个字段时发现,只有在split()方法中使用,但split()方法在resize()方法中使用,与删除节点无关,遂去翻删除节点的代码逻辑

03197949393ca23f3f4dc4fd76bc2b94.png

节点删除

通过remove方法,一路进来,找到删除节点的地方。如下图:

888cd72f3d998e3b9a6c721d4a366801.png

我们进入removeTreeNode方法中,代码如下:

22b82cc9c24e3eb2704a5d84c41094bb.png

查看方法注释,里面介绍到:如果节点太少,就会把当前bin转换成普通bin。不理解注释没关系,我们进入这个方法中唯一有转化的地方。进入untreeify()方法查看下。代码如下:

a0f96d86adefcc67806aa8d49a9213fb.png

噢,第一行看一下,if,else看一下,嗯,这个方法就是获取返回了一个列表(这些方法都是TreeNode类里面的方法,所以请注意,this就是当前要操作的TreeNode节点)。到此明白,这个方法就是把红黑树转化成链表的,那么我的就得分析分析是如何操作的了,而没有使用到定义的全局变量。

删除判断逻辑分析

ad99329164d029024ca4d78b08564469.png

我们来分析分析上面这个逻辑,进入这个untreeify() 的要求是,root == null, root.right ==null, root.left==null, root.left.left==null四种情况,我们以7个节点的红黑树来分析,A为root节点。

0426ef96d467cf69c0cab0487ada6201.png

所以进入这个方法主要有以下几种情况,我们一种一种的来分析当满足要求时,节点的个数。(这里默认认为知道红黑树的5个特点,主要是黑平衡)

当这四种情况都满足时,我们可以看出最多节点有如上图所示个数,可以为7个。(大于8个不考虑,因为大于8会变成红黑树)。

1. 最多节点情况:当我们删除节点D时,只满足root.left.left==null这个条件,这棵树仍可以维持红黑树的特点,这时的最大节点数为6.

2. 最少节点情况:当EFG不存在时,在A,B,C,D中删除任意一个节点,都会满足上述四种规则中的一种。则存在最少节点情况,有3个节点。

以上情况都是会将树转化成链表,此时的节点是 3<= nodes <=6 ,由此可以看出,当节点数在小于6时,是可能转化成链表,但不是绝对情况, 所以使用定义的变量(固定数量6)也不正确。只好通过判断去动态获取节点数。

节点数量原因分析

为什么在小于6的时候可能转换成链表,而在大于8的时候转化成红黑树?

主要通过时间查询节点分析,红黑树的平均查询时间为 log(n), 而链表是O(n),平均是O(n)/2。

当节点数为8时,红黑树查询时间3,链表查询时间是4, 可以看出来当红黑树查询效率大于了链表。(两个函数曲线问题,当节点更多是,比红黑树需要的时间更多)

当节点数为6时,为什么转换成链表,我认为主要时因为节点数太少,如果还是用红黑树,为了维持红黑树的特点,则需要翻转,左旋,右旋,等,更消耗性能。

为什么不是7是转化?

主要是为了给一个过渡,防止频繁转化。 也如上图,7个节点可能正好是一个满二叉树。

来自:https://www.cnblogs.com/lifacheng/p/11032482.html

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

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

相关文章

windows安装TortoiseGit详细使用教程

windows安装TortoiseGit详细使用教程【基础篇】_小飞牛的技术博客_51CTO博客windows安装TortoiseGit详细使用教程【基础篇】&#xff0c;环境&#xff1a;win8.164bit安装准备&#xff1a;首先你得安装windows下的git msysgit1.9.5安装版本控制器客户端tortoisegit tortoisegit…

keras中文文档_【DL项目实战02】图像识别分类——Keras框架+卷积神经网络CNN(使用VGGNet)

版权声明&#xff1a;小博主水平有限&#xff0c;希望大家多多指导。目录&#xff1a;【使用传统DNN】BG大龍&#xff1a;【DL项目实战02】图像分类——Keras框架使用传统神经网络DNN​zhuanlan.zhihu.com【使用卷积神经网络CNN】BG大龍&#xff1a;【DL项目实战02】图像识别分…

Java Html转pdf实战

Java Html转pdf实战 - 简书年尾手头没啥事&#xff0c;干起了打杂工作&#xff0c;最近帮忙解决后端项目里一个html批量转pdf速度慢的问题&#xff0c;项目里用到的转换工具是 wkhtmltopdf &#xff0c;这货转单个html还好&#xff0c;批量转速...https://www.jianshu.com/p/d0…

Hadoop生态圈-Ambari控制台功能简介

Hadoop生态圈-Ambari控制台功能简介 作者&#xff1a;尹正杰 版权声明&#xff1a;原创作品&#xff0c;谢绝转载&#xff01;否则将追究法律责任。 在经历一系列安装过程之后&#xff08;部署过HDP后我终于发现为什么大家喜欢用它了&#xff0c;部署比CDH简单是他优势之一&…

剪映专业版PC端清理缓存与日志

清理缓存 这个简单&#xff0c;在全局设置里&#xff0c;点击删除键&#xff0c;就可以 清理日志 软件每次剪辑都会生成日志&#xff0c;日志路径在 C:\Users\zengm\AppData\Local\JianyingPro\User Data\Log C:\Users\zengm\AppData\Local\JianyingPro\User Data\VELog

nodejs源码_nodejs之setTimeout源码解析

setTimeout是在系统启动的时候挂载的全局函数。代码在timer.js。function setupGlobalTimeouts() {const timers NativeModule.require(timers);global.clearImmediate timers.clearImmediate;global.clearInterval timers.clearInterval;global.clearTimeout timers.clear…

百度网盘PC端缓存文件夹

在C:\Users\zengm\AppData\Roaming\baidu\BaiduNetdisk\users\下面 BaiduYunCacheFileV0.db 文件为百度网盘目录数据&#xff0c;结构为&#xff1a; 百度网盘BaiduYunCacheFileV0.db数据库研究_wqq1027的博客-CSDN博客_百度网盘数据库最近研究了一下百度网盘的本地数据库文件…

实现三元组表示的两个稀疏矩阵的加法_K-BERT | 基于知识图谱的语言表示模型

1.研究背景BERT曾被应用在多项NLP任务中&#xff0c;并且取得了很好的结果。它通过在大规模开放语料库上进行预训练以获得通用的语言表示&#xff0c;然后在特定的下游任务中进行微调&#xff0c;吸收特定领域的知识。但这些模型在不同的领域执行知识驱动任务时&#xff0c;效果…

Excel单元格“删除线”的添加与删除

软件&#xff1a;windows&#xff0c;WPS 点击字体设计的小角标&#xff0c;进入更多设置&#xff0c;勾选“删除线”

excel 表格复制到word后,宽超出word如何调整?

网上很多方法是用“选择性粘贴----excel表格对象”&#xff0c;这个适用表格行数少的&#xff0c;不超过一页word的。 步骤 复制到word里后&#xff0c;选中表格&#xff0c;右键---自动调整--选择具体的调整方式。 调整后效果

sql 查询上个月的数据_数据分析-SQL 进阶篇 多表查询

知识点一、表的加法Union&#xff1a;删除表中的重复值union al&#xff1a;包含表中所有内容&#xff0c;包括重复值二、表的联结联结&#xff1a;join联结分为以下五种&#xff1a;交叉联结&#xff08;cross join&#xff09;又称为笛卡尔积&#xff1a;将表中的每一行与另外…

jenkins部署三种构建方式的详细步骤

部署背景&#xff1a;jenkins&#xff1a; CentOS 7.4C IP&#xff1a;172.16.3.74gitlab-11.5.3&#xff1a; CentOS 7.4D IP&#xff1a;172.16.4.74此上部署都是根据我之前的博客配置完成的&#xff1b;jenkins有三种构建方…

从业回忆,一次大胆的冒险,程序员转岗项目经理

有些事不必知道得太早 程序员这个行业,被“中年危机”言论导向后,就和洗脚城女技师差不多,年轻,漂亮,技术好,体力好的技师收入高,一边拿着高薪,赚着外快,一边吐槽是青春饭,经常熬夜,干不长久。 2010年之前,网上宣传程序员是青春饭,程序员中年危机的文章很少。近几…

word转freemarker和修改的步骤

第一步 编写好word&#xff0c;用freemarker语法替换内容 第二步 word另存为 word xml 第三步 修改后缀名为&#xff1a;.ftl 第四步 notepad XML插件美化显示&#xff0c;插件安装教程&#xff1a;Notepad 7.6以上版本安装XML Tools插件_lingquan0809的博客-CSDN博客Note…

逐行粒度的vuex源码分析

vuex源码分析 了解vuex 什么是vuex vuex是一个为vue进行统一状态管理的状态管理器&#xff0c;主要分为state, getters, mutations, actions几个部分&#xff0c;vue组件基于state进行渲染&#xff0c;当state发生变化时触发组件的重新渲染&#xff0c;并利用了vue的响应式原理…

Redis设计与实现之事件

目录 一、事件 1、文件事件 读事件 写事件 2、 时间事件 3、时间事件应用实例:服务器常规操作 4、事件的执行与调度 5、事件是否有重要性级别或优先级&#xff1f;需要立即处理还是可以延迟处理&#xff1f; 6、事件的类型是什么&#xff1f;是针对键的操作&#xff0…

项目验收材料整合流程

目标&#xff1a;多份word整合成一份项目验收材料 第一步&#xff1a;编写好word&#xff1b;准备好一份验收材料的封面与目录word 第二步&#xff1a;用WPS的word转PDF&#xff0c;批量转成PDF&#xff1b; 第三步&#xff1a;用Adobe Acrobat DC 合并转成的多个PDF成为一个…

[译]Kube Router Documentation

体系结构 Kube路由器是围绕观察者和控制器的概念而建立的。 观察者使用Kubernetes监视API来获取与创建&#xff0c;更新和删除Kubernetes对象有关的事件的通知。 每个观察者获取与特定API对象相关的通知。 在从API服务器接收事件时&#xff0c;观察者广播事件。 控制器注册以获…

windows11 22H2资源管理器开启多标签页

效果 步骤 windows11 22H2后续可能会推送该功能&#xff0c;现在是隐藏的&#xff0c;需要借助工具把这个隐藏功能开启 工具&#xff1a;vivetool 下载&#xff1a;Releases thebookisclosed/ViVe GitHub 步骤1&#xff1a;右键开始菜单&#xff0c;选择“终端&#xff08;…