轉載地址:https://my.oschina.net/u/3370829/blog/1301732
一、平衡二叉樹
(1)由來:平衡二叉樹是基於二分法的策略提升數據的查找速度的二叉樹的數據結構;算法
(2)特色:數據庫
平衡二叉樹是採用二分法思惟把數據按規則組裝成一個樹形結構的數據,用這個樹形結構的數據減小無關數據的檢索,大大的提高了數據檢索的速度;平衡二叉樹的數據結構組裝過程有如下規則:數據結構
非葉子節點只能容許最多兩個子節點存在,每個非葉子節點數據分佈規則爲左邊的子節點小當前節點的值,右邊的子節點大於當前節點的值(這裏值是基於本身的算法規則而定的,好比hash值);ide
平衡樹的層級結構:由於平衡二叉樹查詢性能和樹的層級(h高度)成正比、爲了保證樹的結構左右兩端數據大體平衡下降二叉樹的查詢難度通常會採用一種算法機制實現節點數據結構的平衡,實現了這種算法的有好比AVL、Treap、紅黑樹,使用平衡二叉樹能保證數據的左右兩邊的節點層級相差不會大於1.,經過這樣避免樹形結構因爲刪除增長變成線性鏈表影響查詢效率,保證數據平衡的狀況下查找數據的速度近於二分法查找;函數
總結平衡二叉樹特色:性能
(1)非葉子節點最多擁有兩個子節點;.net
(2)非葉子節值大於左邊子節點、小於右邊子節點;3d
(3)樹的左右兩邊的層級數相差不會大於1;指針
(4)沒有值相等重複的節點;blog
二、B樹(B-tree)
注意:以前有看到有不少文章把B樹和B-tree理解成了兩種不一樣類別的樹,其實這兩個是同一種樹;
一、概念:B樹和平衡二叉樹稍有不一樣的是B樹屬於多叉樹又名平衡多路查找樹(查找路徑不僅兩個),數據庫索引技術裏大量使用者B樹和B+樹的數據結構,讓咱們來看看他有什麼特色;
二、規則:
(1)樹種的每一個節點最多擁有m個子節點且m>=2,空樹除外(注:m階表明一個樹節點最多有多少個查找路徑,m階=m路,當m=2則是2叉樹,m=3則是3叉);
(2)除根節點外每一個節點的關鍵字數量大於等於ceil(m/2)-1個小於等於m-1個;(注:ceil()是個朝正無窮方向取整的函數 如ceil(1.1)結果爲2)
(3)全部葉子節點均在同一層、葉子節點除了包含了關鍵字和關鍵字記錄的指針外也有指向其子節點的指針只不過其指針地址都爲null對應下圖最後一層節點的空格子
(4)若是一個非葉節點有N個子節點,則該節點的關鍵字數等於N-1;
(5)全部節點關鍵字是按遞增次序排列,並遵循左小右大原則;
最後咱們用一個圖和一個實際的例子來理解B樹(這裏爲了理解方便我就直接用實際字母的大小來排列C>B>A)
三、B樹的查詢流程: 如上圖我要從上圖中找到E字母,查找流程以下
(1)獲取根節點的關鍵字進行比較,當前根節點關鍵字爲M,E要小於M(26個字母順序),因此往找到指向左邊的子節點(二分法規則,左小右大,左邊放小於當前節點值的子節點、右邊放大於當前節點值的子節點);
(2)拿到關鍵字D和G,D<E<G 因此直接找到D和G中間的節點;
(3)拿到E和F,由於E=E 因此直接返回關鍵字和指針信息(若是樹結構裏面沒有包含所要查找的節點則返回null);
四、B樹的插入節點流程
定義一個5階樹(平衡5路查找樹;),如今咱們要把三、八、3一、十一、2三、2九、50、28 這些數字構建出一個5階樹出來;
遵循規則:
(1)當前是要組成一個5路查找樹,那麼此時m=5,關鍵字數必須大於等於cei(5/2)-1小於等於5-1(關鍵字數小於cei(5/2)-1 就要進行節點合併,大於5-1就要進行節點拆分);
(2)知足左大右小的排序規則;
五、B樹節點的刪除
規則:
(1)當前是要組成一個5路查找樹,那麼此時m=5,關鍵字數必須大於等於cei(5/2)-1小於等於5-1;
(2)知足左大右小的排序規則;
(3)關鍵字數小於二時先從子節點取,子節點沒有符合條件時就向向父節點取,取中間值往父節點放;
三、特色:
B樹相對於平衡二叉樹的不一樣是,每一個節點包含的關鍵字增多了,特別是在B樹應用到數據庫中的時候,數據庫充分利用了磁盤塊的原理(磁盤數據存儲是採用塊的形式存儲的,每一個塊的大小通常爲4K,每次IO進行數據讀取時,同一個磁盤塊的數據能夠一次性讀取出來)把節點大小限制和充分使用在磁盤快大小範圍;把樹的節點關鍵字增多後樹的層級比原來的二叉樹少了,減小數據查找的次數和複雜度;
三、B+樹
B+樹是B樹的一個升級版,相對於B樹來講B+樹更充分的利用了節點的空間,讓查詢速度更加穩定,其速度徹底接近於二分法查找。爲何說B+樹查找的效率要比B樹更高、更穩定;咱們先看看二者的區別
(1)B+跟B樹不一樣B+樹的非葉子節點不保存關鍵字記錄的指針,這樣使得B+樹每一個節點所能保存的關鍵字大大增長;
(2)B+樹葉子節點保存了父節點的全部關鍵字和關鍵字記錄的指針,每一個葉子節點的關鍵字從小到大連接;
(3)B+樹的根節點關鍵字數量和其子節點個數相等;
(4)B+的非葉子節點只進行數據索引,不會存實際的關鍵字記錄的指針,全部數據地址必需要到葉子節點才能獲取到,因此每次數據查詢的次數都同樣;
特色:
在B樹的基礎上每一個節點存儲的關鍵字數更多,樹的層級更少因此查詢數據更快,全部指關鍵字指針都存在葉子節點,因此每次查找的次數都相同因此查詢速度更穩定;
四、B樹
B樹是B+樹的變種,相對於B+樹他們的不一樣之處以下:
(1)首先是關鍵字個數限制問題,B+樹初始化的關鍵字初始化個數是cei(m/2),b樹的初始化個數爲(cei(2/3m))
(2)B+樹節點滿時就會分裂,而B*樹節點滿時會檢查兄弟節點是否滿(由於每一個節點都有指向兄弟的指針),若是兄弟節點未滿則向兄弟節點轉移關鍵字,若是兄弟節點已滿,則從當前節點和兄弟節點各拿出1/3的數據建立一個新的節點出來;
特色:
在B+樹的基礎上因其初始化的容量變大,使得節點空間使用率更高,而又存有兄弟節點的指針,能夠向兄弟節點轉移關鍵字的特性使得B*樹額分解次數變得更少;
總結:從平衡二叉樹、B樹、B+樹、B*樹整體來看它們的貫徹的思想是相同的,都是採用二分法和數據平衡策略來提高查找數據的速度;
不一樣點是他們一個一個在演變的過程當中經過IO從磁盤讀取數據的原理進行一步步的演變,每一次演變都是爲了讓節點的空間更合理的運用起來,從而使樹的層級減小達到快速查找數據的目的;
推薦資料:
附一(二分法查找):https://zhuanlan.zhihu.com/p/27597160
附二(B、B+、B*樹):http://blog.csdn.net/v_JULY_v/article/details/6530142/
附三(B、B+、B*樹):http://blog.csdn.net/endlu/article/details/51720299