1.1.1 二叉樹的問題分析
二叉樹的操作效率較高,但是也存在問題, 請看下面的二叉樹
二叉樹需要載入到記憶體的,如果二叉樹的節點少,沒有什麼問題,但是如果二叉樹的節點很多(比如 1 億), 就存在如下問題:
問題 1:在構建二叉樹時,需要多次進行 i/o 操作(海量資料存在資料庫或檔案中),節點海量,構建二叉樹時, 速度有影響
問題 2:節點海量,也會造成二叉樹的高度很大,會降低操作速度.
1.1.2 多叉樹
在二叉樹中,每個節點有資料項,最多有兩個子節點。如果允許每個節點可以有更多的資料項和更多的子節點, 就是多叉樹(multiway tree)
後面我們講解的 2-3 樹,2-3-4 樹就是多叉樹,多叉樹通過重新組織節點,減少樹的高度,能對二叉樹進行優化。
舉例說明(下面 2-3 樹就是一顆多叉樹)
1.1.3 b 樹的基本介紹
b 樹通過重新組織節點,降低樹的高度,並且減少 i/o 讀寫次數來提公升效率。
如圖 b 樹通過重新組織節點, 降低了樹的高度.
檔案系統及資料庫系統的設計者利用了磁碟預讀原理,將乙個節點的大小設為等於乙個頁(頁得大小通常為 4k), 這樣每個節點只需要一次 i/o 就可以完全載入
將樹的度m 設定為 1024,在 600 億個元素中最多隻需要 4 次 i/o 操作就可以讀取到想要的元素, b 樹(b+)廣泛應用於檔案儲存系統以及資料庫系統中
2-3 樹是最簡單的 b 樹結構, 具有如下特點:
2-3 樹的所有葉子節點都在同一層.(只要是 b 樹都滿足這個條件)
有兩個子節點的節點叫二節點,二節點要麼沒有子節點,要麼有兩個子節點.
有三個子節點的節點叫三節點,三節點要麼沒有子節點,要麼有三個子節點.
2-3 樹是由二節點和三節點構成的樹。
2-3 樹應用案例
需求:將數列 構建成 2-3 樹,並保證資料插入的大小順序。2-3 樹的所有葉子節點都在同一層.(只要是 b 樹都滿足這個條件)插入規則:
有兩個子節點的節點叫二節點,二節點要麼沒有子節點,要麼有兩個子節點.
有三個子節點的節點叫三節點,三節點要麼沒有子節點,要麼有三個子節點
當按照規則插入乙個數到某個節點時,不能滿足上面三個要求,就需要拆,先向上拆,如果上層滿,則拆本層, 拆後仍然需要滿足上面 3 個條件。
對於三節點的子樹的值大小仍然遵守(bst 二叉排序樹)的規則
以上 2 -3 樹構建流程在此不再贅述。
其它說明
除了 23 樹,還有 234 樹等,概念和 23 樹類似,也是一種 b 樹。 如圖:
12.3.1 b 樹的介紹
b-tree 樹即 b 樹,b 即 balanced,平衡的意思。有人把 b-tree 翻譯成 b-樹,容易讓人產生誤解。會以為 b-樹是一種樹,而 b 樹又是另一種樹。實際上,b-tree 就是指的 b 樹。
前面已經介紹了 2-3 樹和 2-3-4 樹,他們就是 b 樹(英語:b-tree 也寫成 b-樹),這裡我們再做乙個說明,我們在學習 mysql 時,經常聽到說某種型別的索引是基於 b 樹或者 b+樹的,如圖:
對上圖的說明:
b 樹的階:節點的最多子節點個數。比如 2-3 樹的階是 3,2-3-4 樹的階是 4。
b-樹的搜尋,從根結點開始,對結點內的關鍵字(有序)序列進行二分查詢,如果命中則結束,否則進入查詢關鍵字所屬範圍的兒子結點;重複,直到所對應的兒子指標為空,或已經是葉子結點。
關鍵字集合分布在整顆樹中, 即葉子節點和非葉子節點都存放資料。
搜尋有可能在非葉子結點結束。
其搜尋效能等價於在關鍵字全集內做一次二分查詢。
1.3.3 b+樹的介紹
b+樹是 b 樹的變體,也是一種多路搜尋樹。
對b+的說明:
b+樹的搜尋與 b 樹也基本相同,區別是 b+樹只有達到葉子結點才命中(b 樹可以在非葉子結點命中),其效能也等價於在關鍵字全集做一次二分查詢
所有關鍵字都出現在葉子結點的鍊錶中(即資料只能在葉子節點【也叫稠密索引】),且鍊錶中的關鍵字(資料) 恰好是有序的。
不可能在非葉子結點命中
非葉子結點相當於是葉子結點的索引(稀疏索引),葉子結點相當於是儲存(關鍵字)資料的資料層
更適合檔案索引系統
b 樹和 b+樹各有自己的應用場景,不能說 b+樹完全比 b 樹好,反之亦然.
1.3.4 b*樹的介紹
b*樹是 b+樹的變體,在 b+樹的非根和非葉子結點再增加指向兄弟的指標。
b*樹定義了非葉子結點關鍵字個數至少為(2/3)*m,即塊的最低使用率為 2/3,而 b+樹的塊的最低使用率為的1/2。
從第 1 個特點我們可以看出,b*樹分配新結點的概率比 b+樹要低,空間使用率更高。
B 樹 B 樹 B 樹 B 樹都是什麼
b樹 即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點關鍵字小,就進...
B 樹 B 樹 B 樹 B 樹都是什麼
b樹 即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點關鍵字小,就進...
B 樹 B 樹 B 樹 B 樹都是什麼
b樹 即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點關鍵字小,就進...