B tree cây tìm kiếm nhiều đường
Trang 1B-CÂY
Chương 4
Trang 2Cây tìm kiếm nhiều đường
Cây tìm kiếm nhiều đường (Multiway Search
Trees):
– Cây tìm kiếm cấp m (m > 2) là sự mở rộng
của cây nhị phân tìm kiếm BST, trong đó mỗi nút có tối đa m con
– Một ứng dụng của cây tìm kiếm nhiều
đường là được sử dụng để truy xuất bộ nhớ ngoài theo nguyên tắc: “Số lần truy xuất
càng ít càng tốt”
Trang 3Cây tìm kiếm nhiều đường
– Điều nầy dẫn đến một cây được chia
thành các cây con (gọi là trang) và các phần tử trong một trang sẽ được truy xuất đồng thời
Ví dụ, cây nhị phân được chia thành các trang, mỗi trang có 3 nút:
Trang 4Cây tìm kiếm nhiều đường
Giả sử mỗi trang có 100 nút và cây này có
1 triệu phần tử thì trung bình chỉ cần
lần truy xuất thay vì
Trang 5B-cây (Bayer tree)
Ta nhận thấy cây cân bằng đòi hỏi phải cân bằng lại trong quá trình cây bị biến đổi
Việc cân bằng này bao gồm nhiều thao tác phức tạp và tốn thời gian
Một tiêu chuẩn được R Bayer đưa ra năm
1970 là mọi trang (trừ trang gốc) chứa ít
Trang 6– Mỗi trang có tối đa 2*n phần tử
– Mỗi trang, ngoại trừ trang gốc chứa ít
nhất n phần tử Trang gốc được phép
chứa 1, 2, , 2*n phần tử
– Mỗi trang hoặc là trang lá (không có
con) hoặc có m + 1 trang con, với m là số phần tử của trang này
– Tất cả các trang lá phải có cùng mức
Trang 8 Nếu dồn B-cây lại thành một mức duy nhất bằng cách chèn các trang con vào giữa các nút trong trang cha của chúng thì được các giá trị sắp theo thứ tự tăng dần
Đây là sự mở rộng tự nhiên của cây tìm
kiếm nhị phân
Trang 9Cài đặt B-cây
const int N = 2; // cấp của B-cây
const int NN = 4; // kích thước trang
typedef struct Page* ref;
struct Node
{
int key; // giá trị của nút
ref pR; // trỏ đến trang con bên phải int count; // số lần xuất hiện của khóa
// có giá trị bằng key };
Trang 10Cài đặt B-cây
struct Page
{
int m; // số phần tử của trang
ref pL; // trỏ đến trang con bên trái Node e[NN]; // các nút (phtử) của trang };
ref root; // trỏ đến trang gốc
Trang 11Các phép toán trên B-cây
Tìm kiếm và thêm vào B-cây:
– Nếu một nút được thêm vào trang chưa đầy (< 2*n) thì nút đó được thêm vào
trang này
– Ngược lại, phải cấp thêm trang mới
– Ví dụ, có B-cây cấp 2 như sau:
Trang 12Các phép toán trên B-cây
Nếu thêm vào nút 22, thực hiện các bước
Trang 13Các phép toán trên B-cây
Cấu trúc mới này vẫn giữ được các tính chất của B-cây Các trang tách chứa đúng
n nút
Nút được chuyển lên trang cha có thể làm
nó trang này bị tràn và gây ra sự tách
trang lan truyền
Trang 14Các phép toán trên B-cây
Giải thuật tìm kiếm và thêm vào như sau:
– Gọi x là khóa cần tìm
– a là trang hiện tại đang tìm x
– h là chiều cao của cây ( h = 0 : chiều cao
không tăng, h = 1 : chiều cao tăng)
– v là nút tạm có kiểu Node
void search(int x, ref a, int &h,
Trang 16Các phép toán trên B-cây
else // không thấy
{
– Dựa vào kết quả tìm kiếm mà cho q trỏ đến trang con bên trái hay bên phải của trang a
–search(x, q, h, v); // q là trang con –if(h) thì // thêm phần tử mới
if(số phần tử trang hiện tại < 2n) Xen v vào trang hiện tại, cho h = 0 else
Trang 17Các phép toán trên B-cây
Ví dụ, tạo B-cây cấp 2 với giá trị lần lượt là:
20, 40, 10, 30, 15, 35, 7, 26, 18, 22, 5, 42,
13, 46, 27, 8, 32, 38, 24, 45, 25
Quá trình được diễn ra như sau:
1 Sau khi thêm các giá trị 20, 40, 10, 30 thì kết quả như sau:
Trang 18Các phép toán trên B-cây
2 Khi giá trị 15 được thêm vào, vì trang cấp
2 có tối đa 4 phần tử nên xảy ra việc tách trang (phần tử giữa 20 của dãy 10 15 30
20 40 được đưa lên trang cha mới):
Trang 19Các phép toán trên B-cây
3 Sau khi thêm các giá trị 35, 7, 26, 18:
4 Khi thêm giá trị 22, vì các trang lá có đủ 4 phần tử nên xảy ra việc tách trang (phần tử giữa 30 của dãy 22 26 30 35 40 được đưa lên trang cha):
Trang 20Các phép toán trên B-cây
5 Khi thêm giá trị 5 vào cũng xảy ra việc
tách trang, phần tử giữa 10 của dãy 5 7 10
15 18 được đưa lên trang cha:
Trang 21Các phép toán trên B-cây
6 Sau khi thêm các giá trị 42, 13, 46, 27, 8:
7 Khi thêm giá trị 32 xảy ra việc tách trang, phần tử giữa 40 của dãy 32 35 40 42 46 được đưa lên trang cha
Trang 22Các phép toán trên B-cây
8 Sau khi thêm các giá trị 38, 24, 45:
Trang 23Các phép toán trên B-cây
Khi thêm giá trị 25 xảy ra việc tách trang,
phần tử giữa 25 của dãy 22 24 25 26 27
được đưa lên trang cha Nhưng trang cha
chứa đủ 4 phần tử nên tách trang xảy ra lan truyền Trang cha được tách thành hai trang con và 25 được đưa lên trang cha mới:
Trang 24Các phép toán trên B-cây
Tìm kiếm và loại bỏ khỏi B-cây: Xét hai
trường hợp sau:
1 Phần tử bị loại bỏ ở trang lá: Trường hợp này được thực hiện dễ dàng
2 Phần tử bị loại bỏ không ở trang lá: Nó
phải được thay thế
Trang 25Các phép toán trên B-cây
F (phần tử cực phải của cây con bên trái
trang A) được đưa lên thay thế Khi này trang
F chỉ chứa 1 (< n) nút 22, phải đem nút 20
của trang B vào trang F và đem nút 18 của
trang E vào trang B
Trang 26Các phép toán trên B-cây
Sau khi loại bỏ nút 45:
Trang 27Các phép toán trên B-cây
Khi loại bỏ nút 24, nút 22 của trang F sẽ thay thế Khi này, trang F chỉ chứa nút 20, nhập trang F vào trang E và đem nút 18 của trang
B vào trang E và hủy đi trang F Nhưng khi
này, trang B chỉ chứa nút 10 nên phải nhập trang C vào B và đưa nút 22 của trng A vào B, hủy trang A và C
Trang 28Các phép toán trên B-cây
Sau khi loại bỏ nút 38:
Khi loại bỏ nút 32, trang H chỉ chứa nút 35, phải nhập trang I vào trang H và đem nút
Trang 29Các phép toán trên B-cây
Khi loại bỏ nút 8:
Trang 30Các phép toán trên B-cây
Khi loại bỏ nút 27, đem nút 30 của trang B vào G và nút 35 của trang H vào B
Khi loại bỏ nút 46 và 13:
Trang 31Các phép toán trên B-cây
Khi loại bỏ nút 42, nhập trang H vào G, đem nút 35 của trang B vào G, hủy trang H
Khi loại bỏ nút 5, đem nút 10 của trang B vào D và nút 15 của trang E vào B:
Trang 32Các phép toán trên B-cây
Khi loại bỏ nút 22, đem nút 26 của trang G vào B
Trang 33Các phép toán trên B-cây
Khi loại bỏ nút 26, nhập trang G vào E, đem nút 30 của trang B vào E, hủy trang G
Trang 34Các phép toán trên B-cây
Khi loại bỏ nút 7, đem nút 15 của trang B vào trang D và nút 20 của trang E vào B
Khi loại bỏ nút 35:
Trang 35Các phép toán trên B-cây
Khi loại bỏ nút 15, nhập trang E vào D,
đem nút 20 của trang B vào D, hủy trang E
và B