4 Map基礎知識儲備

2022-09-11 15:33:38 字數 2696 閱讀 4780

之前list中的陣列和鍊錶,查詢某個元素都存在乙個問題,需要遍歷所有元素,直到找到元素為止,效率比較低。

而雜湊表則是不在意儲存順序,只希望快速找到元素。

每個物件計算雜湊碼,根據雜湊碼儲存在對應的位置上。出現雜湊衝突的時候就往鍊錶上新增,元素衝突的多的話轉為紅黑樹。如果雜湊表太滿,需要再雜湊,建立乙個更大的雜湊表,把元素放進新的雜湊表,原雜湊表丟棄。

裝填因子決定何時再雜湊,預設為0.75。

參考自安卓大叔的部落格30張圖帶你徹底理解紅黑樹

紅黑樹操作包含兩種:旋轉,反色

需要遵守的約束:

每個節點要不是黑色,要不是紅色

根節點是黑色的

每個葉子節點是黑色的

每個紅色節點的兩個子節點一定都是黑色的

任意一節點到每個子節點的路徑都包含數量相同的黑節點。

5.1 如果乙個節點存在黑子節點,那麼該節點肯定有兩個子節點。

節點的定義

紅黑樹自平衡操作

但要保持紅黑樹的性質,結點不能亂挪,還得靠變色了。怎麼變?具體情景又不同變法,後面會具體講到,現在只需要記住紅黑樹總是通過旋轉和變色達到自平衡。

因為紅黑樹是一顆二叉平衡樹,並且查詢不會破壞樹的平衡,所以查詢跟二叉平衡樹的查詢無異:

從根結點開始查詢,把根結點設定為當前結點

若當前結點為空,返回null

若當前結點不為空,用當前結點的key跟查詢key作比較

若當前結點key等於查詢key,那麼該key就是查詢目標,返回當前結點

若當前結點key大於查詢key,把當前結點的左子結點設定為當前結點,重複步驟2

若當前結點key小於查詢key,把當前結點的右子結點設定為當前結點,重複步驟2

包括兩個過程:查詢插入的位置,插入之後自平衡。

從根節點開始查詢

如果根節點為空,那麼插入節點作為根節點,結束

如果根節點不為空,把根節點作為當前節點

如果當前節點為null,返回當前節點的父節點,結束

如果當前節點key值等於查詢key,那麼當前節點即插入節點,更新該節點的值,結束

如果當前節點key值大於查詢key,那麼當前節點的左子節點設定為當前節點,重複步驟4

如果當前節點key值小於查詢key,那麼當前節點的右子節點設定為當前節點,重複步驟4

插入節點是紅色,因為如果父節點不為空切為黑色時,紅黑樹的黑色平衡沒有被破壞,不需要自平衡,如果插入節點為黑色,則平衡破壞,必須自平衡

定義名稱

插入情景

紅黑樹為空樹,直接把插入節點作為根節點就行,因為性質1,根節點是黑色,把插入節點變為黑色。

把插入節點設定為當前節點的顏色,並把當前節點的值進行更新。

插入節點為紅色,不影響平衡,無需自平衡

因為父節點為紅色,不可能是根節點,所以必然有祖父節點。情況較多,分類討論:

祖父節點肯定為黑節點,要是紅色,肯定兩個子節點都是黑色。所以目前看到的從上往下是黑(祖父)紅(父)紅(插入節點),因為紅色節點的兩個子節點必須都是黑色,所以要改為紅黑紅。

即插入節點為紅色,父節點變為黑色,祖父節點變為紅色,把祖父節點設定為插入節點。如果祖父節點的父節點為黑色,無需做任何處理,如果是紅色,則違背性質,需要把祖父節點當作插入節點,繼續做自平衡。

如果祖節點正好是根節點,那麼把組節點根據紅黑紅轉為紅色節點後,要再重新轉為黑色節點,變成黑黑紅,黑色層數+1

叔叔結點非紅即為葉子結點(nil)

父節點設定為黑色,祖父節點設定為紅色,祖父節點右旋

對父節點進行左旋,父節點設定為插入節點,跟4.2.1一樣了

叔叔結點非紅即為葉子結點(nil)

父節點設定為黑色,祖父節點設定為紅色,祖父節點左旋

對父節點進行右旋,父節點設定為插入節點,跟4.3.1一樣了

有點複雜

過程一樣,先找到刪除的位置,然後自平衡

刪除了結點後我們還需要找結點來替代刪除結點的位置,不然子樹跟父輩結點斷開了,除非刪除結點剛好沒子結點,那麼就不需要替代。

二叉樹刪除結點找替代結點有3种情情景:

刪除情景2.1.2.1:替換結點的兄弟結點的右子結點是紅結點,左子結點任意顏色

即將刪除的左子樹的乙個黑色結點,顯然左子樹的黑色結點少1了,然而右子樹又又紅色結點,那麼我們直接向右子樹「借」個紅結點來補充黑結點就好啦,此時肯定需要用旋轉處理了。

處理:刪除情景2.1.2.2:替換結點的兄弟結點的右子結點為黑結點,左子結點為紅結點

兄弟結點所在的子樹有紅結點,我們總是可以向兄**樹借個紅結點過來,顯然該情景可以轉換為情景2.1.2.1

處理:刪除情景2.2.1:替換結點的兄弟結點是紅結點

處理:這節主要講了下hash和紅黑樹原理,對後面詳細講map有幫助。

基礎知識儲備 搜尋 ES

應用 github 使用 elasticsearch 對1300億行 進行查詢 愛奇藝使用es作為資料庫儲存 介紹 集群中的節點通過埠 9300 彼此通訊。如果這個埠沒有開啟,節點將無法形成乙個集群 所有其他語言可以使用 restful api 通過埠 9200 和 elasticsearch 進行...

map的基礎知識

hashmap 1 hashmap是乙個雜湊表 hashtable 用來存放鍵值對 key value 順序是無序的 2 hashmap不是線性安全,並且是非同步的。3 hashmap的key和value值可以為空,但是key是只能乙個為空,value值可以多個為空。4 hashmap的遍歷 1 m...

STL之map基礎知識

下面舉例說明什麼是一對一的資料對映。比如乙個班級中,每個學生的學號跟他的姓名就存在著一一對映的關係,這個模型用map可能輕易描述,很明顯學號用int描述,姓名用字串描述 本篇文章中不用char 來描述字串,而是採用stl中string來描述 下面給出map描述 mapmap共提供了6個建構函式,這塊...