到容量超過八的時候就自動轉(zhuǎn)換為紅黑樹
在jdk8及以上版本時,hashmap在處理hash沖突時,會在map總的Node數(shù)量大于64,并且某一個hash槽中鏈表的長度大于等于8時,會將鏈表轉(zhuǎn)換成紅黑樹存儲,以降低鏈表查找的時間復(fù)雜度
紅黑樹是每個節(jié)點(diǎn)都帶有顏色屬性的二叉查找樹,顏色或紅色或黑色。在二叉查找樹強(qiáng)制一般要求以外,對于任何有效的紅黑樹我們增加了如下的額外要求:
性質(zhì)1. 節(jié)點(diǎn)是紅色或黑色。
性質(zhì)2. 根是黑色。
性質(zhì)3 每個葉節(jié)點(diǎn)是黑色的。
性質(zhì)4 每個紅色節(jié)點(diǎn)的兩個子節(jié)點(diǎn)都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續(xù)的紅色節(jié)點(diǎn))
性質(zhì)5. 從任一節(jié)點(diǎn)到其每個葉子的所有路徑都包含相同數(shù)目的黑色節(jié)點(diǎn)。
紅黑樹是一種自平衡二叉查找樹,是在計(jì)算機(jī)科學(xué)中用到的一種數(shù)據(jù)結(jié)構(gòu),典型的用途是實(shí)現(xiàn)關(guān)聯(lián)數(shù)組。能在進(jìn)行插入和刪除操作時通過特定操作保持二叉查找樹的平衡,從而獲得較高的查找性能。
而紅鏈表是一種常見的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),是一種線性表,但是并不會按線性的鏈表是一種物理存儲單元上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。
紅黑樹原理和算法詳細(xì)介紹
紅黑樹定義:
(1) 每個節(jié)點(diǎn)或者是黑色,或者是紅色。
(2) 根節(jié)點(diǎn)是黑色。
(3) 每個葉子節(jié)點(diǎn)是黑色。 [注意:這里葉子節(jié)點(diǎn),是指為空的葉子節(jié)點(diǎn)!]
(4) 如果一個節(jié)點(diǎn)是紅色的,則它的子節(jié)點(diǎn)必須是黑色的。
(5) 從一個節(jié)點(diǎn)到該節(jié)點(diǎn)的子孫節(jié)點(diǎn)的所有路徑上包含相同數(shù)目的黑節(jié)點(diǎn)。
證明
首先定義一個節(jié)點(diǎn)x的黑高為b h ( x ) bh(x)bh(x),表示從x到任意一個葉子節(jié)點(diǎn)路徑上黑色節(jié)點(diǎn)的個數(shù)(不包括x)。
1.第一步,先證明以某一節(jié)點(diǎn)x為根的子樹中至少包含2 b h ( x ) ? 1 2^{bh(x)}?12
bh(x)?1個內(nèi)節(jié)點(diǎn)(不是葉子的都是內(nèi)節(jié)點(diǎn))。用數(shù)學(xué)歸納法證明。
如果x的高度為0,那么x是葉節(jié)點(diǎn),包含0個內(nèi)節(jié)點(diǎn),滿足該式子。
對于高度為正值的x,其兩個孩子至少包含2 b h ( x ) ? 1 ? 1 2^{bh(x)?1}?12 bh(x)?1?1個內(nèi)節(jié)點(diǎn),
所以以x為根的子樹至少包含( 2 b h ( x ) ? 1 ? 1 ) + ( 2 b h ( x ) ? 1 ? 1 ) + 1 = 2 b h ( x ) ? 1 (2^{bh(x)?1}?1)+(2^{bh(x)?1}?1)+1=2^{bh(x)}?1(2bh(x)?1?1)+(2
bh(x)?1?1)+1=2bh(x)?1個內(nèi)節(jié)點(diǎn)。
2.第二步,對于一棵高度為h的樹,任意一條從根到葉節(jié)點(diǎn)(不包括根)的路徑上至少有一半黑色節(jié)點(diǎn),從而b h ( x ) ≥ h / 2 bh(x)≥h/2bh(x)≥h/2,所以n ≥ 2 b h ( x ) ? 1 ≥ 2 h / 2 ? 1 n≥2^{bh(x)}?1≥2^{h/2}?1n≥2bh(x)?1≥2h/2?1,即h ≤ 2 l o g ( n + 1 ) h≤2log(n+1)h≤2log(n+1)
紅黑樹是一種自平衡的二叉搜索樹,它在計(jì)算機(jī)科學(xué)中被廣泛應(yīng)用于實(shí)現(xiàn)有序集合,例如Java集合框架中的TreeMap和TreeSet。紅黑樹能夠在插入和刪除操作后通過自旋和重新著色來保持平衡。這使得紅黑樹比普通的二叉搜索樹更加高效和穩(wěn)定。
紅黑樹通過對節(jié)點(diǎn)的插入、刪除和旋轉(zhuǎn)等操作來保持樹的平衡。當(dāng)插入一個新節(jié)點(diǎn)時,根據(jù)紅黑樹的特點(diǎn)進(jìn)行相應(yīng)的著色和旋轉(zhuǎn)操作,以確保樹的平衡性。同樣,刪除一個節(jié)點(diǎn)時也需要進(jìn)行相應(yīng)的調(diào)整,保持樹的平衡。
在Java中,可以通過創(chuàng)建一個名為RedBlackTree
的類來實(shí)現(xiàn)紅黑樹。該類將封裝節(jié)點(diǎn)的插入、刪除和旋轉(zhuǎn)等操作,并提供與紅黑樹相關(guān)的功能和方法,如查找最小值、查找最大值、判斷元素是否存在等。
紅黑樹廣泛應(yīng)用于各種領(lǐng)域,如計(jì)算機(jī)網(wǎng)絡(luò)、數(shù)據(jù)庫、操作系統(tǒng)等。在Java集合框架中,TreeMap和TreeSet都是基于紅黑樹實(shí)現(xiàn)的。它們能夠高效地支持元素的插入、刪除和查找操作,并保持元素的有序性。
紅黑樹是一種高效且穩(wěn)定的自平衡二叉搜索樹,用于實(shí)現(xiàn)有序集合。通過在節(jié)點(diǎn)插入、刪除和旋轉(zhuǎn)時進(jìn)行著色和調(diào)整等操作,紅黑樹能夠保持平衡,保證它的高效性。在Java中,紅黑樹被廣泛應(yīng)用于TreeMap和TreeSet等集合框架中。
感謝您閱讀本文,希望對您理解和應(yīng)用Java的紅黑樹有所幫助!
蘋婆(學(xué)名:Sterculia nobilis Smith ),梧桐科常綠喬木,又稱“鳳眼果”,葉長橢圓形;初夏開花,無花冠,花萼粉紅色,圓錐花序;果實(shí)分為四五個分果,外面暗紅色,內(nèi)面漆黑色。
種子可供食用,種子煨熟的味道如栗子。原產(chǎn)于中國、印度、越南、印度尼西亞等地,在中國廣東以南常植栽為庭院樹,木材輕韌,可制器具。廣東習(xí)俗中蘋婆果實(shí)是七姐誕的祭品,若沒有便會用假蘋婆果實(shí)代替。由于蘋婆年產(chǎn)量少,加上祭祀習(xí)俗熄微,故很少大量種植的果園,只有零星種植。
為什么treeset使用紅黑樹而一些數(shù)據(jù)庫索引使用b樹和b+樹在C++ STL中,很多部分(目前包括set, multiset, map, multimap)應(yīng)用了紅黑樹的變體(SGI STL中的紅黑樹有一些變化,這些修改提供了更好的性能,以及對set操作的支持)。
紅黑樹是每個節(jié)點(diǎn)都帶有顏色屬性的二叉查找樹,顏色或紅色或黑色。
在我國有一種古老的植物,它的特色與輕木完全不同。這種樹人稱“黑心樹”,只因它的樹心是黑色而得名,實(shí)際上它最突出的特點(diǎn)并不是樹心黑色,而是它的堅(jiān)硬度,可謂是刀斧難入,以至于它有個學(xué)名為“鐵刀木”,意思鐵刀難入。另外因?yàn)楣麑?shí)類似豆莢,被稱為是泰國山扁豆。鐵刀木是我國栽培歷史相當(dāng)悠久的喬木,主要資源分布在我國的云南地區(qū)。
《黑色畫家》是無妄合作社作詞作曲并演唱的一首歌曲,所屬專輯《逃脫時間的鎖》。