1. 程式人生 > >(資料結構)第八章 高階搜尋樹

(資料結構)第八章 高階搜尋樹

多路查詢樹(muitl-way search tree),其每一個節點的孩子數可以多於兩個,且每一個節點處可以儲存多個元素。主要有4中特殊形式。

一、2-3樹

定義:其中的每一個節點都具有兩個孩子(稱為2節點)或者三個孩子(稱為3節點)。 
並且2-3樹中所有的葉子都在同一層上。

一個2節點包含一個元素和兩個孩子(或者沒有孩子)。

一個3節點包含一小一大兩個元素和三個孩子(或者沒有孩子)。 


1. 2-3樹的插入實現

1)對於空樹,插入一個2節點即可;

2)插入節點到一個2節點的葉子上。由於本身就只有一個元素,所以只需要將其升級為3節點即可。 


3)插入節點到一個3節點的葉子上。因為3節點本身最大容量,因此需要拆分,且將樹中兩元素或者插入元素的三者中選擇其一向上移動一層。 
三種情況:

升級父節點 


升級根節點 


增加樹高度 


2. 2-3樹的刪除實現

1)所刪元素位於一個3節點的葉子節點上,直接刪除,不會影響樹結構。 


2)所刪元素位於一個2節點上,直接刪除,破壞樹結構。 


分為四種情況:

此節點雙親也是2節點,且擁有一個3節點的右孩子; 


此節點的雙親是2節點,它右孩子也是2節點; 


此節點的雙親是3節點; 


當前樹是一個滿二叉樹,降低樹高; 


3)所刪元素位於非葉子的分支節點。此時按樹中序遍歷得到此元素的前驅或後續元素,補位。

分支節點是2節點 


分支節點是3節點 


二、2-3-4樹

2-3-4樹是2-3樹的擴充套件,包括了4節點的使用,一個4節點包含小中大三個元素和四個孩子(或沒有孩子)。

1. 2-3-4樹插入實現

構建一個數組為{7,1,2,5,6,9,8,4,3}的2-3-4樹的過程 


2. 2-3-4樹刪除實現
刪除順序使1,6,3,4,5,2,9 


三、B樹(B-樹)


  B樹(B-樹)是一種平衡的多路查詢樹。2-3樹和2-3-4樹都是B樹的特例。節點最大的孩子陣列稱為B樹的階(order),因此,2-3樹是3階B樹,2-3-4樹是4階B樹。 


比如說要查詢7,首先從外存讀取得到根節點3,5,8三個元素,發現7不在,但是5、8之間,因此就通過A2再讀取外存的6,7節點找到結束。

B樹的插入和刪除和2-3樹、2-3-4樹類似。

B樹的資料結構為內外存的資料互動準備的。當要處理的資料很大時,無法一次全部裝入記憶體。這時對B樹調整,使得B樹的階數與硬碟儲存的頁面大小相匹配。比如說一棵B樹的階為1001(即1個節點包含1000個關鍵字),高度為2(從0開始),它可以儲存超過10億個關鍵字(1001x1001x1000+1001x1000+1000),只要讓根節點持久的保留在記憶體中,那麼在這顆樹上,尋找某一個關鍵字至多需要兩次硬碟的讀取即可。

對於n個關鍵字的m階B樹,最壞情況查詢次數計算 
第一層至少1個節點,第二層至少2個節點,由於除根節點外每個分支節點至少有⌈m/2⌉棵子樹,則第三層至少有2x⌈m/2⌉個節點。。。這樣第k+1層至少有2x(⌈m/2⌉)^(k-1),實際上,k+1層的節點就是葉子節點。若m階B樹有n個關鍵字,那麼當你找到葉子節點,其實也就等於查詢不成功的節點為n+1,因此 
n+1>=2x(⌈m/2⌉)^(k-1),即 
 


在含有n個關鍵字的B樹上查詢時,從根節點到關鍵位元組點的路徑上涉及的節點數不超多

四、B+樹
  

下圖B樹,我們要遍歷它,假設每個節點都屬於硬碟的不同頁面,我們為了中序遍歷所有的元素,頁面2-頁面1-頁面3-頁面1-頁面4-頁面1-頁面5.而且我們每經過節點遍歷時,都會對節點中的元素進行一次遍歷,糟糕!有沒有可能讓遍歷時每個元素只訪問一次呢? 
   


  B+樹是應檔案系統所需而出的一種B樹的變形樹,在B樹中,每一個元素樹中只出現一次,而B+樹中,出現在分支節點中的元素會被當做他們在該分支節點位置的中序後繼者(葉子節點)中再次列出。另外,每一個葉子節點都會儲存一個指向後一葉子節點的指標。 
  下圖就是B+樹,灰色關鍵字,在根節點出現,在葉子節點中再次列出。 
   
  

 

 B+樹適合隨機查詢,只不過查到後是索引,不能提供實際記錄的訪問,還需要到達包含此關鍵字的終端節點。非葉結點僅具有索引作用,跟記錄有關的資訊均存放在葉結點中。B+樹適合帶有範圍的查詢。B+樹插入、刪除類似B樹。
 

五、關於本章的結構梳理及知識點彙總

高階搜尋樹