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.pswp.cn/news/537339.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537339.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537339.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用Emit技術替代反射

System.Reflection.Emit命名空間類可用于動態發出Microsoft中間語言&#xff08;MSIL&#xff09;代碼&#xff0c;以便生成的代碼可以直接執行。反射也用于獲取有關類及其成員的信息。換句話說&#xff0c;反射是一種技術&#xff0c;允許您檢查描述類型及其成員的元數據&…

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簡單是他優勢之一&…

oracle監聽啟動很慢

TNS-12531: TNS:cannot allocate memory 首先查看內存&#xff0c;free -m 發現當前的空閑內存還有很多&#xff0c;那就不是內存不足的問題 想到之前重啟過數據庫服務器&#xff0c;查看主機名hostname,然后在查看etc/hosts 中的主機名&#xff0c;發現兩者不一致&#xff0c;…

python地圖標注_Python 給定的經緯度標注在地圖上的實現方法

博主最近發現了python中一個好玩的包叫basemap,使用這個包可以繪制地圖。值得說一下的是&#xff0c;basemap還沒有pip檢索&#xff0c;因此不能直接使用pip install basemap&#xff0c;來安裝這個包。所以需要自己把下面兩個包自行下載&#xff0c;然后在該目錄下使用pip安裝…

剪映專業版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博客_百度網盤數據庫最近研究了一下百度網盤的本地數據庫文件…

python 圖片轉文字錯誤_python3把base64字符串寫成圖片文件出錯

下面的代碼在python2下正常的&#xff0c;是一個微信圖標&#xff0c;文件md5是a1be719025844a1918ec6a338eaa8456我對python3不熟悉&#xff0c;不知道要怎么改#!/usr/bin/python3import base64def filePutContents(file, content):fp open(file, a)fp.write(content)fp.clos…

從業回憶錄,最后悔的事

被一篇文章誤導 我清楚地記得,在我畢業第一年,我看到了一篇關于程序員怎么學技術的文章,觀點是程序員要多學技術,文章引用了典故:“高筑墻,廣積糧,緩稱王”。當時讀這篇文章,感覺很有道理,認同了文章里的觀點。 這么些年,學了不少技術:C#、Asp.net、Java Web套餐、A…

kodexplorer開源網盤php程序配置解析

config/setting_user.php 追加內容&#xff08;一下都是&#xff0c;注意不要使用中文引號、雙引號及分號&#xff09; //【指定多語言只保留中文】 $GLOBALS[config][settings][language] zh-CN; //【自定義群組創建時自動新建的目錄】 $GLOBALS[config][settingSystemDefaul…

實現三元組表示的兩個稀疏矩陣的加法_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年之前,網上宣傳程序員是青春飯,程序員中年危機的文章很少。近幾…