做者:小傅哥
博客:https://bugstack.cnhtml
沉澱、分享、成長,讓本身和他人都能有所收穫!😄
講道理5年開發,沒用過數據結構,你只是在作CRUD!
程序員
不少時候大部分程序員👨💻頭疼於,查詢慢、效率低、一堆的關聯SQL,主要緣由是在程序設計上沒有作出很好的數據結構。固然也還有一部分是因爲老業務代碼,或者沒有用到一些大數據服務等。面試
數據結構、算法、設計模式,是每個程序員成長過程當中的內功心法修煉,而你的新技能用的再絢、多線程使的再六、加鎖玩的再牛🐂,也只能說明你這我的身體好,但身體好是不能抗住子彈的。只有身體+心法都好,都能縱橫捭闔。算法
這一章節是結合HashMap
的延展,在Jdk1.8中HashMap是使用桶數組+鏈表和紅黑樹
實現,因此順着上一章節的核心原理和API功能講解後,原本這一章節想直接進入到紅黑樹,但若是想把紅黑樹學明白,就須要瞭解他的前因後果,也就是它的前身2-3樹
🌲。數據庫
謝飛機,考你幾個簡單的知識點🦀設計模式
🤥飛機,回去等消息吧!數組
平常的學習和一部分夥伴的面試中,居然會聽👂到的是;從HashMap中文紅黑樹、從數據庫索引爲B+Tree,但問2-3樹的狀況就不是不少了。數據結構
從最根本的緣由來看,使用樹結構就是爲了提高總體的效率;插入、刪除、查找(索引),尤爲是索引操做。由於相比於鏈表,一個平衡樹的索引時間複雜度是O(logn),而數組的索引時間複雜度是O(n)。多線程
從如下的圖上能夠對比,二者的索引耗時狀況;函數
在樹的數據結構中,最早有點是二叉查找樹,也就是英文縮寫BST樹。在使用數據插入的過程當中,理想狀況下它是一個平衡的二叉樹,但實際上可能會出現二叉樹都一邊倒,讓二叉樹像列表同樣的數據結構。從而樹形結構的時間複雜度也從O(logn)
升級到O(n)
,以下圖;
綜上呢,若是咱們但願在插入數據後又保持樹的特色,O(logn)的索引性能,那麼就須要在插入時進行節點的調整
2-3樹是什麼結構,它怎麼解決平衡問題的。帶着問題咱們繼續🤔。
2-3樹是一種很是巧妙的結構,在保持樹結構的基礎上,它容許在一個節點中能夠有兩個元素,等元素數量等於3個時候再進行調整。經過這種方式呢,來保證整個二叉搜索樹的平衡性。
這樣說可能尚未感受,來看下圖;
2-3樹已經能夠解決平衡問題那麼,數據是怎麼存放和調整的呢,接下來咱們開始分析。
2-3樹,讀法;二三樹,特性以下;
序號 | 描述 | 示意圖 |
---|---|---|
1 | 2-,1個數據節點2個樹杈 | ![]() |
2 | 3-,2個數據節點3個樹杈 | ![]() |
3 | 三叉與兩叉的不一樣點在於,除了兩邊的節點,中間件還有一個節點。這個節點是介於二、4之間的值。 | ![]() |
4 | 當隨着插入數據,會出現臨時的一個節點中,有三個元素。這時會被調整成一個二叉樹。 | ![]() |
綜上咱們能夠總結出,2-3樹的一些性質;
接下來咱們就模擬在二叉搜索樹中退化成鏈表的數據,插入到2-3樹的變化過程,數據包括;一、二、三、四、五、六、7
,插入過程圖以下;
以上,就是整個數據在插入過程當中,2-3樹的演化過程,接下來咱們具體講解每一步的變化;
三、四、5
共用1個節點,當一個節點上有三個數據時候,則須要進行調整。5 6
共用。此時是一個臨時存放,須要調整。初步調整後,抽出6節點,向上存放,變爲2 4 6
共用一個節點,這是一個臨時狀態,還須要繼續調整。二、四、6
,則繼續須要把中間節點上移,一、3
和五、7
則分別成二叉落到節點2
、節點6
上。🇬🇷希臘字母:α(阿爾法)、 β(貝塔)、γ(伽馬)、δ(德爾塔)、ε(伊普西隆)、ζ(截塔)、η(艾塔)、θ(西塔)、ι(約塔)
有了上面數據插入的學習,在看數據刪除其實就是一個逆向的過程,在刪除的主要包括這樣兩種狀況;
承接上面👆的例子,咱們把數據再從七、六、五、四、三、二、1
順序刪除,觀察2-3樹的結構變化,以下;
五、6
合併,但此時破壞了2-3樹的平衡性,須要縮短樹高進行調整。二、4
合併,節點一、3
分別插入左側和中間。再看一個稍微複雜點2-3樹刪除:
上面👆這張圖,就一個稍微複雜點的2-3平衡樹,樹的刪除過程主要包括;
三、5
合併,指向節點2,保持樹平衡。八、9
合併。15
上移,恢復成3-叉樹。🤔若是有時候很差理解刪除,能夠試想下,這個要刪除的節點,在插入的時候是一個什麼效果。
相比於插入和刪除,索引的過程仍是比較簡單的,不須要調整數據結果。基本原則就是;
🔍第一層尋找:
🔍第二層尋找:
🔍第三次尋找: