47
Đại Hc Sư Phm Tp. HChí Minh Đại Hc Sư Phm Tp. HChí Minh CU TRÚC DLIU 2 CU TRÚC DLIU 2 Chương 03: B-Cây

CTDL2_CH03_BTree

  • Upload
    itnoi

  • View
    1.644

  • Download
    0

Embed Size (px)

Citation preview

Page 1: CTDL2_CH03_BTree

Đạ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

Page 2: CTDL2_CH03_BTree

Đề 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

Page 3: CTDL2_CH03_BTree

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

Page 4: CTDL2_CH03_BTree

Đặ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

Page 5: CTDL2_CH03_BTree

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

Page 6: CTDL2_CH03_BTree

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

Page 7: CTDL2_CH03_BTree

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

Page 8: CTDL2_CH03_BTree

Ư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

Page 9: CTDL2_CH03_BTree

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

Page 10: CTDL2_CH03_BTree

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

Page 11: CTDL2_CH03_BTree

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

Page 12: CTDL2_CH03_BTree

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.

Page 13: CTDL2_CH03_BTree

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

Page 14: CTDL2_CH03_BTree

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).

Page 15: CTDL2_CH03_BTree

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

Page 16: CTDL2_CH03_BTree

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

Page 17: CTDL2_CH03_BTree

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.

Page 18: CTDL2_CH03_BTree

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

Page 19: CTDL2_CH03_BTree

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

Page 20: CTDL2_CH03_BTree

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

Page 21: CTDL2_CH03_BTree

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

Page 22: CTDL2_CH03_BTree

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)

Page 23: CTDL2_CH03_BTree

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

Page 24: CTDL2_CH03_BTree

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

Page 25: CTDL2_CH03_BTree

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

Page 26: CTDL2_CH03_BTree

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

Page 27: CTDL2_CH03_BTree

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

Page 28: CTDL2_CH03_BTree

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

Page 29: CTDL2_CH03_BTree

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.

Page 30: CTDL2_CH03_BTree

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

Page 31: CTDL2_CH03_BTree

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

Page 32: CTDL2_CH03_BTree

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:

Page 33: CTDL2_CH03_BTree

VD 2 – Xoá 1 khoá trong B-Tree (tt)

• Dùng 28 để thay thế

3333CTDL2 – HIENLTHHIENLTH, HCMUP

Page 34: CTDL2_CH03_BTree

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

Page 35: CTDL2_CH03_BTree

Xoá 1 nút trong B - Tree

3535CTDL2 – HIENLTHHIENLTH, HCMUP

Page 36: CTDL2_CH03_BTree

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

3636CTDL2 – HIENLTHHIENLTH, HCMUP

Page 37: CTDL2_CH03_BTree

VD 2 – Xoá 1 khoá trong B-Tree (tt)

3737CTDL2 – HIENLTHHIENLTH, HCMUP

Page 38: CTDL2_CH03_BTree

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)

Page 39: CTDL2_CH03_BTree

Ví dụ

3939CTDL2 – HIENLTHHIENLTH, HCMUP

Page 40: CTDL2_CH03_BTree

Ví dụ

4040CTDL2 – HIENLTHHIENLTH, HCMUP

Page 41: CTDL2_CH03_BTree

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.

Page 42: CTDL2_CH03_BTree

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

Page 43: CTDL2_CH03_BTree

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

Page 44: CTDL2_CH03_BTree

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

Page 45: CTDL2_CH03_BTree

Đọ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

Page 46: CTDL2_CH03_BTree

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

Page 47: CTDL2_CH03_BTree

Câu hỏi và thảo luận

4747CTDL2 – HIENLTHHIENLTH, HCMUP