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