Map集合、散列表和紅黑樹學(xué)習(xí)筆記

一、Map


1.1 Map和Collection

  • map是將鍵映射到值得對象,一個映射不能包含重復(fù)的鍵,每個鍵最多只能映射到一個值
  • map儲存的元素是成對出現(xiàn)的,鍵唯一,值可以重復(fù)
  • Collection儲存的元素是單獨(dú)出現(xiàn)的,Set不可以重復(fù),List可以重復(fù)

1.2 常用的一些功能

image.png

二、散列表的介紹


  • 鏈表和數(shù)組都可以按照人們的意愿來排列元素的次序,他們可以說是有序的(存儲的順序和取出的順序是一致的),但想要獲取某個元素就要遍歷整個線性表,浪費(fèi)大量時間
  • 散列表:不在意元素的順序,能夠快速的查找元素的數(shù)據(jù)

2.1 什么是散列表

在Java中,散列表由數(shù)組和鏈表組成。它的工作原理是為每個對象計算出一個散列碼,將整個散列碼與桶的數(shù)量作求余操作(或者h(yuǎn)ash&(n-1)),這個計算出的整數(shù)就是對象在散列表中的位置。

哈希表還有一個重要的屬性: 負(fù)載因子(load factor),它用來衡量哈希表的 空/滿 程度,一定程度上也可以體現(xiàn)查詢的效率,計算公式為:

負(fù)載因子 = 總鍵值對數(shù) / 箱子個數(shù)

負(fù)載因子越大,意味著哈希表越滿,越容易導(dǎo)致沖突,性能也就越低。因此,一般來說,當(dāng)負(fù)載因子大于某個常數(shù)(可能是 1,或者 0.75 等)時,哈希表將自動擴(kuò)容。

哈希表在自動擴(kuò)容時,一般會創(chuàng)建兩倍于原來個數(shù)的箱子,因此即使 key 的哈希值不變,對箱子個數(shù)取余的結(jié)果也會發(fā)生改變,因此所有鍵值對的存放位置都有可能發(fā)生改變,這個過程也稱為重哈希(rehash)。

哈希表的擴(kuò)容并不總是能夠有效解決負(fù)載因子過大的問題。假設(shè)所有 key 的哈希值都一樣,那么即使擴(kuò)容以后他們的位置也不會變化。雖然負(fù)載因子會降低,但實(shí)際存儲在每個箱子中的鏈表長度并不發(fā)生改變,因此也就不能提高哈希表的查詢性能。

2.2 散列沖突

有時候兩個不同的對象計算出相同的hashCode,就儲存在同一個桶上,這就是散列沖突。此時需要用該對象和桶上的對象進(jìn)行比較。如果存在,不添加,不存在,添加。(JDK1.8中,桶的容量變成8時,會從鏈表變成紅黑樹)

如果散列表太滿了,就需要對散列表再散列。創(chuàng)建一個新的桶,將原來的數(shù)據(jù)插入到新的桶中

裝填因子(load factor)決定了什么時候擴(kuò)容。負(fù)載因子越大,意味著哈希表越滿,越容易導(dǎo)致沖突,鏈表變長,查詢效率降低,性能也就越低。因此,一般來說,當(dāng)負(fù)載因子大于某個常數(shù)(可能是 1,或者 0.75 等)時,哈希表將自動進(jìn)行2倍擴(kuò)容。負(fù)載因子越小,沖突發(fā)生的可能性小,但是導(dǎo)致散列表的稀疏程度越大,造成了空間的浪費(fèi)。


三、什么是紅黑樹

利用二叉查找樹的特性,可以快速查找到某個元素。但是如果數(shù)據(jù)是按升序或降序排列的,這是樹就變成了鏈表。


image.png

紅黑樹是一種平衡樹,它可以保證二叉樹的均衡結(jié)構(gòu)
只有遵循這些約束的才叫紅黑樹(背這個貌似沒啥用):

  1. 紅黑樹是二叉搜索樹。
  2. 根節(jié)點(diǎn)是黑色。
  3. 每個葉子節(jié)點(diǎn)都是黑色的空節(jié)點(diǎn)(NIL節(jié)點(diǎn))。
  4. 每個紅色節(jié)點(diǎn)的兩個子節(jié)點(diǎn)都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續(xù)的紅色節(jié)點(diǎn))
  5. 從任一節(jié)點(diǎn)到其每個葉子的所有路徑都包含相同數(shù)目的黑色節(jié)點(diǎn)(每一條樹鏈上的黑色節(jié)點(diǎn)數(shù)量(稱之為“黑高”)必須相等)。

3.1 由2-3樹到紅黑樹

如果從代碼角度去理解紅黑樹的旋轉(zhuǎn)和變色,那么會有助于增加我們對紅黑樹的恐懼

2-3樹的構(gòu)建

構(gòu)建過程:

  • 合并2-節(jié)點(diǎn)使其變成3-節(jié)點(diǎn),繼續(xù)擴(kuò)充3-節(jié)點(diǎn),將其變成4-節(jié)點(diǎn)
  • 從下到上,分解4-節(jié)點(diǎn)為3-節(jié)點(diǎn)...直至不能再分
  • (根據(jù)此過程可以快速將畫出2-3樹,然后修改成紅黑樹)

由2-3樹腦補(bǔ)的紅黑樹的顏色表示:每個節(jié)點(diǎn)只有一條鏈接指向自己(從父節(jié)點(diǎn)到自己),將鏈接的顏色保存在表示節(jié)點(diǎn)的Node數(shù)據(jù)類型的boolean變量color中,若為true,說明這個節(jié)點(diǎn)是紅色的

紅黑樹參考資料:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容