You are on page 1of 6

Input cho cây đỏ đen bao gồm :

 Dữ liệu: Số liệu được chèn vào cây để quản lý.


 Trạng thái: Cho biết dữ liệu là từ người dùng hay trạng thái hiện tại của quá trình xử lý.
 Ưu tiên: Phân loại mức độ ưu tiên cao hay thấp của dữ liệu.

Quá trình chèn dữ liệu vào cây đỏ đen :

 Xác định dựa vào ưu tiên và trạng thái, dữ liệu sẽ được chèn vào nút đỏ hay đen.
 Nếu đã đầy ở nút hiện tại, dữ liệu sẽ được chuyển lên nút cha.
 Cây sẽ duy trì sự cân bằng bằng cách luân chuyển dữ liệu xuống các nút con.

Các output chính của cây đỏ đen bao gồm :


 Tìm kiếm dữ liệu: Cho phép tìm kiếm dữ liệu dựa trên khóa bằng thuật toán truy vết cây.
Độ phức tạp thời gian là O(h) với h là độ cao của cây.
 Chèn dữ liệu mới: Cho phép chèn dữ liệu mới vào cây và duy trì các tính chất của cây đỏ
đen bằng cách rotate và recolor các nút. Độ phức tạp thời gian là O(log(n)) với n là số
nút.
 Xóa dữ liệu: Cho phép xóa dữ liệu khỏi cây và duy trì các tính chất của cây đỏ đen bằng
cách merge, rotate và recolor các nút. Độ phức tạp thời gian là O(log(n)).
 Duyệt cây: Cho phép duyệt các nút trong cây theo thứ tự trước hoặc thứ tự sau. Độ phức
tạp thời gian là O(n).

Những output này cho phép thực hiện các thao tác cơ bản trên cây đỏ đen như tìm kiếm, chèn,
xóa và truy xuất dữ liệu hiệu quả. Cây đỏ đen cũng duy trì sự cân bằng tốt sau các thao tác nhờ
các rotate và recolor.

Đặc biệt, output như tìm kiếm, chèn, xóa có độ phức tạp thời gian logarit cho phép cây đỏ đen
hoạt động hiệu quả cho các bài toán yêu cầu thao tác trên dữ liệu lớn.

2. Ví dụ :
<aside> 💡 Cây trong hình 0 là cây đỏ đen, trong đó các đỉnh tô đen là đỉnh đen, các đỉnh không
tô là đỉnh đỏ.

</aside>

<aside> 💡 Các đỉnh không đầy đủ là B, D, E, F, G, đường đi từ gốc tới các đỉnh này đều có số
đỉnh đen là 2.

</aside>
Hình 0. Một cây đỏ đen

3. Ứng dụng :
 Cơ sở dữ liệu: Cây đỏ đen được sử dụng trong các hệ quản trị cơ sở dữ liệu quan hệ
(RDBMS) để lưu trữ dữ liệu. Ví dụ: SQL Server, MySQL, Oracle,… sử dụng cấu trúc dữ
liệu này.
 Hệ điều hành: Cây đỏ đen được dùng trong các hệ điều hành để quản lý bộ nhớ. Ví dụ:
Linux sử dụng cấu trúc này để theo dõi các phân vùng bộ nhớ ảo.
 Mã hóa dữ liệu: Cây đỏ đen thường được sử dụng trong các thuật toán mã hóa dữ liệu. Ví
dụ: thuật toán Huffman coding sử dụng cấu trúc cây đỏ đen.
 Ứng dụng Web: Cây đỏ đen được sử dụng trong các ứng dụng web để lưu trữ dữ liệu có
cấu trúc phân cấp. Ví dụ: lưu danh mục sản phẩm trong website bán hàng.
 AI: Cây đỏ đen được sử dụng trong một số thuật toán trí tuệ nhân tạo. Ví dụ: thuật toán
học máy Decision Tree sử dụng cấu trúc cây đỏ đen.

Thuật toán nén Huffman Coding


1. Tính tần suất xuất hiện của mỗi ký tự trong văn bản.
2. Tạo một lá cho mỗi ký tự, giá trị của lá là tần suất xuất hiện của ký tự đó.
3. Chọn 2 lá có giá trị nhỏ nhất. Nối chúng thành một nhánh, giá trị của nhánh là tổng giá trị
của 2 lá.
4. Thêm nhánh vừa tạo vào cây và xóa 2 lá vừa chọn ở bước 3.
5. Lặp lại bước 3 và 4 cho đến khi cây chỉ còn lại một nhánh. Nhánh này chính là gốc của
cây Huffman.
6. Gán mã cho từng ký tự dựa trên đường đi từ gốc đến lá chứa ký tự đó. Quy tắc đi xuống
bên trái là 0, bên phải là 1.
7. Áp dụng các mã Huffman để nén văn bản bằng cách thay thế mỗi ký tự bằng mã của nó.

Cài đặt
// Huffman tree node
struct MinHeapNode {

// One of the input characters


char data;

// Frequency of the character


unsigned freq;

// Left and right child


MinHeapNode *left, *right;

MinHeapNode(char data, unsigned freq)


{
left = right = NULL;
this->data = data;
this->freq = freq;
}
};

// For comparison of two heap nodes (needed in min heap)


struct compare {
bool operator()(MinHeapNode* l, MinHeapNode* r)
{
return (l->freq > r->freq);
}
};

// Prints huffman codes from the root of Huffman Tree.


void printCodes(struct MinHeapNode* root, string str)
{
if (!root)
return;

if (root->data != '$')
cout << root->data << ": " << str << "\\n";

printCodes(root->left, str + "0");


printCodes(root->right, str + "1");
}

// The main function that builds a Huffman Tree and print codes by traversing
the built Huffman Tree
void HuffmanCodes(char data[], int freq[], int size)
{
struct MinHeapNode *left, *right, *top;

// Create a min heap & inserts all characters of data[]


priority_queue<MinHeapNode*, vector<MinHeapNode*>, compare> minHeap;

for (int i = 0; i < size; ++i)


minHeap.push(new MinHeapNode(data[i], freq[i]));

// Iterate while size of heap doesn't become 1


while (minHeap.size() != 1) {

// Extract the two minimum frequency items from min heap


left = minHeap.top();
minHeap.pop();

right = minHeap.top();
minHeap.pop();

/* Create a new internal node with frequency equal to the sum


of the
two nodes frequencies. Make the two extracted node as left
and right children
of this new node. Add this node to the min heap '$' is a
special value
for internal nodes, not used
*/
top = new MinHeapNode('$', left->freq + right->freq);

top->left = left;
top->right = right;

minHeap.push(top);
}

// Print Huffman codes using the Huffman tree built above


printCodes(minHeap.top(), "");
}

4. Các tích chất của bài toán :


Trong cây đỏ đen, các đỉnh của cây sẽ được sơn đỏ hoặc đen, và áp đặt các điều kiện về màu
của các đỉnh nhằm hạn chế sự chênh lệch nhiều về số đỉnh giữa hai nhánh của mọi đỉnh. Cây đỏ
đen cũng cho phép ta thực hiện các phép toán tập động trong thời gian O(logN).

Trong cây nhị phân một đỉnh được xem là đỉnh không đầy đủ, nếu nó có ít hơn 2 đỉnh con (tức
là nó là đỉnh lá hoặc chỉ có một đỉnh con trái hoặc con phải)

Định nghĩa 1:
<aside> 💡 Cây đỏ đen là cây tìm kiếm nhị phân (BST), các đỉnh của cây được sơn đỏ hoặc
đen và thỏa mãn các điều kiện sau:

</aside>

1. Luật đỏ: Nếu một đỉnh được sơn đỏ thì các đỉnh con (nếu có) của nó được sơn đen.
2. Luật đường: Mọi đường đi từ gốc tới đỉnh không đầy đủ có cùng số đỉnh đen.

Từ định nghĩa trên, suy ra một số tính chất sau đây của cây đỏ đen:

 Mọi đường đi từ một đỉnh bất kỳ tới đỉnh không đầy đủ có cùng số đỉnh đen ⇒ cây con
của cây đỏ đen là cây đỏ đen.
 Nếu một đỉnh không đầy đủ là lá thì nó có thể được sơn đỏ hoặc đen. Nhưng nếu một
đỉnh không đầy đủ có một con thì nó phải được sơn đen và con của nó phải được sơn đỏ.
 Nếu một đỉnh được sơn đỏ thì các đỉnh con (nếu có) và đỉnh cha (nếu có) của nó phải
được sơn đen.

Định nghĩa 2:
<aside> 💡 Cây đỏ đen n đỉnh có độ cao lớn nhất là 2log(n+1).

</aside>
Số đỉnh đen trên đường đi từ đỉnh v, không kể đỉnh v, đến đỉnh không đầy đủ được gọi là độ cao
đen của đỉnh v và được ký hiệu là bh(v).

Chứng minh:

 Trước hết ta chứng minh bằng quy nạp rằng, cây con gốc v chứa ít nhất $2^{bh(v)} - 1$
đỉnh.
 Thật vậy, nếu v là đỉnh không đầy đủ, từ nhận xét sau định nghĩa cây đỏ đen ta có bh(v) =
0, và do đó $2^{bh(v)} – 1 = 2^0 - 1 = 0$.
 Khẳng định đương nhiên được thoả mãn. Bây giờ giả sử v có đầy đủ cả hai con, u là đỉnh
con của v và khẳng định đã đúng cho cây con gốc u. Rõ ràng là, nếu u là đỉnh đỏ thì bh(u)
= bh(v), còn nếu u là đen thì bh(u) = bh(v) – 1.
 Theo giả thiết quy nạp, cây con gốc v chứa ít nhất $2(2^{bh(u)} - 1) + 1$ đỉnh.
 Thay bh(u) = bh(v) – 1, ta có cây con gốc v chứa ít nhất $2(2^{bh(v)-1} - 1) + 1 =
2^{bh(v)} - 1$ đỉnh. Mặt khác, từ luật đỏ ta suy ra rằng, có ít nhất một nửa số đỉnh trên
đường đi từ gốc tới đỉnh không đầy đủ là đen.
 Do đó, nếu cây đỏ - đen có độ cao h thì độ cao đen của gốc ít nhất là h / 2.
 Vậy nếu cây đỏ - đen có n đỉnh thì: n ≥ $2^{h/2}$ – 1 hay h ≤ 2log(n+1).

5. Ý tưởng thuật toán :


Phép toán xen (Insertion) :
 Giả sử chúng ta cần xen vào cây đỏ - đen một đỉnh mới v chứa dữ liệu là d.
 Đầu tiên ta áp dụng thuật toán xen vào cây tìm kiếm nhị phân để xen vào cây đỏ - đen
đỉnh v và sơn đỏ đỉnh v ⇒ luật đường vẫn được thoả mãn.
 Nếu ta xen vào cây rỗng, thì cây trở thành cây chỉ có một đỉnh gốc v và đương nhiên cả
hai luật đỏ và luật đường đều được thoả mãn.
 Giả sử đỉnh v được xen vào cây không rỗng, và cha của v là đỉnh p.
 Nếu p là đen, thì cây vẫn còn là cây đỏ - đen. Nhưng nếu p là đỏ thì luật đỏ bị vi phạm.
 Trường hợp p là gốc cây, ta chỉ cần sơn lại p thành đen. Nếu p không phải là gốc cây, ta
giả sử đỉnh cha của p là đỉnh g. Vì p là đỏ, nên g phải là đen.

<aside> 💡 Chúng ta có ví dụ, chẳng hạn như sau:

</aside>

Đây là một trong các tình huống vi phạm luật đỏ: đỉnh p là con trái của g.

Sau đây chúng ta sẽ xét từng tình huống mà luật đỏ bị vi phạm (đỉnh p đỏ và đỉnh con nó là
v cũng đỏ) và các phép biến đổi cây nhằm khôi phục lại luật đỏ đồng thời vẫn bảo tồn luật
đường.
Xét trường hợp đỉnh p là con trái của g. Khi p và v là hai đỉnh cha – con cùng
được sơn đỏ và p là con trái của g, chúng ta có ba mẫu biến đổi bằng các phép
quay và sơn lại nhằm làm cho cây con gốc g trở thành cây đỏ - đen.

 Mẫu 1. Đỉnh g có con phải là đỉnh u được sơn đỏ. Trường hợp này ta chỉ cần sơn lại: sơn
p, u đen và sơn g đỏ ( xem hình 1 ).

You might also like