5. b 樹、b+ 樹和 b* 樹
二叉樹需要載入到記憶體,如果二叉樹的節點較少,沒有什麼問題,但是如果二叉樹的節點很多就會出現如下問題:
在二叉樹中,每個節點有資料項,最多有兩個子節點。如果允許每個節點可以有更多的資料項和更多的子節點, 就是多叉樹。
多叉樹通過重新組織節點,減少樹的高度,能對二叉樹進行優化。
舉例
b
樹通過重新組織節點,降低樹的高度,並且減少io
讀寫次數來提公升效率。
如圖 b 樹通過重新組織節點, 降低了樹的高度。
檔案系統及資料庫系統的設計者利用了磁碟預讀原理,將乙個節點的大小設為等於乙個頁(頁得大小通常為 4k),這樣每個節點只需要一次 i/o 就可以完全載入。
將樹的度 m 設定為 1024,在 600 億個元素中最多隻需要 4 次 i/o 操作就可以讀取到想要的元素, b 樹(b+)廣泛應用於檔案儲存系統以及資料庫系統中。
2-3 樹的所有葉子節點都在同一層.(只要是 b 樹都滿足這個條件) 。
有兩個子節點的節點叫二節點,二節點要麼沒有子節點,要麼有兩個子節點。
有三個子節點的節點叫三節點,三節點要麼沒有子節點,要麼有三個子節點。
2-3 樹是由二節點和三節點構成的樹。
將數列構建成 2-3 樹,並保證資料插入的大小順序。
構建之後的樹的結構如下:
插入規則
b-tree
樹即 b 樹,b 即balanced
,平衡的意思。
在學習mysql
時,經常聽到說某種型別的索引是基於 b 樹或者 b+樹的,如圖:
b 樹的階:節點的最多子節點個數。比如 2-3 樹的階是 3,2-3-4 樹的階是 4。
b- 樹的搜尋,從根結點開始,對結點內的關鍵字(有序)序列進行二分查詢,如果命中則結束,否則進入查詢關鍵字所屬範圍的兒子結點;重複,直到所對應的兒子指標為空,或已經是葉子結點。
關鍵字集合分布在整顆樹中, 即葉子節點和非葉子節點都存放資料。
搜尋有可能在非葉子結點結束。
其搜尋效能等價於在關鍵字全集內做一次二分查詢。
b+樹是 b 樹的變體,也是一種多路搜尋樹。
所有關鍵字都出現在葉子結點的鍊錶中(即資料只能在葉子節點【也叫稠密索引】),且鍊錶中的關鍵字(資料)恰好是有序的。
不可能在非葉子結點命中 。
非葉子結點相當於是葉子結點的索引(稀疏索引),葉子結點相當於是儲存(關鍵字)資料的資料層。
更適合檔案索引系統。
b 樹和 b+樹各有自己的應用場景,不能說 b+樹完全比 b 樹好,反之亦然。
b* 樹是 b+ 樹的變體,在 b+ 樹的非根和非葉子結點再增加指向兄弟的指標。
b*樹分配新結點的概率比 b+樹要低,空間使用率更高。
多路查詢樹
二叉樹的操作效率較高,但是也存在問題,請看下面的二叉樹 二叉樹需要載入到記憶體的,如果二叉樹的節點少,沒有什麼問題,但是如果二叉樹的節點很多 比如1億 就 存在如下問題 問題1 在構建二叉樹時,需要多次進行i o操作 海量資料存在資料庫或檔案中 節點海量,構建二叉樹時,速度有影響 問題2 節點海量,...
多路查詢樹
二叉樹的操作效率較高,但也存在問題 二叉樹需要載入到記憶體,如果二叉樹的節點少,沒有什麼問題,但是如果二叉樹的節點很多 比如1億 就存在如下問題 問題1 在構建二叉樹時,需要多次進行io操作 海量資料存在資料庫或檔案中 節點海量,構建二叉樹時,速度有影響 問題2 節點海量,也會造成二叉樹的高度很大,...
多路查詢樹
二叉樹的操作效率較高,但是也存在問題 二叉樹需要載入到記憶體的,如果二叉樹的節點少,沒有什麼問題,但是如果二叉樹的節點很多 比如1億 就存在如下問題 問題1 在構建二叉樹時,需要多次進行i o操作 海量資料存在資料庫或檔案中 節點海量,構建二叉樹時,速度有影響 問題2 節點海量,也會造成二叉樹的高度...