Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 11

B-CÂY

Nội dung:
• Định nghĩa
Nhóm 4
• Các phép toán
1
Thành viên nhóm

▰ Nguyễn Thành Trung


▰ Phan Bảo Quân
▰ Võ Minh Khang
▰ Nguyễn Hoàng Bảo Phúc
▰ Nguyễn Văn Trí

2
Giới thiệu

Trong khoa học máy tính, B-cây là một cấu trúc


dữ liệu dạng cây cho phép tìm kiếm, truy cập
tuần tự, chèn, xóa trong thời gian lôgarit. B-cây
là một tổng quát hóa của cây nhị phân tìm
kiếm, trong đó một nút có thể có nhiều hơn hai
con. Không như cây nhị phân tìm kiếm tự cân
bằng, B-cây được tối ưu hóa cho các hệ thống
đọc và ghi dữ liệu lớn. Nó thường được dùng
trong các cơ sở dữ liệu và hệ thống tập tin.

3
Giới thiệu

B-cây có lợi thế hơn các cấu trúc dữ liệu tìm


kiếm khác khi thời gian truy cập lớn hơn nhiều
lần thời gian đọc dữ liệu liên tiếp nhau. Điều
này thường xảy ra khi các nút được lưu trên bộ
nhớ ngoài. Bằng cách tăng số lượng nút con
của mỗi nút, chiều cao của cây giảm xuống và
số lần truy cập cũng giảm. Thêm vào đó, số
thao tác tái cân bằng cây cũng giảm đi. Thông
thường, tham số t (quyết định số khóa của mỗi
nút) được chọn tùy theo lượng thông tin trong
mỗi khóa và kích thước mỗi khối đĩa.

4
Định nghĩa

Có nhiều định nghĩa khác nhau của B-cây trong các tài liệu. Sau đây là một định nghĩa.

1. Mỗi nút x chứa

1. số n[x] là số khóa lưu tại x.

2. n[x] khóa, theo thứ tự tăng dần.

2. Mỗi nút trong x chứa n[x]+1 con trỏ tới các nút con của x.

3. Mỗi khóa tại x có giá trị nằm giữa giá trị các khóa tại hai cây con tương ứng của x: khóa thứ i của x lớn hơn hoặc bằng
mọi khóa ở cây con thứ i của x và nhỏ hơn hoặc bằng mọi khóa ở cây con thứ i+1 của x.

4. Mọi nút lá đều có cùng một độ sâu.

5. Số khóa của mỗi nút nằm trong một khoảng định trước. Khoảng này được quyết định bởi tham số t≥2.

1. Mỗi nút trong khác gốc có ít nhất t-1 khóa. Nếu cây khác rỗng thì nút gốc phải có ít nhất một khóa.

2. Mỗi nút có tối đa 2t-1 khóa. 5


Các phép toán

 Tìm kiếm

Xét node trong hình trên, khóa cần tìm là X. Giả sử nội dung của node nằm trong bộ
nhớ. Với m đủ lớn ta sử dụng phương pháp tìm kiếm nhị phân, nếu m nhỏ ta sử dụng
phương pháp tìm kiếm tuần tự. Nếu X không tìm thấy sẽ có 3 trường hợp sau xảy ra:
1) Ki < X < Ki₊₁. Tiếp tục tìm kiếm trên cây con Ci
2) Km < X. Tiếp tục tìm kiếm trên Cm
3) X < K₁. Tiếp tục tìm kiếm trên C₀
Quá trình này tiếp tục cho đến khi node được tìm thấy. Nếu đã đi đến node lá mà vẫn
không tìm thấy khóa, việc tìm kiếm là thất bại.
6
Các phép toán

 Phép toán NODESEARCH


Trả về vị trí nhỏ nhất của khóa trong nút p bắt đầu lớn hơn hay bằng k. Trường hợp k lớn hơn tất cả
các khóa trong nút p thì trả về vị trí p->numtrees-1
int nodesearch (NODEPTR p, int k)
{
int i;
for (i = 0; i < p->numtrees-1 && p->key[i] < k; i++);
return (i);
}

Phép toán nodesearch được dùng để tìm khóa k có trong nút p hay không. Nếu khóa k không có trong
nút p thì phép toán này trả về vị trí giúp chúng ta chọn nút con phù hợp của p để tiếp tục tìm khóa k
trong nút con này.

7
Các phép toán

 Phép toán SEARCH


Tìm khóa k trên B-Cây. Con trỏ p xuất phát từ gốc và đi xuống các nhánh cây
con phù hợp để tìm khóa k có trong một nút p hay không
Nếu có khóa k tại nút p trên cây:
- Biến found trả về giá trị TRUE
- Hàm search() trả về con trỏ chỉ nút p có chứa khóa k
- Biến position trả về vị trí của khóa k có trong nút p này
Nếu không có khóa k trên cây: lúc này p=NULL và q(nút cha của p) chỉ nút lá có
thể thêm khóa k vào nút này được.
- Biến found trả về giá trị FALSE
- Hàm search() trả về con trỏ q là nút lá có thêm nút k vào
- Biến position trả về vị trí có thể chèn khóa k vào nút lá q này
8
Các phép toán
NODEPTR search (int k, int *pposition, int *pfound)
{
int i;
NODEPTR p, q;
q = NULL;
p = Root;
while (p != NULL)
{
i = nodesearch (p, k);
if (i < p->numtrees-1 && k == p->key[i]) //tim thay
{
*pfound = TRUE;
*pposition = i; //vi tri tim thay khoa k
return (p); //node co chua khoa k
}
q = p;
p = p -> Branch[i];
}
/*khi thoat khoi vong lap tren la khong tim thay, luc nay p = NULL, q la node la co the them khoa k vao node nay,
position la vi tri co the chen khoa k*/
*pfound = FALSE;
*pposition = i;
return (q); //tra ve node la 9
}
Các phép toán

 Phép duyệt
Duyệt các khóa của B-Cây theo thứ tự từ nhỏ đến lớn bằng phương pháp đệ qui
void traverse (NODEPTR proot)
{
int i;
if (proot == NULL) //dieu kien dung
return;
else //de qui
{
/*vong lap duyet nhanh cay con Branch[i] va in khoa key[i] cua node proot*/
for (i = 0; i < proot -> numtrees-1; i++)
{
traverse (proot -> Branch[i]);
printf (“%8d”, proot -> key[i]);
}
//duyet nhanh cay con cuoi cung cua node proot
traverse (proot -> Branch[proot -> numtrees-1]);
} 10
}
THANKS!

11

You might also like