平衡二叉樹,B樹,B+樹的概念及區別

1.平衡二叉樹
 
由來:平衡二叉樹是基於二分法的策略提升數據的查找速度的二叉樹的數據結構
特色:
1.二叉樹:意思是每一個節點最多隻能有兩個子節點
2.平衡:由於平衡二叉樹的查詢性能與樹的高度成正比,因此爲了下降樹的高度,會去儘可能的設計從而保證兩端數據的大體平衡,這種設計通常是會採用一種算法機制,常見的有AVL,treap,紅黑樹等等。這樣設計下的數的查詢速度接近於二分查找法。
最多見的算法規則是左邊的子節點小於父節點,父節點小於右子節點
 
總結平衡二叉樹特色:
(1)非葉子節點最多擁有兩個子節點;
(2)非葉子節值大於左邊子節點、小於右邊子節點;
(3)樹的左右兩邊的層級數相差不會大於1;
(4)沒有值相等重複的節點;
  二叉樹的優勢:
  二叉排序樹是一種比較有用的折衷方案。  
  數組的搜索比較方便,能夠直接用下標,但刪除或者插入某些元素就比較麻煩。  
  鏈表與之相反,刪除和插入元素很快,但查找很慢。  
  二叉排序樹就既有鏈表的好處,也有數組的好處。  
  在處理大批量的動態的數據是比較有用。
文件系統和數據庫系統通常都採用樹(特別是B樹)的數據結構數據,主要爲排序和檢索的效率。二叉樹是一種最基本最典型的排序樹,用於教學和研究樹的特性,自己不多在實際中進行應用,由於缺點太明顯了(看看教科書怎麼說的)。就像冒泡排序同樣,雖然由於效率問題並不實用,單不失一種教學例子的好手段。
平衡二叉樹都有哪些應用場景
二叉樹支持動態的插入和查找,保證操做在O(height)時間,這就是完成了哈希表不便完成的工做,動態性。可是二叉樹有可能出現worst-case,若是輸入序列已經排序,則時間複雜度爲O(N)
 
平衡二叉樹/紅黑樹就是爲了將查找的時間複雜度保證在O(logN)範圍內。
因此若是輸入結合肯定,所須要的就是查詢,則能夠考慮使用哈希表,若是輸入集合不肯定,則考慮使用平衡二叉樹/紅黑樹,保證達到最大效率
平衡二叉樹主要優勢集中在快速查找。
SGI/STL的set/map底層都是用紅黑樹(平衡二叉樹的一種)實現
 
 
 
2.B樹/B+樹
 
概念:B樹和平衡二叉樹稍有不一樣的是B樹屬於多叉樹又名平衡多路查找樹,查找路徑不僅有兩條。數據庫裏最常使用的就是B樹和B+樹
 
特色:
        樹的每一個節點能夠擁有m個節點。m=2則爲二叉樹,m=3則爲三叉樹,總結爲m叉樹
        除根節點外每一個節點的關鍵字數量大於等於ceil(m/2)-1個小於等於m-1個;(注:ceil()是個朝正無窮方向取整的函數 如ceil(1.1)結果爲2)
        全部節點關鍵字是按遞增次序排列,並遵循左小右大原則
最後咱們用一個圖和一個實際的例子來理解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/3*m))
(2)B+樹節點滿時就會分裂,而B*樹節點滿時會檢查兄弟節點是否滿(由於每一個節點都有指向兄弟的指針),若是兄弟節點未滿則向兄弟節點轉移關鍵字,若是兄弟節點已滿,則從當前節點和兄弟節點各拿出1/3的數據建立一個新的節點出來;
特色:
在B+樹的基礎上因其初始化的容量變大,使得節點空間使用率更高,而又存有兄弟節點的指針,能夠向兄弟節點轉移關鍵字的特性使得B*樹額分解次數變得更少;
 
 
總結:從平衡二叉樹、B樹、B+樹、B*樹整體來看它們的貫徹的思想是相同的,都是採用二分法和數據平衡策略來提高查找數據的速度;
不一樣點是他們一個一個在演變的過程當中經過IO從磁盤讀取數據的原理進行一步步的演變,每一次演變都是爲了讓節點的空間更合理的運用起來,從而使樹的層級減小達到快速查找數據的目的;
相關文章
相關標籤/搜索