Upload
itnoi
View
1.644
Download
0
Embed Size (px)
Citation preview
Đại Học Sư Phạm Tp. Hồ Chí MinhĐại Học Sư Phạm Tp. Hồ Chí Minh
CẤU TRÚC DỮ LI ỆU 2 CẤU TRÚC DỮ LI ỆU 2
Chương 03: B-Cây
Đề cương môn học: CTDL2CTDL2
• 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)
22CTDL2 – HIENLTHHIENLTH, HCMUP
Nội dung
• Đặt vấn đề• B-Tree• Các phép biến đổi• Ứng dụng của B-Tree
33CTDL2 – HIENLTHHIENLTH, HCMUP
• Ứng dụng của B-Tree
Đặ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
44CTDL2 – HIENLTHHIENLTH, HCMUP
• Tìm kiếm nhanh
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.≤
55CTDL2 – HIENLTHHIENLTH, HCMUP
– 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
≤
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
66CTDL2 – HIENLTHHIENLTH, HCMUP
• 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
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
77CTDL2 – HIENLTHHIENLTH, HCMUP
– 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
Ư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
88CTDL2 – HIENLTHHIENLTH, HCMUP
thiểu cho các thao tác
• Có thể quản lý số phần tử rất lớn
Chiều cao B-Tree
• N: Số khoá (key),
• m: Bậc của cây, m > 2 �cấp (m-1)/2
1≥N
99CTDL2 – HIENLTHHIENLTH, HCMUP
2
1log
+≤ Nh
m
Khai báo CTDL
struct NodeType{
int numtree;//số cây conint Key[Order];//mảng lưu các khóa của node
1010CTDL2 – HIENLTHHIENLTH, HCMUP
int Key[Order];//mảng lưu các khóa của nodeNodeType* Branch[Order+1];//con trỏ trỏ đến
node con
};typedef NodeType* NODEPTR;NODEPTR * Root;//con trỏ trỏ tới nút gốc
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
1111CTDL2 – HIENLTHHIENLTH, HCMUP
• Xóa 1 khoá trong 1 nút
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
1212CTDL2 – HIENLTHHIENLTH, HCMUP
– 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.
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:
1313CTDL2 – HIENLTHHIENLTH, HCMUP
– 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
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
1414CTDL2 – HIENLTHHIENLTH, HCMUP
– 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).
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)
1515CTDL2 – HIENLTHHIENLTH, HCMUP
– Đẩ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
Ví dụ thao tác thêm (B-Tree: n = 1)
Thêm các nút: 1,2,3,4,5,6,7
1616CTDL2 – HIENLTHHIENLTH, HCMUP
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,
1717CTDL2 – HIENLTHHIENLTH, HCMUP
26, 29, 53, 55, 45.
• Cần xây dựng B-tree bậc 2.
Ví dụ thao tác thêm (B-Tree: n = 2)• Bốn phần tử đầu tiên
được đưa vào nút gốc• Nếu đưa phần tử thứ năm
vào nút gốc sẽ làm vi phạm điều kiện cây B-
1 2 8 12
1 2
8
12 25
1818CTDL2 – HIENLTHHIENLTH, HCMUP
phạm điều kiện cây B-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.
1 2 12 25
Ví dụ thao tác thêm (B-Tree: n = 2)
Thêm các khóa 6, 14, 28 vào các nút lá:
1 2
8
12 146 25 28
Nút lá bên phải đã đầy (đã có 4 phần tử). Do đó, 8 17
1919CTDL2 – HIENLTHHIENLTH, HCMUP
(đã có 4 phần tử). Do đó, khi thêm khóa 17 vào nút lá bên phải sẽ làm nút lá 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.
8 17
12 14 25 281 2 6
Ví dụ thao tác thêm (B-Tree: n = 2)
Thêm các khóa 7, 52, 16, 48 vào các nút lá
8 17
12 14 25 281 2 6 16 48 527
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
2020CTDL2 – HIENLTHHIENLTH, HCMUP
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
52 6825 281 2 6 7 12 14 16
Ví dụ thao tác thêm (B-Tree: n = 2)
Thêm các khóa 26, 29, 53, 55vào các nút lá
3 8 17 48
52 53 55 6825 26 28 291 2 6 7 12 14 16
Thêm khóa 45vào, cần tách và đưa khóa 28
2121CTDL2 – HIENLTHHIENLTH, HCMUP
Thêm khóa 45vào, cần tách và đưa khóa 28lên nút gốc. Khi đó, nút gốc sẽ “quá tải” và cần tách tiếp.
25 26 28 29
17
3 8 28 48
1 2 6 7 12 14 16 52 53 55 6825 26 29 45
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
2222CTDL2 – HIENLTHHIENLTH, HCMUP
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)
Ví dụ về xóa
• Giả sử đã xây dựng B-cây như sau:
9 20
37
28 3217
12
15 44
24
7 42 4822
2323CTDL2 – HIENLTHHIENLTH, HCMUP
• Xóa 48
9 20
37
28 3217
12
15 44
24
7 4222
Ví dụ về xóa
• Xóa 15:
9 20
37
28 3217
12
44
24
7 4222
2424CTDL2 – HIENLTHHIENLTH, HCMUP
• Xóa 44 (gộp trang)
9 20 3728 3217
12 24
7 4222
Ví dụ về xóa
• Xóa 7 (mượn trang phải)
• Xóa 24, ta đem khóa 22 lên thay thế. Khi đó 12 20 3728 32
17 24
9 4222
2525CTDL2 – HIENLTHHIENLTH, HCMUP
• 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
12 20 3732
17 28
9 4222
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
2626CTDL2 – HIENLTHHIENLTH, HCMUP
9 22 3712 4228
Ví dụ xóa nút trong B-Tree (tt)
• Xóa 28:
9 22 3712
17
32 42
2727CTDL2 – HIENLTHHIENLTH, HCMUP
• Xóa 9
12 3717
22
32 42
Ví dụ xóa nút trong B-Tree (tt)
• Xóa 37
12 17
22
32 42
2828CTDL2 – HIENLTHHIENLTH, HCMUP
• Xóa 1712 22 32 42
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
2929CTDL2 – HIENLTHHIENLTH, HCMUP
• 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.
Trường hợp:Nút anh em kế cận còn đủ khóa để bổ sung
1212 2929
77 99 1515 2222 696956563131 4343
Delete 22 Đưa khóa từ nút cha xuốngĐưa khóa từ nút anh em kế cận lên
3030CTDL2 – HIENLTHHIENLTH, HCMUP
77 99 1515 2222 696956563131 4343
1212
292977 99 1515
3131
696956564343
Trường hợp:
1212 2929 5656
Hợp nhất
Nút đang xét và nút anh em kế cận đề cònquá ít khóa
3131CTDL2 – HIENLTHHIENLTH, HCMUP
77 99 1515 2222 6969 72723131 4343
Delete 72
Còn quá ít khóa
1212 2929
77 99 1515 2222 696956563131 4343
VD 2 – Xoá 1 khoá trong B-Tree cấp 1
• Ví dụ ta có cây như sau:
3232CTDL2 – HIENLTHHIENLTH, HCMUP
• Xoá nút 26 thì ta làm sao:
VD 2 – Xoá 1 khoá trong B-Tree (tt)
• Dùng 28 để thay thế
3333CTDL2 – HIENLTHHIENLTH, HCMUP
VD 2 – Xoá 1 khoá trong B-Tree (tt)
• Xoá khóa 22 dùng 24 thay thế, thiết nút lá
3434CTDL2 – HIENLTHHIENLTH, HCMUP
Xoá 1 nút trong B - Tree
3535CTDL2 – HIENLTHHIENLTH, HCMUP
VD 2 – Xoá 1 khoá trong B-Tree (tt)• Xoá khoá 18, 8 thay thế
3636CTDL2 – HIENLTHHIENLTH, HCMUP
VD 2 – Xoá 1 khoá trong B-Tree (tt)
3737CTDL2 – HIENLTHHIENLTH, HCMUP
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
3838CTDL2 – HIENLTHHIENLTH, HCMUP
• 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)
Ví dụ
3939CTDL2 – HIENLTHHIENLTH, HCMUP
Ví dụ
4040CTDL2 – HIENLTHHIENLTH, HCMUP
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– Nhiều nhất m con
• Cây B+ (B+ trees)
Mỗi node ch ứa ít nhấtmột nửa số lượng khóa
4141CTDL2 – HIENLTHHIENLTH, HCMUP
• 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ữakhông cần thông qua các node cao hơn.
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
4242CTDL2 – HIENLTHHIENLTH, HCMUP
riêng
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.
4343CTDL2 – HIENLTHHIENLTH, HCMUP
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
4444CTDL2 – HIENLTHHIENLTH, HCMUP
Đọ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
4545CTDL2 – HIENLTHHIENLTH, HCMUP
– http://www.nist.gov/dads/HTML/btree.html
– http://www.nist.gov/dads/HTML/bstartree.html
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
4646CTDL2 – HIENLTHHIENLTH, HCMUP
• Thêm khóa: 2, 6, 12, 0, 10, 11
• Xóa khóa: 4, 5, 7, 3, 14
Câu hỏi và thảo luận
4747CTDL2 – HIENLTHHIENLTH, HCMUP