推出一個新系列,《看圖輕鬆理解數據結構和算法》,主要使用圖片來描述常見的數據結構和算法,輕鬆閱讀並理解掌握。本系列包括各類堆、各類隊列、各類列表、各類樹、各類圖、各類排序等等幾十篇的樣子。mysql
B樹即平衡查找樹,通常理解爲平衡多路查找樹,也稱爲B-樹、B_樹。是一種自平衡樹狀數據結構,能對存儲的數據進行O(log n)的時間複雜度進行查找、插入和刪除。B樹通常較多用在存儲系統上,好比數據庫或文件系統。算法
如下是一個四階B樹,sql
假設如今構建一棵四階B樹,開始插入「A」,直接做爲根節點,數據庫
插入「B」,大於「A」,放右邊,網絡
插入「C」,按順序排到最後,數據結構
繼續插入「D」,直接添加的結果以下圖,此時超過了節點能夠存放容量,對於四階B樹每一個節點最多存放3個值,此時須要執行分裂操做,併發
分裂操做爲,先選取待分裂節點的中值,這裏爲「B」,而後將中值「B」放到父節點中,由於這裏尚未父節點,那麼直接建立一個新的父節點存放「B」,而原來小於「B」的那些值做爲左子樹,原來大於「B」的那些值做爲右子樹。機器學習
繼續插入「E」,"E"大於「B」,往右子節點,數據結構和算法
分別於「C」和「D」比較,大於它們,放到最右邊,學習
插入「F」,「F」大於「B」,往右子樹,
「F」分別與「C」"D""E"比較,大於它們,放到最右邊,此時觸發分裂操做,
選取待分裂節點的中值「D」,而後將中值「D」放到父節點中,父節點中的「B」小於「D」,因而放到「B」右邊,而原來小於「D」的那些值做爲左子樹,原來大於「D」的那些值做爲右子樹。
繼續插入「M」,結果爲,
插入「L’,大於「B」「D」,往右子樹,
「L」大於「E」「F」小於「M」,因而放到第三個位置,此時觸發分裂操做,
選取待分裂節點的中值「F」,而後將中值「F」放到父節點中,父節點中的「B」「D」都小於「F」,因而放到最右邊,而原來小於「F」的那些值做爲左子樹,原來大於「F」的那些值做爲右子樹。
插入「K」,結果爲,
插入「J」,大於「B」「D」「F」,往右子樹,
「J」小於「K」「L」「M」,因而放到第一個位置,此時觸發分裂操做,
選取待分裂節點的中值「K」,而後將中值「K」放到父節點中,父節點中的「B」「D」「F」都小於「K」,因而放到最右邊,而原來小於「K」的那些值做爲左子樹,原來大於「K」的那些值做爲右子樹。此時父節點也觸發分裂操做,
選取待分裂節點的中值「D」,而後將中值「D」放到父節點中,因爲尚未父節點,那麼直接建立一個新的父節點存放「D」,而原來小於「D」的那些值做爲左子樹,原來大於「D」的那些值做爲右子樹。
插入「I」,大於「D」,往右子樹,
右子樹不是葉子節點,繼續往下,這時「I」大於「F」而小於「K」,因此往第二個分支,
「I」小於「J」,因而放到左邊,
相似地,插入「H」,結果以下,
插入「G」,往左子樹,
往中間分支,
觸發分裂操做,
選取待分裂節點的中值「H」,而後將中值「H」放到父節點中,"H"大於父節點中的「F」而小於「K」,因而放到中間,而原來小於「H」的那些值做爲左子樹,原來大於「H」的那些值做爲右子樹。
綜上所述,插入操做的核心是分裂操做。無需分裂的狀況比較簡單,直接插入便可;若是插入後超過節點容量,這個容量可預先自定義,則須要進行分裂操做,須要注意的是分裂可能引發父節點須要繼續分裂。
對B樹進行查找就比較簡單,查找過程有點相似二叉搜索樹,從根節點開始查找,根據比較數值找到對應的分支,繼續往子樹上查找。
好比查找「I」,"I"大於「D」,往右子樹,
「I」分別與節點內值比較,大於「F」「H」而小於「K」,往第三個分支,
逐一比較節點內的值,找到「I」。
-------------推薦閱讀------------
個人開源項目彙總(機器&深度學習、NLP、網絡IO、AIML、mysql協議、chatbot)
跟我交流,向我提問:
歡迎關注: