Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 16

Giớ i thiệ u B-trees

Mộ t trong nhữ ng cấ u trú c dữ liệ u đượ c sử dụ ng nhiề u nhấ t trong khoa họ c má y tính là
tree. Điề u nà y đã dẫ n đế n nhiề u phiê n bả n khá c nhau đượ c phá t triể n. Dướ i đâ y, chú ng
ta sẽ là m quen tố t hơn vớ i cá i gọ i là B-Tree. Để là m như vậ y, trướ c tiê n chú ng ta sẽ hiể u
cá c phầ n khá c nhau củ a nó và cấ u trú c củ a nó . Sau đó , chú ng ta sẽ xem cá ch chú ng ta có
thể thự c hiệ n cá c thao tá c khá c nhau trê n chú ng, tứ c là tìm kiế m, chè n và xó a. Cuố i
cù ng, chú ng tô i sẽ kế t thú c bằ ng phầ n giả i thích về ưu và nhượ c điể m củ a việ c sử dụ ng
B-tree để lưu trữ dữ liệ u.
1. Lý Thuyế t về B-tree
B-Tree đượ c gọ i là tree câ n bằ ng, nghĩa là tấ t cả cá c đườ ng dẫ n từ gố c đế n lá đề u có
cù ng độ dà i. Nó có thể đượ c chia thà nh ba phầ n: gố c, (cá c) lớ p trung gian và lá . Chú ng
ta có thể hình dung nó :

Trong trườ ng hợ p củ a chú ng tô i, chú ng tô i giả sử rằ ng số phầ n tử tố i đa trong mộ t nú t


là 3. Điề u đó cũ ng có nghĩa là nó có thể có tố i đa 4 phầ n tử con. Chú ng ta hã y xem xé t
cá c trườ ng hợ p khá c nhau:
Nế u mộ t nú t chứ a mộ t phầ n tử dữ liệ u, thì Val có hai tree con là trá i và phả i.
Nế u mộ t nú t chứ a hai phầ n tử dữ liệ u leftVal và rightVal, thì nó có ba tree con là trá i,
giữ a và phả i.
Nế u nó chứ a ba phầ n tử dữ liệ u, tứ c là leftVal, middleVal và rightVal, thì nó có thể có
bố n tree con; left, middleLeft, middleRight và right.
Chú ng ta có thể thử minh họ a cá c trườ ng hợ p khá c nhau:

Chú ng tô i cũ ng giả sử rằ ng tree củ a chú ng tô i đã đượ c sắ p xế p và do đó , chú ng tô i sẽ


nhậ n đượ c thứ tự sau trong B-Tree củ a mình

Bâ y giờ chú ng ta đã hiể u cá c quy tắ c vố n có trong B-Tree củ a mình và chú ng ta có thể


thử lấ y mộ t ví dụ đầ y đủ về mộ t quy tắ c:
Chú ng ta có thể thấ y rằ ng tấ t cả cá c quy tắ c đề u đượ c tô n trọ ng trong tree củ a chú ng ta
— mọ i thứ ở bê n phả i củ a gố c đề u lớ n hơn 100. Mọ i thứ ở bê n trá i củ a gố c đề u nhỏ hơn
100.
 
2. Tìm kiế m trong B-Tree
Tìm kiế m trong B-Tree là mộ t thử thá ch rấ t đơn giả n. Đố i vớ i hoạ t độ ng tìm kiế m, chú ng
tô i có ba trườ ng hợ p cơ sở khá c nhau để giú p kế t thú c tìm kiế m nế u cầ n:
Trườ ng hợ p cơ sở : Để giú p chấ m dứ t tìm kiế m
Nế u tree trố ng, trả về False, vì khô ng tìm thấ y gì
Nế u nú t hiệ n tạ i bằ ng vớ i khó a, hã y trả về True. Chú ng tô i đã tìm thấ y nó .
Nế u chú ng ta đế n nú t lá và nó khô ng chứ a giá trị đượ c yê u cầ u, hã y trả về False.
Cá c cuộ c gọ i đệ quy: Cá c cuộ c gọ i đệ quy để duyệ t qua tree. Cá c trườ ng hợ p cũ ng phụ
thuộ c và o số lượ ng phầ n tử dữ liệ u chú ng ta có trong mộ t nú t. Hã y tưở ng tượ ng rằ ng
chú ng ta đang là m việ c vớ i mộ t tree đầ y đủ , do đó mỗ i nú t chứ a 3 phầ n tử dữ liệ u. Sau
đó , chú ng tô i sẽ có :
Nế u K < currentNode.leftVal, chú ng tô i khá m phá tree con bê n trá i củ a nú t hiệ n tạ i.
Khá c nế u currentNode.leftVal < K < currentNode.MiddleLeftVal, chú ng ta khá m phá tree
con ở giữ a bê n trá i củ a nú t hiệ n tạ i.
Khá c nế u currentNode.MiddleLeftVal < K < currentNode.MiddleRightVal, chú ng ta khá m
phá tree con ở giữ a bê n phả i củ a nú t hiệ n tạ i.
Khá c nế u currentNode.MiddleRightVal > K, chú ng tô i khá m phá tree con bê n phả i củ a
nú t hiệ n tạ i.
Đâ y là tấ t cả nhữ ng gì rấ t lý thuyế t, vì vậ y chú ng ta hã y lấ y mộ t ví dụ thự c tế để minh
họ a quá trình nà y. Hã y tưở ng tượ ng rằ ng chú ng ta có ví dụ từ trướ c:
3. Chè n và o B-Tree
Việ c chè n luô n diễ n ra tạ i cá c nú t lá — Do đó , chú ng tô i thự c hiệ n thao tá c tìm kiế m
trê n tree cho đế n khi chú ng tô i đế n nú t lá . Sau đó , chú ng tô i có ba trườ ng hợ p khá c
nhau:
Mộ t phầ n tử dữ liệ u duy nhấ t: Chú ng tô i chỉ cầ n chè n và bâ y giờ nú t chứ a 2 phầ n tử . Nó
cũ ng có ba con trỏ có thể tớ i tree con. Chú ng ta có thể minh họ a:

Hai phầ n tử dữ liệ u: Chú ng tô i chỉ cầ n chè n và bâ y giờ nú t chứ a 3 phầ n tử . Nó cũ ng có


bố n con trỏ có thể tớ i cá c tree con. Chú ng ta có thể minh họ a:

Ba phầ n tử dữ liệ u: Nú t củ a chú ng tô i đã bao gồ m ba phầ n tử dữ liệ u — sau đó chú ng


tô i khô ng thể chỉ cầ n chè n. Nú t đã đầ y! Trong trườ ng hợ p nà y, chú ng tô i chia nú t tá ch
thà nh cá c nú t có số lượ ng khó a nhỏ hơn và chè n nú t mớ i và o nú t con thích hợ p. Chú ng
ta có thể minh họ a:

Đô i khi, quá trình chia tá ch có thể đi đế n nú t gố c. Điề u nà y xả y ra khi tấ t cả cá c nú t trê n


đườ ng dẫ n từ nú t gố c đế n nú t lá là cá c nú t có 3 phầ n tử dữ liệ u trong đó . Khi nú t gố c
tá ch ra, nó sẽ tă ng chiề u cao củ a tree lê n 1.
4. Xây dự ng B-Tree
Bâ y giờ chú ng ta đã biế t cá ch chè n và o cá c trườ ng hợ p khá c nhau, chú ng ta có thể xâ y
dự ng B-Tree từ dướ i lê n. Nó khô ng gì khá c hơn là tuâ n theo cá c quy tắ c như đã trình
bà y ở trê n. Chú ng ta hã y thử minh họ a việ c xâ y dự ng mộ t cá i tree nhỏ :

 
5. Xó a trong B-Tree
Xó a trong B-Tree phứ c tạ p hơn nhiề u so vớ i chè n. Tù y thuộ c và o vị trí củ a nú t chứ a đích
cầ n xó a, chú ng ta cầ n xem xé t mộ t số trườ ng hợ p. Ta có thể xé t cá c trườ ng hợ p sau:
Trường hợp 1 — x nằ m trong nú t lá
Điề u nà y có thê m hai trườ ng hợ p
Trường hợp 1.1 — nú t có 2 hoặ c 3 phầ n tử dữ liệ u:
Xó a x. Nế u nú t có 2 phầ n tử dữ liệ u, thì nó sẽ chỉ chứ a 1. Nế u nó chứ a 3 phầ n tử dữ liệ u,
thì nó sẽ chỉ chứ a 2 phầ n tử sau. Chú ng ta có thể minh họ a:

Trường hợp 1.2 — nú t có 1 phầ n tử dữ liệ u:


Đâ y đượ c gọ i là dò ng chả y ngầ m và chú ng ta sẽ cầ n xem xé t ba trườ ng hợ p khá c:
Trường hợp 1.2.1 — nú t có anh chị em chứ a 2 hoặ c 3 phầ n tử dữ liệ u: Chuyể n đổ i mộ t
nú t chỉ chứ a mộ t phầ n tử dữ liệ u thà nh mộ t nú t có 2 phầ n tử dữ liệ u bằ ng cá ch đá nh
cắ p khó a từ anh chị em củ a nó . Điề u nà y có thể đượ c thự c hiệ n bằ ng cá ch xoay trá i hoặ c
phả i. Nế u anh bê n trá i có 2 hoặ c 3 phầ n tử dữ liệ u thì thự c hiệ n phé p quay trá i. Nế u anh
chị em bê n phả i có 2 hoặ c 3 phầ n tử dữ liệ u, thì thự c hiệ n phé p quay bê n phả i. Chú ng ta
có thể minh họ a:

Trường hợp 1.2.2 — Nế u cha có 2 hoặ c 3 phầ n tử dữ liệ u: Trong trườ ng hợ p nà y,


chú ng tô i tạ o thà nh mộ t nú t có 3 phầ n tử bằ ng cá ch sử dụ ng thao tá c hợ p nhấ t. Chú ng
tô i hợ p nhấ t ba nú t sau: Nú t chú ng tô i muố n xó a, anh chị em bê n trá i hoặ c bê n phả i,
cũ ng chỉ chứ a mộ t phầ n tử duy nhấ t và nú t cha củ a hai nú t nà y. Chú ng ta có thể minh
họ a:
Trường hợp 1.2.3 — cả bố và mẹ cù ng chứ a 1 phầ n tử dữ liệ u: Trườ ng hợ p nà y ít gặ p.
Trong trườ ng hợ p cụ thể nà y, nú t cha phả i là gố c. Cũ ng giố ng như hợ p nhấ t, chú ng tô i
kế t hợ p cả nú t anh chị em và nú t cha để biế n nó thà nh mộ t nú t chứ a 3 thà nh phầ n dữ
liệ u:

Trường hợp 2 - đó là một nút nội bộ


Sau đó , chú ng tô i có thủ tụ c sau đâ y
Tìm tiề n thâ n củ a nú t chứ a phầ n tử mà chú ng ta muố n xó a. Tiề n thâ n là mộ t nú t lá .
Trao đổ i nú t chứ a phầ n tử để xó a vớ i nú t tiề n thâ n củ a nó . Phầ n tử củ a chú ng tô i hiệ n
đang ở trong mộ t nú t lá .
Vì bâ y giờ nó đang ở trong mộ t nú t lá , chú ng ta có thể quay lạ i trườ ng hợ p 1.
6. Triể n khai tìm kiế m trong B-Tree:
#include <stdio.h>
#include <stdlib.h>

#define MAX 3
#define MIN 2

struct B_tree {
  int data[MAX + 1], count;
  struct B_tree *link[MAX + 1];
};

struct B_tree *root;


struct B_tree *create_node(int data, struct B_tree *child) {
  struct B_tree *new_node;
  new_node = (struct B_tree *)malloc(sizeof(struct B_tree));
  new_node->data[1] = data;
  new_node->count = 1;
  new_node->link[0] = root;
  new_node->link[1] = child;
  return new_node;
}

void add_node(int data, int pos, struct B_tree *node,


        struct B_tree *child) {
  int j = node->count;
  while (j > pos) {
    node->data[j + 1] = node->data[j];
    node->link[j + 1] = node->link[j];
    j--;
  }
  node->data[j + 1] = data;
  node->link[j + 1] = child;
  node->count++;
}

void divide_node(int data, int *pdata, int pos, struct B_tree


*node,
        struct B_tree *child, struct B_tree **new_node) {
  int median, j;

  if (pos > MIN)


    median = MIN + 1;
  else
    median = MIN;

  *new_node = (struct B_tree *)malloc(sizeof(struct B_tree));


  j = median + 1;
  while (j <= MAX) {
    (*new_node)->data[j - median] = node->data[j];
    (*new_node)->link[j - median] = node->link[j];
    j++;
  }
  node->count = median;
  (*new_node)->count = MAX - median;

  if (pos <= MIN) {


    add_node(data, pos, node, child);
  } else {
    add_node(data, pos - median, *new_node, child);
  }
  *pdata = node->data[node->count];
  (*new_node)->link[0] = node->link[node->count];
  node->count--;
}

int set_data(int data, int *pdata,


          struct B_tree *node, struct B_tree **child) {
  int pos;
  if (!node) {
    *pdata = data;
    *child = NULL;
    return 1;
  }

  if (data < node->data[1]) {


    pos = 0;
  } else {
    for (pos = node->count;
      (data < node->data[pos] && pos > 1); pos--)
      ;
    if (data == node->data[pos]) {
      printf("Không được phép trùng lặp\n");
      return 0;
    }
  }
  if (set_data(data, pdata, node->link[pos], child)) {
    if (node->count < MAX) {
      add_node(*pdata, pos, node, *child);
    } else {
      divide_node(*pdata, pdata, pos, node, *child, child);
      return 1;
    }
  }
  return 0;
}

void add(int data) {


  int flag, i;
  struct B_tree *child;

  flag = set_data(data, &i, root, &child);


  if (flag)
    root = create_node(i, child);
}

void find_node(int data, int *pos, struct B_tree *nod) {


  if (!nod) {
    return;
  }

  if (data < nod->data[1]) {


    *pos = 0;
  } else {
    for (*pos = nod->count;
      (data < nod->data[*pos] && *pos > 1); (*pos)--)
      ;
    if (data == nod->data[*pos]) {
      printf("Đã tìm thấy %d", data);
      return;
    }
  }
  find_node(data, pos, nod->link[*pos]);

  return;
}

void traverse(struct B_tree *nod) {


  int i;
  if (nod) {
    for (i = 0; i < nod->count; i++) {
      traverse(nod->link[i]);
      printf("%d ", nod->data[i + 1]);
    }
    traverse(nod->link[i]);
  }
}

int main() {
  int data, ch;
  add(6);
  add(8);
  add(10);
  add(13);
  add(15);
  add(19);
  add(14);
  add(18);
  add(23);
  add(25);
  traverse(root);
  printf("\n");
  find_node(18, &ch, root);
}

Kết quả:

6 8 10 13 14 15 18 19 23 25 Đã tìm thấy 18

Độ phứ c tạ p củ a thao tá c tìm kiế m trê n câ y B:


Độ phứ c tạ p về thờ i gian củ a trườ ng hợ p xấ u nhấ t: Θ(log n)
Độ phứ c tạ p thờ i gian củ a trườ ng hợ p trung bình: Θ(log n)
Độ phứ c tạ p về thờ i gian củ a trườ ng hợ p tố t nhấ t: Θ(log n)
Độ phứ c tạ p khô ng gian củ a trườ ng hợ p trung bình: Θ(n)
Độ phứ c tạ p khô ng gian củ a trườ ng hợ p xấ u nhấ t: Θ(n)
7. Tạ i sao chú ng ta nê n sử dụ ng B-Tree?
B-Tree đượ c sử dụ ng để lưu trữ dữ liệ u và mộ t trong nhữ ng đặ c điể m tích cự c lớ n củ a
nó là chiề u cao củ a nó - B-tree là tree bé o. Do đó , chiề u cao củ a B-Tree đượ c giữ ở mứ c
thấ p bằ ng cá ch đặ t cá c khó a tố i đa có thể trong mộ t nú t B-Tree. Vì chiề u cao củ a B-Tree
thấ p nê n chi phí củ a cá c hoạ t độ ng khá c nhau, tứ c là chè n, tìm kiế m và xó a cũ ng đượ c
giữ ở mứ c thấ p. Trong mọ i trườ ng hợ p, chi phí chỉ là O(log n), trong đó n là tổ ng số
phầ n tử trong B-Tree. Tó m lạ i, B-Tree có độ phứ c tạ p thờ i gian thấ p.
8. Ứ ng dụ ng củ a cây B-tree
Dù ng trong cơ sở dữ liệ u và hệ thố ng tệ p. (PostgreSQL, MySQL)
Nó đượ c sử dụ ng trong cơ sở dữ liệ u lớ n để truy cậ p dữ liệ u đượ c lưu trữ trê n đĩa
Tìm kiế m dữ liệ u trong tậ p dữ liệ u có thể đạ t đượ c trong thờ i gian ngắ n hơn đá ng kể
bằ ng cá ch sử dụ ng B-Tree
Vớ i tính nă ng lậ p chỉ mụ c, có thể đạ t đượ c lậ p chỉ mụ c đa cấ p.
Hầ u hế t cá c má y chủ cũ ng sử dụ ng phương phá p B-tree.
Kế t luậ n
B-Tree đượ c sử dụ ng để lưu trữ dữ liệ u và mộ t trong nhữ ng đặ c điể m tích cự c lớ n củ a
nó là chiề u cao củ a nó - B-tree là tree bé o. Do đó , chiề u cao củ a B-Tree đượ c giữ ở mứ c
thấ p bằ ng cá ch đặ t cá c khó a tố i đa có thể trong mộ t nú t B-Tree. Vì chiề u cao củ a B-Tree
thấ p nê n chi phí củ a cá c hoạ t độ ng khá c nhau, tứ c là chè n, tìm kiế m và xó a cũ ng đượ c
giữ ở mứ c thấ p. Trong mọ i trườ ng hợ p, chi phí chỉ là O(log n), trong đó n là tổ ng số
phầ n tử trong B-Tree. Tó m lạ i, B-Tree có độ phứ c tạ p thờ i gian thấ p.

You might also like