《算法導論》第18章 B樹 個人筆記

第18章 B樹

18.1 B樹的定義

一棵B樹T是具有以下性質的有根樹(根爲T.root);
1、 每個結點x有下面屬性:

  • x.n ,當前存儲在結點x中的關鍵字個數
  • x.n 個關鍵字本身x.key1x.key2...x.keyx.n
  • x.leaf ,一個布爾值,如果x是葉節點,則爲TRUE,否則爲FALSE

2、每個內部結點x還包含x.n+1 個指向其孩子的指針x.c1,x.c2,..,x.cx.n+1 。葉節點沒有孩子,所以它們的ci 屬性沒有定義
3、 關鍵字x.keyi 對存儲在各子樹中的關鍵字範圍加以分割:如果ki 爲任意一個存儲在以x.ci 爲根的子樹中的關鍵字,那麼有

k1x.key1k2xkey2...x.keyx.kx.n+1

4、每個葉節點具有相同的深度,即樹的高度h
5、每個結點所包含的關鍵字個數有上屆和下界,用一個被稱爲B樹的最小度數的固定整數t2 來表示這些界:
  • 除了根結點以外的每個結點必須至少有t-1個關鍵字。因此,除了根結點以外的每個內部結點至少有t個孩子。如果樹非空,根結點至少有一個關鍵字。
  • 每個結點至少可包含2t-1個關鍵字。因此,一個內部結點至多可有2t個孩子。當一個結點恰好有2t-1個關鍵字時,則稱該結點是滿的。

定理:如果n1 ,那麼對任意一棵包含n個關鍵字、高度爲h、最小度數t2 的B樹T,有hlogtn+12

18.2 B樹上的基本操作

1、搜索B樹

B-TREE-SEARCH(x,k)
i = 1
while i<=x.n && k > x.key[i]
    i++
if i <= x.n and k = x.key[i]
    return (x,i)
elif x.leaf
    reurn NIL
else DISK-READ(x.c[i])
    return B-TREE-SEARCH(x.c[i],k)

2、創建一棵空的B樹

B-TREE-CREATE(T)
x = ALLOCATE-NODE()
x.leaf = TRUE
x.n = 0
DISK-WRITE(x)
T.root = x

3、向B樹中插入一個關鍵字

  • 分裂B樹中的結點
B-TREE-SPLIT-CHILD(x, i)
z = ALLOCATE-NODE()
y = x.c[i]
z.leaf = y.leaf
z.n = t-1
for j=1 to t-1
    z.key[i]=y.key[t+j]
if !y.leaf
    for j=1 to t
        z.c[j]=y.c[t+j]
y.n = t-1
for j = x.n+1 downto i+1
    x.key[j+1] = x.key[j]
x.c[i+1] = z
for j = x.n downto i
    x.key[j+1] = x.key[j]
x.key[i] = y.key[t]
x.n++
DISK-WRITE(y)
DISK-WRITE(z)
DISK-WRITE(x)
  • 沿樹單程下行方式向B樹插入關鍵字
B-TREE-INSERT(T,k)
r = T.root
if r.n == 2t-1
    s = ALLOCATE-NODE()
    T.root = s
    s.leaf = FALSE
    s.n = 0
    s.c = r
    B-TREE-SPLIT-CHILD(s,1)
    B-TREE-INSERT-NONFULL(s,k)
else B-TREE-INSERT-NONFULL(r,k)

B-TREE-INSERT-NONFULL(x,k)
i = x.n
if x.leaf
    while i>=1 && k<x.key[i]
        x.key[i+1] = x.key[i]
        i--
    x.key[i+1] = k
    x.n++
    DISK-WRITE(x)
else 
    while i>=1 && k<x.key[i]
        i--
    i++
    DISK-READ(x.c[i])
    if x.c[i].n = 2t-1
        B-TREE-SPLIT-CHILD(x,i)
        if k > x.key[i]
            i++
    B-TREE-INSERT-NONFULL(x.c[i],k)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章