You are on page 1of 47

Đại Học Sư Phạm Tp.

Hồ Chí Minh

CẤU TRÚC DỮ LIỆU 2

Chương 03: B-Cây


Đề cương môn học: CTDL2
• Chương 1: Sắp xếp ngoại
• Chương 2: Bảng băm (Hash Table)
• Chương 3: B – Cây (B-Tree)
• Chương 4: Cây Đỏ Đen (Red-Black Tree)

CTDL2 – HIENLTH
HIENLTH, HCMUP 2
Nội dung
• Đặt vấn đề
• B-Tree
• Các phép biến đổi
• Ứng dụng của B-Tree

CTDL2 – HIENLTH
HIENLTH, HCMUP 3
Đặt vấn đề

• Cần lưu trữ số phần tử dữ liệu rất lớn

• Lưu trữ trên bộ nhớ ngoài

• Tìm kiếm nhanh

CTDL2 – HIENLTH
HIENLTH, HCMUP 4
Giải quyết
• Thao tác tìm kiếm trên cây tỉ lệ thuận với
chiều cao của cây. Nếu cây có N nút thì.

– Chiều cao của cây nhị phân tìm kiếm cân


bằng ≤ log2N = chi phí tìm kiếm.

– Cây 2-3-4 (mỗi nút có nhiều nhất 4 khoá) ->


≤ chiều cao log4N.

– Chưa phù hợp khi lưu trữ và truy xuất trên


đĩa

CTDL2 – HIENLTH
HIENLTH, HCMUP 5
Giải quyết
• Dùng 1 loại cây khác nhằm mục đích
– Phân trang dữ liệu
• Tăng số nhánh của cây -> Giảm chiều cao của
cây
• Gom nhóm dữ liệu thành những block-> giảm
số lần truy xuất trên đĩa
⇒Dùng B-Cây (1 loại cây nhiều nhánh) thích
hợp với việc lưu trữ và truy xuất trên bộ nhớ
ngoại - đĩa cứng

CTDL2 – HIENLTH
HIENLTH, HCMUP 6
B-Tree
• Định nghĩa:
B-Tree bậc n có các t/c:
– Mỗi nút có tối đa 2*n khóa
– Mỗi nút (không là gốc) có ít nhất n nút
– Mỗi nút hoặc là lá hoặc có m+1 nút con
– Các khóa được sắp tăng dần từ trái sang phải
– Các nút lá nằm cùng một mức

CTDL2 – HIENLTH
HIENLTH, HCMUP 7
Ưu điểm B-Tree
• B-cây là dạng cây cân bằng, phù hợp
với việc lưu trữ trên đĩa

• B-cây tiêu tốn số phép truy xuất đĩa tối


thiểu cho các thao tác

• Có thể quản lý số phần tử rất lớn

CTDL2 – HIENLTH
HIENLTH, HCMUP 8
Chiều cao B-Tree
• N: Số khoá (key), N ≥1

• m: Bậc của cây, m > 2 cấp (m-1)/2

N +1
h ≤ log
m 2

CTDL2 – HIENLTH
HIENLTH, HCMUP 9
Khai báo CTDL
struct NodeType
{
int numtree;//số cây con
int Key[Order];//mảng lưu các khóa của node
NodeType* Branch[Order+1];//con trỏ trỏ đến
node con
};
typedef NodeType* NODEPTR;
NODEPTR * Root;//con trỏ trỏ tới nút gốc
CTDL2 – HIENLTH
HIENLTH, HCMUP 10
Các phép toán trên cây
• Tìm 1 phần tử có khóa bằng X trong cây

• Thêm 1 khoá vào vào B –Tree

• Xóa 1 khoá trong 1 nút

CTDL2 – HIENLTH
HIENLTH, HCMUP 11
Tìm kiếm phần tử có khóa X trên cây
• Việc tìm kiếm được thực hiện tuần tự giống
như trong cây nhị phân tìm kiếm:
– Bắt đầu từ gốc.
– Duyệt cây theo kiểu top-down.
– Tại mỗi node so sánh khóa cần tìm với các
giá trị khóa của node đó để tìm nhánh con
cần duyệt tiếp theo.
• Có thể áp dụng phương pháp tìm kiếm nhị
phân để tìm một khóa trong nội bộ một
node.
CTDL2 – HIENLTH
HIENLTH, HCMUP 12
Thêm 1 nút vào B-Tree
• Tính chất cây B (B-tree): một khối có ít
nhất một nữa số khóa
• Thêm 1 nút có khóa X vào B-Tree
– Thêm X vào 1 nút lá
– Sau khi thêm, nếu nút lá đầy:
• Tách nút lá ra làm đôi
• Chuyển phần tử giữa lên nút cha và lan
truyền ngược về gốc.
• Nếu gốc bị tách, cây được đặt ở mức sâu
hơn

CTDL2 – HIENLTH
HIENLTH, HCMUP 13
Thêm 1 nút vào cây B-Tree
• Nếu số khóa lớn hơn 2n thì tách trang:
– Đưa phần tử giữa lên trang cha
– Tạo thêm trang mới
– Chuyển dời một nửa phần tử sang trang mới
– Tiếp tục lan truyền ở trang cha (nếu trang cha
sau khi thêm > 2n phần tử thì thực hiện tách
trang như trên).

CTDL2 – HIENLTH
HIENLTH, HCMUP 14
Cây B (n = 1) – Chèn
• Chèn
– Chèn 9
– Node bị tràn,
phân tách nó
– Đẩy node giữa (8)
– Gốc bị tràn,
phân tách nó
– Đẩy node giữa (6)
– Node gốc mới hình thành
– Chiều cao tăng 1
CTDL2 – HIENLTH
HIENLTH, HCMUP 15
Ví dụ thao tác thêm (B-Tree: n = 1)
Thêm các nút: 1,2,3,4,5,6,7

CTDL2 – HIENLTH
HIENLTH, HCMUP 16
Ví dụ thao tác thêm (B-Tree: n = 2)

• Cho B-tree rỗng. Lần lượt thêm giá trị các


khóa sau (theo thứ tự) vào B-tree: 1, 12, 8,
2, 25, 5, 14, 28, 17, 7, 52, 16, 48, 68, 3,
26, 29, 53, 55, 45.

• Cần xây dựng B-tree bậc 2.

CTDL2 – HIENLTH
HIENLTH, HCMUP 17
Ví dụ thao tác thêm (B-Tree: n = 2)
• Bốn phần tử đầu tiên 1 2 8 12
được đưa vào nút gốc
• Nếu đưa phần tử thứ năm 8

vào nút gốc sẽ làm vi


phạm điều kiện cây B- 1 2 12 25
tree.
• Do đó, khi thêm khóa 25,
tách nút gốc thành 2 nút
và đưa khóa ở giữa lên để
tạo nút gốc mới.
CTDL2 – HIENLTH
HIENLTH, HCMUP 18
Ví dụ thao tác thêm (B-Tree: n = 2)
8
Thêm các khóa 6, 14, 28
vào các nút lá:
1 2 6 12 14 25 28

Nút lá bên phải đã đầy


(đã có 4 phần tử). Do đó, 8 17
khi thêm khóa 17 vào nút
lá bên phải sẽ làm nút lá 1 2 6 12 14 25 28
bị “quá tải”. Lấy khóa ở
giữa đưa lên nút cha
(hiện tại là nút gốc) và
phân chia nút hiện tại.
CTDL2 – HIENLTH
HIENLTH, HCMUP 19
Ví dụ thao tác thêm (B-Tree: n = 2)
Thêm các khóa 7, 52, 16, 8 17
48 vào các nút lá
1 2 6 7 12 14 16 25 28 48 52

Thêm khóa 68 vào, cần tách nút lá ở bên phải, đưa 48


lên nút gốc
Thêm khóa 3 vào, cần tách nút lá ở bên trái, đưa khóa
3 lên nút gốc
3 8 17 48

1 2 6 7 12 14 16 25 28 52 68
CTDL2 – HIENLTH
HIENLTH, HCMUP 20
Ví dụ thao tác thêm (B-Tree: n = 2)
Thêm các khóa 26, 29, 53, 55 vào các nút lá
3 8 17 48

1 2 6 7 12 14 16 25 26 28 29 52 53 55 68

Thêm khóa 45 vào, cần tách 25 26 28 29 và đưa khóa 28


lên nút gốc. Khi đó, nút gốc sẽ “quá tải” và cần tách tiếp.
17

3 8 28 48

1 2 6 7 12 14 16 25 26 29 45 52 53 55 68

CTDL2 – HIENLTH
HIENLTH, HCMUP 21
Xóa 1 phần tử trên B-Cây bậc n
• Khóa cần xóa trên trang lá  Xóa bình
thường.
• Khóa cần hủy không trên trang lá:
– Tìm phần tử thay thế: Trái nhất (hoặc phải nhất)
trên hai cây con cần tìm
– Thay thế cho nút cần xóa
• Sau khi xóa, trang bị thiếu (vi phạm đk B-
Tree):
– Hoặc chuyển dời phần tử từ trang thừa
– Hoặc ghép với trang bên cạnh (trái/phải)

CTDL2 – HIENLTH
HIENLTH, HCMUP 22
Ví dụ về xóa
• Giả sử đã xây dựng B-cây như sau:
12 24 37

7 9 15 17 20 22 28 32 42 44 48

• Xóa 48
12 24 37

7 9 15 17 20 22 28 32 42 44

CTDL2 – HIENLTH
HIENLTH, HCMUP 23
Ví dụ về xóa
• Xóa 15:
12 24 37

7 9 17 20 22 28 32 42 44

• Xóa 44 (gộp trang)


12 24

7 9 17 20 22 28 32 37 42

CTDL2 – HIENLTH
HIENLTH, HCMUP 24
Ví dụ về xóa
• Xóa 7 (mượn trang phải)
17 24

9 12 20 22 28 32 37 42

• Xóa 24, ta đem khóa 22 lên thay thế. Khi đó


trang 20,22 chỉ còn 20 (phạm), ta phải đem
khóa 22 trở lại trang 20,22. Mang 28 lên
thêm 17 28

9 12 20 22 32 37 42

CTDL2 – HIENLTH
HIENLTH, HCMUP 25
Ví dụ về xóa
• Xóa 20: Mượn trang phải 1 phần tử. Tức mang 32
lên cha, 28 xuống nút có 1 khóa là 22

17 32

9 12 22 28 37 42

CTDL2 – HIENLTH
HIENLTH, HCMUP 26
Ví dụ xóa nút trong B-Tree (tt)
• Xóa 28: 17

9 12 22 32 37 42

• Xóa 9 22

12 17 32 37 42

CTDL2 – HIENLTH
HIENLTH, HCMUP 27
Ví dụ xóa nút trong B-Tree (tt)
• Xóa 37 22

12 17 32 42

• Xóa 17
12 22 32 42

CTDL2 – HIENLTH
HIENLTH, HCMUP 28
B-tree: Cân bằng lại cây sau khi xóa
• Nếu một trong các nút anh em kế cận nút đang xét
có số lượng khóa nhiều hơn số lượng tối thiểu
– Đưa một khóa của nút anh em lên nút cha.
– Đưa một khóa ở nút cha xuống nút đang xét.
• Nếu tất cả các nút anh em kế cận nút đang xét đều
có số lượng khóa vừa đủ số lượng tối thiểu.
– Chọn một nút anh em kế cận và hợp nhất nút anh
em này với nút đang xét và với khóa tương ứng ở
nút cha.
– Nếu nút cha trở nên thiếu khóa, lặp lại quá trình
này.

CTDL2 – HIENLTH
HIENLTH, HCMUP 29
Trường hợp:
Nút anh em kế cận còn đủ khóa để bổ sung
12 29
Delete 22 Đưa khóa từ nút cha xuống
Đưa khóa từ nút anh em kế cận lên

7 9 15 22 31 43 56 69

12 31

7 9 15 29 43 56 69
CTDL2 – HIENLTH
HIENLTH, HCMUP 30
Trường hợp:
Nút đang xét và nút anh em kế cận đề còn
quá ít khóa
12 29 56

Hợp nhất

7 9 15 22 31 43 69 72
Còn quá
ít khóa
Delete 72
12 29

7 9 15CTDL2
22 – HIENLTH
31 43 56
HIENLTH, 69
HCMUP 31
VD 2 – Xoá 1 khoá trong B-Tree cấp 1
• Ví dụ ta có cây
như sau:

• Xoá nút 26 thì ta


làm sao:

CTDL2 – HIENLTH
HIENLTH, HCMUP 32
VD 2 – Xoá 1 khoá trong B-Tree (tt)
• Dùng 28 để thay thế

CTDL2 – HIENLTH
HIENLTH, HCMUP 33
VD 2 – Xoá 1 khoá trong B-Tree (tt)
• Xoá khóa 22 dùng 24 thay thế, thiết nút lá

CTDL2 – HIENLTH
HIENLTH, HCMUP 34
Xoá 1 nút trong B - Tree

CTDL2 – HIENLTH
HIENLTH, HCMUP 35
VD 2 – Xoá 1 khoá trong B-Tree (tt)
• Xoá khoá 18, 8 thay thế

CTDL2 – HIENLTH
HIENLTH, HCMUP 36
VD 2 – Xoá 1 khoá trong B-Tree (tt)

CTDL2 – HIENLTH
HIENLTH, HCMUP 37
Cây B trên đĩa
• Các khối đĩa
– 512 - 8k bytes
∴100s of keys
Dùng tìm kiếm nhị phân cho các khối
• Tổng quát
– O( log n )
– Làm hợp với phần cứng !
• Thủ tục xóa tương tự (Deletion)
– Tuy nhiên, phải hội nhập các khối (block) để bảo đảm
tính chất B-tree
(ít nhất bằng nửa số lượng khóa)
CTDL2 – HIENLTH
HIENLTH, HCMUP 38
Ví dụ

CTDL2 – HIENLTH
HIENLTH, HCMUP 39
Ví dụ

CTDL2 – HIENLTH
HIENLTH, HCMUP 40
Cây B(Block) (B-trees)
• Tất cả các lá nằm trên cùng một mức
• Tất cả các node ngoại trừ gốc và các lá có:
– Ít nhất m/2 con Mỗi node chứa ít nhất
– Nhiều nhất m con một nửa số lượng khóa

• Cây B+ (B+ trees)


– Tất cả các khóa trong các node là giả
– Chỉ các khóa trong các lá nhận giá trị thực “real”
– Liên kết các lá
• Có khả năng duyệt hết danh sách theo thứ tự giữa
không cần thông qua các node cao hơn.

CTDL2 – HIENLTH
HIENLTH, HCMUP 41
Cây B+
• Cây B+
– Tất cả các khóa trong các node là giả
– Chỉ các khóa trong các lá nhận giá trị thực “real”
– Các bản ghi dữ liệu được giữ trong các vùng
riêng

CTDL2 – HIENLTH
HIENLTH, HCMUP 42
Cây B+ - Duyệt theo thứ tự giữa
• Cây B+ (B+ trees)
– Liên kết các lá
• Có khả năng duyệt hết danh sách theo thứ tự
giữa không cần thông qua các node cao hơn.

CTDL2 – HIENLTH
HIENLTH, HCMUP 43
Cây (B+) – Sử dụng
• Sử dụng - Cơ sở dữ liệu lớn
– Đọc một khối đĩa chậm hơn nhiều so với đọc bộ nhớ ( ~ms vs ~ns )
– Đặt từng khối của các khóa vào trong một khối đĩa

Physical disc
blocks

CTDL2 – HIENLTH
HIENLTH, HCMUP 44
Đọc thêm
• Tài liệu tham khảo
– http://en.wikipedia.org/wiki/B-tree
– http://www.bluerwhite.org/btree/
– http://www.nist.gov/dads/HTML/btr
ee.html
– http://www.nist.gov/dads/HTML/bs
tartree.html

CTDL2 – HIENLTH
HIENLTH, HCMUP 45
Luyện tập
• Cho B-tree bậc 2 gồm các khóa sau (chèn
vào theo thứ tự):
3, 7, 9, 23, 45, 1, 5, 14, 25, 24, 13, 11,
8, 19, 4, 31, 35, 56

• Thêm khóa: 2, 6, 12, 0, 10, 11

• Xóa khóa: 4, 5, 7, 3, 14

CTDL2 – HIENLTH
HIENLTH, HCMUP 46
Câu hỏi và thảo luận

CTDL2 – HIENLTH
HIENLTH, HCMUP 47

You might also like