最近在看作業系統和資料庫系統,當涉及到查詢檔案和建立資料庫索引時書中反覆提到使用b+ 樹可以實現高效的查詢,於是我迫不及待地想研究一下b+ 樹的內部結構。
首先從二叉查詢樹開始講起。
二叉搜尋樹(binarysearch tree),別名又叫二叉查詢樹,二叉排序樹。它是一棵空樹或者是滿足以下條件的二叉樹:它的左子樹不空,則左子樹上所有的結點的值均小於它的根節點的值;若它的右子樹不空,則右子樹上所有節點的值均大於它的根節點的值。並且它的左右子樹也稱為二叉排序樹。
典型的二叉查詢樹有平衡二叉查詢樹,紅黑樹,查詢的時間複雜度為o(log2n
)。 但是為了有效避免磁碟過於頻繁的查詢訪問操作,我們需要使樹具有較低的高度,從而引入了b樹。
注意:b樹和b-樹是同一種樹,只不過英語中b-tree被中國人翻譯成了b-樹,讓人覺得它們是兩種不同的樹,實際上,兩者就是同一種樹。
b樹是一種為了提高磁碟或者其他儲存裝置而設計的一種多叉(有多個分支)平衡查詢樹。這裡分支結點的個數不限,這樣就使得樹的高度要比紅黑樹小很多。b樹有乙個特點:所有的葉節點都處於相同的深度。
下面給出一棵m階b樹的定義(用階來定義比較經典):
1. 樹中每個結點最多含有m個孩子(m>=2);
2. 除根節點外,其他結點至少含有ceil(m/2)個孩子(向上取整);
3. 根節點至少有兩棵子樹(除非b樹只包含乙個結點)。
4. 所有葉節點在同一層上。b樹的葉節點看做外部結點,不包含任何資訊。
5. 有j個孩子的非葉節點恰好有j-1個關鍵碼,關鍵碼按遞增次序排列。
比如說,查詢檔案28,首先看模組1,發現17<28<35,然後看p2指標,看模組3,發現26<28<30,檢視指標p2,檢視磁碟塊8,然後成功找到檔案28。
我們知道對於在外存中查詢檔案來說,查詢效率取決於
b樹的高度。下面給出以下規律:對於一棵含有
n個總關鍵字的m階
b樹的最大高度為
log┌m/2┐((n+1)/2)+1 (以1
開始計數)。
[證明參見演算法導論
]
下面講b+樹,
b+樹是為檔案系統所需而產生的一種
b樹的變形樹。
問:b樹和b+樹的不同之處?
b樹所有結點都出現在同一層,葉子結點不包含任何關鍵字資訊。
但是b+樹所有的葉子結點中包含了全部關鍵字的資訊,及指向含有這些關鍵字記錄的指標,且葉子結點本身按照關鍵字的大小自小而大的順序鏈結。因為任何關鍵字的查詢必須走一條從根結點到葉子結點的路,所以所有關鍵字的查詢路徑長度相同,使得b+樹的查詢效率更加穩定。
另外,在資料庫系統中,頻繁的操作是元素的遍歷,因為
b+樹只要遍歷葉子結點就可以實現整棵樹的遍歷,所以效率遠遠高於b樹。
B樹,B 樹,B 樹,B 樹
小彰的部落格 b樹 即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點...
B樹 B 樹 B 樹 B 樹
b 樹即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left 和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點關鍵字小,就...
B樹 B 樹 B 樹 B 樹
b樹 即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點關鍵字小,就進...