多路查找樹開篇

1、引言

        以前我們所討論的數據結構,處理數據都是在內存中。假如我們所要操作的數據集非常大,大到內存無法處理了怎麼辦?如數據庫上千萬記錄的數據表、硬盤中上萬個文件等。在這種情況下,對數據的處理需要不斷的從硬盤等存儲設備中調入或者調出內存頁面。而過多的進行IO讀寫,顯然會降低系統的效率。爲了降低對外存的訪問次數,我們就需要新的數據結構來處理這樣的問題。

2、2-3樹

        每個節點都具有2個孩子(稱之爲2節點)或者3個孩子(稱之爲3節點)

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

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

3、2-3-4樹

        每個節點都具有2個孩子(稱之爲2節點)或者3個孩子(稱之爲3節點)或者4個孩子(稱之爲4節點)

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

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

        一個4節點包含三個元素和四個孩子(或沒有孩子)。

4、B樹

        B樹是一種多路查找樹,2-3樹和2-3-4樹都是B樹的特例。節點最大的孩子數目稱爲B樹的階,因此2-3樹是3階B樹,2-3-4樹是4階B樹 。

        一個m階的B樹具有如下性質:

        1)如果根節點不是葉子節點,則其子樹個數範圍爲[2,m];

        2)分支節點子樹範個數圍爲[m/2,m];

        3)所有葉子節點在同一層次;

        4)所有分支節點包含下列信息:關鍵字個數n,關鍵字k1,...,kn,指向子樹根結點的指針A0,...,An。

        如果內存與外存交換數據次數頻繁,會造成時間上的瓶頸,那麼B樹結構是怎麼做到減少次數呢?

        我們的外存,比如硬盤,是將所有信息分割成相等大小的頁面,每次硬盤讀寫的都是一個或多個完整的頁面。在一個典型的B樹應用中,要處理的硬盤數據量很大,因此無法一次全部裝入內存。因此我們會對B樹進行調整,使得B樹的階數(或節點的元素)與硬盤存儲的面頁面大小相匹配。比如說一顆B樹的階爲1001(即一個節點包含1000個關鍵字),高度爲2,他可以存儲超過10億個關鍵字,我們只要讓根節點持久的保留在內存中,那麼在這棵樹上,尋找某一個關鍵字至多需要兩次硬盤的讀取。通過這種方式,在有限內存的情況下,每一次磁盤的訪問我們都可以獲得最大量的數據。由於B樹每個節點可以具有比二叉樹多得多的元素,所以與二叉樹相比,它們減少了必須訪問節點和數據塊的數量,從而提高了性能。可以說B樹的數據結構就是爲內外存的數據交互準備的。

5、B+樹

        對於樹結構來說,我們都可以通過中序遍歷來順序查找樹中的元素,這一切都是在內存中進行。可是B樹結構中,我們往返於每個節點之間也就意味着,我們必須在硬盤的頁面之間進行多次訪問。

        爲了能夠解決所有元素遍歷等基本問題,我們在原有B樹結構基礎上,加上了新的元素組織方式,這就是B+樹。

        B+樹不同與B-樹的地方:

        1)有n棵子樹的節點中包含n個關鍵字

        2)所有的葉子節點包含全部關鍵信息,及指向含這些關鍵字記錄的指針

        3)所有分支結點可以看成是索引,節點中僅含有其子樹中的最大(或最小)關鍵字

        這樣的數據結構最大的好處就是,如果是要隨機查找,我們就從根節點出發,與B樹的查找方式相同,只不過即使在分支節點找到了待查找的關鍵字,它也直是用來索引的,不能提供實際記錄的訪問,還是需要到達包含此關鍵字的終端節點。

        如果我們是要從最小關鍵字從小到大進行順序查找,我們就可以從最左側的葉子節點出發,不經過分支節點,而是沿着指向下一個葉子節點的指針遍歷所有的關鍵字。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章