從概念性的思維來審視
, 無疑會認為
r-b樹是一種十分平衡的設計
, 既保持了查詢的優點
, 又不犧牲太多的修改效率
, 除了因為顏色屬性略佔空間外
(即使這一點也僅是在大資料量時才予考慮的
, 當然大資料量正是
b樹適用的場景
), 作為構造乙個
key查詢功能的結構的方法
, r-b
樹簡直無可挑剔
. 可惜
, 事實是
, 沒有萬能的資料結構
, 當我們的資料量過大而必須使用輔助儲存時
, 最好是另想辦法
——總不能指望靠作業系統的記憶體管理機制來"透明
"實現吧
. "透明
"的乙個隱含的貶義即"低效
".
b-tree
就是用來解決資料量大於貯存而不得不放在輔助儲存器的問題
, 演算法將讀寫主動控制起來
, 而資料結構的設計將資料分割、組織成為易於訪問的結構
. b-tree
為了減少磁碟讀寫
, 在單個節點中存放多個鍵值
, 而乙個節點的資料大小設計為輔存中儲存單元的整數倍
, 進一步優化磁碟讀寫
. 節點內鍵值按單增排序
, 每兩個鍵值間儲存指標指向子節點(子樹
), 子樹中所有鍵值的大小都在該二鍵值之間
. 這種設計的好處是
, 如果節點內儲存
1000
個鍵值,
那麼在10
億個鍵值的集合查詢
, 僅需讀取兩個
node(
兩次磁碟訪問).
關於節點大小與樹高的關係是這樣的
. b-tree
最重要的全域性屬性是
branching factor(
分支因數
?),
它定義了內結點中鍵值的數量範圍以及子節點的數量範圍
. 設此係數為t
, 則任何內節點的鍵值數
k>t-1
且k<2t-1,
子節點數為
k+1,
而樹高漸進為
logt((n+1)/2), n
為樹中全部節點數.
branching factor
的重要性表現在
, 對樹的操作(插入
/刪除
), 必須保證操作的完成不得使節點內鍵值分布超出允許的範圍
, 這一點與其他的平衡樹類似
, 都是為了保持樹結構的穩定
, 防止操作效率惡化.
b-tree
的節點鍵值數有兩個邊界
, 操作過程中就必須處理兩種可能的越界
. 分別定義了兩種操作來維持節點大小
, 分別在插入和刪除操作中使用
. 1.
插入使得節點鍵值過多
(>2t-1),
需要進行**操作
, 將插入後會造成上越界的節點一分為二
, 再按照一般的插入步驟插入到二者之一
. 2.
刪除操作可能造成節點鍵值過少
(必須進行合併等操作
, 此時情況比較複雜
, 可能還需要多次遞迴的刪除以致減少樹高.
插入的圖示
刪除的圖示(摘自introduction to algorithm)b-
tree
的一種重要用法是資料庫中的大型索引. b-
tree
最早是在一片研究大型有序索引的文章中提出的, 全名是organization and maintenance of large ordered indices, 這幾乎是當今大型關聯式資料庫中必須的. 大型資料庫中的單個索引總是很容易就能超過主存, b-
tree
的輔存優化特性正好是和這樣的嚴苛情況. 索引是大型資料庫中必須的設施, 雖然一般的平衡搜尋樹也能維護索引, 但是在磁碟訪問效能方面, b-
tree
明顯更為優越.
資料庫服務的多發特性要求 b-
tree
能進行併發的更新和查詢, b-
tree
的動態維護相當複雜, 多沖訪問容易造成資料丟失, 只有在lock的設計被提出之後, 才使得小粒度的併發訪問得以進行並且不影響樹結構的更新
資料結構下課複習2
1 計算 calculate 指運用事先規定的規則,將一組數值變換為另一 所需的 數值的過程。一般要有乙個計算模型。2 演算法 algorithm 簡單說,就是解決問題的一種方法或過程,由一系列計算步驟構成 目的是將問題的輸入變換為輸出 即,它是乙個定義良好的計算過程,它以乙個或一組值作為輸入,並產...
資料結構複習筆記(2)
線性表是n個資料元素的有限序列。乙個資料元素可以由若干資料項組成,此時將資料元素稱為記錄,含有大量記錄的線性表稱為檔案。同一線性表中的元素必定具有相同特性 屬於同一資料物件 線性表中有多個元素時,第乙個元素有且僅有乙個直接後繼,最後乙個元素有且僅有乙個直接前驅,其他元素有且僅有乙個直接前驅和乙個直接...
資料結構知識複習 day2
之前的博文中介紹了如何使用動態陣列來實現乙個簡單的佇列,而本文中簡要介紹一下如何使用標準c來實現乙個在記憶體中物理位置不連續的鍊錶。以下分別是link.h以及link.c檔案原始碼 ifndef linked h struct node typedef struct node position ty...