【数据结构】B树的理解
B樹滿足的條件
B樹是一種多路搜索樹(并不是二叉的):
1.定義任意非葉子結點最多只有M個兒子;且M>2;
2.根結點的兒子數為[2, M];
3.除根結點以外的非葉子結點的兒子數為[M/2, M];
4.每個結點存放至少M/2-1(取上整)和至多M-1個關鍵字;(至少2個關鍵字)
5.非葉子結點的關鍵字個數=指向兒子的指針個數-1;
6.非葉子結點的關鍵字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
7.非葉子結點的指針:P[1], P[2], …, P[M];其中P[1]指向關鍵字小于K[1]的子樹,P[M]指向關鍵字大于K[M-1]的子樹,其它P[i]指向關鍵字屬于(K[i-1], K[i])的子樹;
8.所有葉子結點位于同一層;
其結構可以簡單定義為:
typedef struct {/*文件數*/int file_num;/*文件名(key)*/char * file_name[max_file_num];/*指向子節(jié)點的指針*/BTNode * BTptr[max_file_num+1];/*文件在硬盤中的存儲位置*/FILE_HARD_ADDR offset[max_file_num]; }BTNode;下面動圖是往B樹中依次插入6 10 4 14 5 11 15 3 2 12 1 7 8 8 6 3 6 21 5 15 15 6 32 23 45 65 7 8 6 5 4
再舉個例子說明B樹的查找過程,如下圖:(M=3)
為了簡單,這里用少量數據構造一棵3叉樹的形式,實際應用中的B樹結點中關鍵字很多的。上面的圖中比如根結點,其中17比表示一個磁盤文件的文件名;小紅方塊表示這個17文件內容在硬盤中的存儲位置;p1表示指向17左子樹的指針。
假如每個盤塊可以正好存放一個B樹的結點(正好存放2個文件名)。那么一個BTNODE結點就代表一個盤塊,而子樹指針就是存放另外一個盤塊的地址。
下面,咱們來模擬下查找文件29的過程:
1、根據根結點指針找到文件目錄的根磁盤塊1,將其中的信息導入內存?!敬疟PIO操作 1次】
此時內存中有兩個文件名17、35和三個存儲其他磁盤頁面地址的數據。根據算法我們發(fā)現17<29<35,因此我們找到指針p2。
2、根據p2指針,我們定位到磁盤塊3,并將其中的信息導入內存?!敬疟PIO操作 2次】
此時內存中有兩個文件名26,30和三個存儲其他磁盤頁面地址的數據。根據算法我們發(fā),26<29<30,因此我們找到指針p2。
3、根據p2指針,我們定位到磁盤塊8,并將其中的信息導入內存?!敬疟PIO操作 3次】
此時內存中有兩個文件名28,29。根據算法我們查找到文,29,并定位了該文件內存的磁盤地址。
4、分析上面的過程,發(fā)現需要3次磁盤IO操作和3次內存查找操作。關于內存中的文件名查找,由于是一個有序表結構,可以利用折半查找提高效率。至于IO操作時影響整個B樹查找效率的決定因素。
當然,如果我們使用平衡二叉樹的磁盤存儲結構來進行查找,磁盤4次,最多5次,而且文件越多,B樹比平衡二叉樹所用的磁盤IO操作次數將越少,效率也越高。
總結
以上是生活随笔為你收集整理的【数据结构】B树的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 委托+事件的例子:①温度报警②计算
- 下一篇: 二叉树的遍历:前序、中序、后序、层次遍历