Professional Documents
Culture Documents
Hồ Chí Minh
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 đề
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ì.
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
CTDL2 – HIENLTH
HIENLTH, HCMUP 8
Chiều cao B-Tree
• N: Số khoá (key), N ≥1
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
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)
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
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
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
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
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:
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
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
• 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