Vì trong hầu hết các hệ thống, thời gian thực thi của thuật toán cây B-tree được quyết định chính bởi số lượng các thao tác DISK-READ và DISK-WRITE được thực hiện, điều này cho thấy việc
Trang 1Trần Hữu Tấn
GVHD: TS HOÀNG QUANG
Trang 2NỘI DUNG TRÌNH BÀY
3.Thủ tục tìm kiếm, tạo: Lê Thị Thanh Thủy
Trang 3TỔNG QUAN
- B-tree là cấu trúc dữ liệu phù hợp cho việc lưu trữ ngoài do R.Bayer và E.M.McCreight đưa ra năm 1972
- B-tree là cây tìm kiếm cân bằng
- B-tree tương tự như cây đỏ đen
Trang 4So sánh giữa B-tree và cây Đỏ Đen:
Trang 5TỔNG QUAN (tt)
Thời gian tìm kiếm trên B-Tree rất nhanh, cho nên cây này thường được dùng để quản lý cơ sở dữ liệu và công
cụ tìm kiếm như Google đều dùng B-Tree
- Sự quay của đĩa
- Sự chuyển động của cần điều khiển
Rãnh từ Trục xoay
Trang 6TỔNG QUAN (tt)
Có hai thao tác chính mà B-Tree thường sử dụng là:
- Thao tác DISK-READ(x) để đọc đối tượng x vào bộ nhớ
chính trước khi chúng ta yêu cầu những trường của nó
- Thao tác DISK-WRITE(x) được sử dụng để lưu trữ bất cứ thay đổi nào tác động đến các trường của đối tượng x
Vì trong hầu hết các hệ thống, thời gian thực thi của thuật toán cây B-tree được quyết định chính bởi số lượng các thao tác DISK-READ và DISK-WRITE được thực hiện, điều này cho thấy việc sử dụng những thao tác trên càng hiệu quả sẽ dẫn đến việc đọc và ghi thông tin càng nhiều Vì vậy, một nút của B-tree thường có kích thước rộng bằng với toàn bộ một trang trên đĩa Do đó số lượng nút con của nó có thể bị giới hạn bởi kích thước một trang trên đĩa
Trang 7VÍ DỤ MINH HỌA
Một B-Tree có khóa là các phụ âm tiếng anh
root[T]: Con trỏ trỏ đến nút gốc
Trang 8ĐỊNH NGHĨA B-TREE
Một B-Tree có gốc T có các tính chất:
– Một nút x trên cây có các trường sau:
• n[x] : Số các khóa hiện tại được lưu tại nút x.
• key i [x] : Một khóa thứ i được lưu tại nút x.
(với 1<=i<j<=n[x], thì keyi [x]<=keyj [x])
• leaf[x] : nhận giá trị TRUE nếu x là nút lá, nhận giá trị FALSE nếu x không là nút lá (nút thường).
key1[x]
key2[x]
leaf[x]=false
Trang 9TÍNH CHẤT B-TREE
- Mỗi nút thường x chứa n[x] + 1 con trỏ: c 1 [x], c 2 [x], ,
c n[x]+1 [x] trỏ tới các nút con của nó Các nút lá không có
nút con do vậy trường ci của nó không được định nghĩa
c1[x]
Trang 10TÍNH CHẤT B TREE (tt)
– Các khoá key i [x] tách thành các vùng khóa và được lưu trữ thành mỗi cây con tương ứng: nếu k i là một
khoá bất kỳ được lưu trữ trong cây con có gốc là c i [x] thì
k1 ≤ key1[x] ≤ k2 ≤ key2[x] ≤··· ≤ key n[x] [x] ≤ k n[x]+1
– Tất cả các nút lá có cùng chiều cao h
k1 = C
key1[x]=D
Trang 11TÍNH CHẤT B-TREE (tt)
– Số lượng các khoá của một nút nằm trong một biên giới hạn được diễn tả bằng một số nguyên có giá trị không đổi t (t ≥ 2) được gọi là mức tối thiểu của B-
Tree:
• Các nút không phải là nút gốc phải có ít nhất t-1 khoá.
• Mỗi nút thường trừ nút gốc có ít nhất t nút con.
• Nếu cây không rỗng thì nút gốc phải có ít nhất 1 khoá.
• Mỗi nút có thể chứa tối đa 2t-1 khoá (được gọi nút
đầy).
Trang 12ĐỊNH LÝ
Nếu n ≥ 1 thì với bất kỳ B-Tree T n khóa, có mức tối
thiểu t ≥ 2 thì có chiều cao:
) 2
1 (
Trang 13CÁC PHÉP TOÁN CƠ BẢN TRÊN B-TREE.
Trong phần này, ta trình bày các chi tiết của các phép toán B-TREE-SEARCH, B-TREE-CREATE, và B-TREE-INSERT Trong các thủ tục này, ta chấp nhận 2 quy ước:
Gốc của B-Tree luôn nằm trong bộ nhớ chính, để không bao giờ cần thực hiện một DISK-READ trên gốc; tuy nhiên, ta cần một DISK-WRITE của gốc, mỗi khi nút gốc thay đổi
Mọi nút được chuyền dưới dạng các tham số phải
có sẵn một phép toán DISK-READ được thực hiện trên chúng
Trang 14TÌM KIẾM KHÓA TRONG B-TREE
Tìm kiếm trong một B-Tree cũng giống như tìm kiếm trong một cây tìm kiếm nhị phân, thay vì thực hiện rẽ nhánh “2-chiều” tại mỗi nút, ta thực hiện rẽ nhánh đa chiều theo số lượng các con của nút.Tại mỗi nút trong x, ta thực hiện rẽ nhánh (n[x] + 1) chiều
B-TREE-SEARCH chấp nhận dưới dạng nhập liệu một biến trỏ đến nút gốc x của một cây con và một khóa k để tìm kiếm trong cây con đó
Như vậy lệnh gọi trên cùng có dạng SEARCH (root[T], k) Nếu k nằm trong B-Tree, B-TREE-SEARCH trả về cặp có thứ tự (y, i) bao gồm một nút y và một chỉ số i sao cho key[y] = k Ngược lại, giá trị NIL được trả về
Trang 15B-TREE-TÌM KIẾM KHÓA TRONG B-TREE
Trang 16Ví dụ: Cho B-Tree có độ cực tiểu t=2 Tìm khóa 35?
Trang 172 B-TREE-SEARCH(C, 35) i=2, DISK-READ(c 2 [C])
3 B-TREE-SEARCH(H, 35) i=2, return (H, 2)
TÌM KIẾM KHÓA TRONG B-TREE
Trang 18Nhận xét:
Số lượng các trang đĩa mà B-TREE-SEARCH truy cập
là O(h) = O(log t n), ở đó h là chiều cao của B-Tree, t là độ
cực tiểu và n là số lượng khóa trong B-Tree
Do n[x] < 2t, nên thời gian mà vòng lặp while của các dòng 2-3 trải qua trong mỗi nút là O(t), và tổng thời gian CPU là O(th) = O(t logt n).
TÌM KIẾM KHÓA TRONG B-TREE
Trang 19 Để xây dựng một B-Tree, trước tiên ta dùng CREATE để tạo một nút gốc trống rồi gọi B-TREE-INSERT để
B-TREE-bổ sung các khóa mới
Cả hai thủ tục này dùng một thủ tục phụ NODE, phân bổ một trang đĩa sẽ được dùng làm một nút mới trong O(1) thời gian
ALLOCATE- Ta có thể mặc nhận một nút mà ALLOCATE-NODE tạo không yêu cầu DISK-READ
TẠO MỘT B-TREE TRỐNG
Trang 21CHÈN MỘT KHÓA VÀO B-TREE
Tách một nút đầy
Chèn một khoá vào B-tree
Trang 22TÁCH MỘT NÚT ĐẦY
Khi chèn khóa vào một lá của cây, để tránh trường hợp
chèn khóa vào một lá đã đầy, ta cần một thao tác tách (split) một nút đầy y Thao tác này gồm các bước:
– Xác định khoá giữa (trung tuyến) của nút đầy y là khoá
key t [y].
– Tách nút đầy y tại khóa giữa của nó thành hai nút, mỗi nút có t - 1 khóa và t nút con.
– Di chuyển khóa trung tuyến lên nút cha của y là x (x phải
là nút không đầy) vào một vị trí “thích hợp”
Trang 23VÍ DỤ TÁCH MỘT NÚT ĐẦY
Bậc tối thiểu của cây là t =4
Số nút tối đa của một nút là 7
Tách nút đầy y là con của nút không đầy x
Trang 255 do key j [z] ← key j + t [y]
6 if not leaf [y]
khóa lớn hơn và t nút con của y
Điều chỉnh số khóa của y
Trang 26 B-TREE-SPLIT-CHILD cần:
Θ(t) thời gian chiếm CPU (do các vòng lặp 4-5 và 7-8) – O(1) lần đọc đĩa
TÁCH MỘT NÚT ĐẦY (TT)
Trang 27 Chèn vào nút lá
Để chèn khoá mà chỉ cần một lượt đi từ gốc tới một lá, cần phải tách mọi nút đầy trên đường đi từ gốc tới nút lá Nhằm đảm bảo việc tách một nút đầy y thì nút cha của nó là một nút không đầy
Thủ tục B-TREE-INSERT(T, k) để chèn một khoá k vào một cây B T Gồm có các bước sau:
– Nếu nút gốc của T đầy, thủ tục này sẽ gọi thủ tục
B-TREE-SPLIT-CHILD để tách nút gốc đầy
– Gọi thủ tục chèn khoá vào cây mà nút gốc không đầy
CHÈN MỘT KHÓA VÀO B-TREE
Trang 29 Các trường hợp xảy ra khi chèn một khoá vào một B-tree
– Chèn khoá k vào một nút không đầy
– Chèn khoá k vào một nút mà trên đường đi gặp:
• Nút gốc đầy (nút gốc tại thời điểm gọi đệ quy)
• Nút lá đầy
CHÈN MỘT KHÓA VÀO CÂY B
Trang 30 B-tree có mức tối thiểu t=3 :
Chèn B vào nút không đầy: Đây là một phép chèn đơn giản vào một nút lá
Trang 31 Chèn Q vào cây: Nút R-S-T-U-V được tách thành hai nút chứa R-S và U-V, khóa T được dời lên đến gốc, và Q được chèn vào nút trái của hai nửa (nút R-S)
Trang 32 Chèn L vào cây: Gốc được tách ngay, bởi nó đầy và cây B tăng trưởng theo chiều cao lên 1 Khóa L được chèn vào lá chứa J-K
x
L
VÍ DỤ CHÈN KHI NÚT GỐC ĐẦY
Trang 35CHÈN MỘT KHÓA VÀO CÂY CON MÀ NÚT GỐC
KHÔNG ĐẦY
1 i ← n[x]
2 if leaf [x]
3 then while i ≥ 1 and k < key i [x]
4 do key i+1 [x] ← key i [x]
gọi đệ quy đi xuống để chèn k
đầy sử dụng thủ tục tách.
nút nào trong 2 nút vừa tách.
Trang 36ĐỘ PHỨC TẠP KHI CHÈN MỘT KHÓA
VÀO MỘT B-TREE
Thủ tục B-TREE-INSERT cần:
– O(h) số lần truy cập đĩa
– Thời gian chiếm CPU là O(t h) = O(t log t n)
Trang 40MỘT SỐ ĐẶC ĐIỂM CỦA THAO TÁC XÓA
Có thể xóa ở bất cứ nút nào
Việc xóa đòi hỏi các nút có thể được bố trí lại
Thủ tục B-TREE-DELETE được yêu cầu xóa k ra khỏi cây con có gốc tại nút x Lúc đó thủ tục xóa yêu cầu
trước khi đệ qui xuống một nút con thì nút con đó phải
có số khóa ≥ t
Trang 44B-TREE-DELETE(x, k)
Trường hợp 2c:
Nếu cả nút con trái
và nút con phải của
xóa và nút con phải
vào nút con trái
Trang 46E L P T X
J K
Trang 48B-TREE-DELETE(x, k)
Thủ tục B-TREE-DELETE cần
Số truy cập lên đĩa là O(h) vì có O(1) lần gọi
DISK-READ và DISK-WRITE giữa các lời gọi đệ quy của thủ tục
Thời gian CPU của thủ tục là
Trang 49Cảm ơn thầy và các đồng chí đã
lắng nghe!