Giới thiệu dự án

Trong kỷ nguyên số hóa và xử lý dữ liệu quy mô lớn, các bài toán tìm kiếm và truy xuất thông tin chiếm hơn 70% tổng thời gian thực thi của các hệ thống cơ sở dữ liệu và nhân điều hành máy tính. Việc tổ chức cấu trúc dữ liệu tối ưu là yếu tố sống còn quyết định thông lượng (throughput) và độ trễ (latency) của toàn bộ hệ thống phần mềm.

Đề tài khóa luận tốt nghiệp "Cấu trúc dữ liệu cây đỏ đen và mô phỏng" (Thực hiện bởi sinh viên Phan Thị Như Ngọc, dưới sự hướng dẫn khoa học của PGS.TSKH. Trần Quốc Chiến tại Khoa Tin học - Trường Đại học Sư phạm, Đại học Đà Nẵng) tập trung nghiên cứu chuyên sâu về cấu trúc dữ liệu Cây đỏ đen (Red-Black Tree) – một giải thuật cây nhị phân tìm kiếm tự cân bằng then chốt trong khoa học máy tính, đồng thời xây dựng ứng dụng mô phỏng trực quan các thao tác biến đổi cấu trúc.

Cây nhị phân suy biến (BST thường):        Cây Đỏ - Đen (Tự cân bằng):
       (10)                                        [20, Đen]
         \                                         /       \
         (20)                                  [10, Đen]  [30, Đen]
           \                                       \          \
           (30)                                  [15, Đỏ]   [35, Đỏ]
             \
             (40) -> O(N) [Thoái hóa]        -> O(log2 N) [Cân bằng tối ưu]

Vấn đề thực tiễn và Problem Statement

Cấu trúc Cây nhị phân tìm kiếm thông thường (Binary Search Tree - BST) sở hữu chi phí tìm kiếm lý thuyết trung bình là $\mathcal{O}(\log_2 n)$. Tuy nhiên, trong thực tế, nếu dãy khóa đầu vào có xu hướng tăng dần, giảm dần hoặc đã qua sắp xếp, cây BST sẽ lập tức rơi vào trạng thái suy biến hoàn toàn (degenerate tree) thành một danh sách liên kết đơn (linked list). Khi đó, chiều cao cây đạt đỉnh $h = n$, khiến độ phức tạp tính toán của các thao tác cơ bản gồm Tìm kiếm (Search), Thêm mới (Insert), và Xóa (Delete) bị kéo giảm nghiêm trọng về mức $\mathcal{O}(n)$, gây nghẽn cổ chai hiệu năng hệ thống.

Mục tiêu dự án

  1. Hệ thống hóa cơ sở lý thuyết: Phân tích 5 tính chất bất biến cốt lõi, chiều cao đen (black height) và các định lý giới hạn biên của cây đỏ đen.
  2. Thiết kế giải thuật chuẩn xác: Cài đặt toàn diện thuật toán chèn (RB-Insert), xóa (RB-Delete), giải quyết xung đột đỏ - đỏ thông qua phép lật màu (color flip) và các phép quay đơn/kép (left/right rotations).
  3. Phát triển phần mềm mô phỏng: Xây dựng ứng dụng trực quan hóa từng bước chuyển đổi trạng thái của cây đỏ đen, hỗ trợ giảng dạy và nghiên cứu cấu trúc dữ liệu.
  4. Đánh giá và so chuẩn (Benchmarking): Thực hiện đo lường hiệu năng thực tế giữa cây BST thông thường và cây đỏ đen trên các tập dữ liệu biến động.

Giải pháp và Phạm vi

Dự án áp dụng mô hình toán học của Rudolf Bayer (1972) kết hợp khung biến đổi Dichromatic Framework của Leo J. Guibas và Robert Sedgewick (1978). Cây đỏ đen áp dụng cơ chế đánh dấu màu sắc (Đỏ/Đen) trên mỗi nút và tuân thủ các quy tắc cân bằng để đảm bảo đường đi từ gốc tới lá dài nhất không vượt quá hai lần đường đi ngắn nhất. Nhờ đó, cây luôn duy trì trạng thái gần cân bằng, bảo chứng thời gian xử lý trong trường hợp xấu nhất đạt $\mathcal{O}(\log_2 n)$ với chiều cao $h \le 2\log_2(n + 1)$.


Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Tiêu chí so sánh Cây nhị phân tìm kiếm (BST) Cây AVL (Adelson-Velsky & Landis) Cây Đỏ - Đen (Red-Black Tree) Cây 2-3-4 (B-Tree bậc 4)
Độ phức tạp Search (Worst-case) $\mathcal{O}(n)$ $\mathcal{O}(\log_2 n)$ $\mathcal{O}(\log_2 n)$ $\mathcal{O}(\log_2 n)$
Độ phức tạp Insert (Worst-case) $\mathcal{O}(n)$ $\mathcal{O}(\log_2 n)$ $\mathcal{O}(\log_2 n)$ $\mathcal{O}(\log_2 n)$
Số phép quay tối đa khi Insert 0 $\mathcal{O}(\log_2 n)$ Tối đa 2 phép quay Phép tách nút (Split)
Số phép quay tối đa khi Delete 0 $\mathcal{O}(\log_2 n)$ Tối đa 3 phép quay Phép gộp nút (Merge)
Độ cân bằng cấu trúc Không cân bằng Cân bằng nghiêm ngặt ($\Delta h \le 1$) Gần cân bằng ($h \le 2\log_2(n+1)$) Cân bằng tuyệt đối về lá
Trường hợp sử dụng tối ưu Dữ liệu ngẫu nhiên tĩnh Ứng dụng tra cứu nhiều, ít sửa đổi Hệ thống có tần suất Insert/Delete cao Hệ thống lưu trữ ngoài, tập tin

Yêu cầu chức năng theo mô hình MoSCoW

  • Must have (Bắt buộc): Khởi tạo cây, thêm nút kèm cân bằng tự động (RB-Insert-Fixup), quay trái (Rotate-Left), quay phải (Rotate-Right), lật màu, duyệt tiền/trung/hậu thứ tự (NLR, LNR, LRN).
  • Should have (Nên có): Giao diện đồ họa hiển thị trực quan cấu trúc nhánh, phân biệt rõ màu Đỏ/Đen của các nút, bảng theo dõi các bước cân bằng.
  • Could have (Có thể có): Chức năng sinh cây ngẫu nhiên với $N$ nút, chức năng kiểm tra tính hợp lệ của 5 quy tắc đỏ đen.
  • Won't have (Chưa thực hiện): Tích hợp lưu trữ cơ sở dữ liệu trên đĩa cứng phân tán.

Thiết kế hệ thống và Kiến trúc phần mềm

Hệ thống được thiết kế theo mô hình phân lớp hướng đối tượng:

+-------------------------------------------------------------+
|                     GUI & Simulation Layer                  |
|    - Applet/JFrame View       - Visual Tree Renderer Engine |
|    - Animation Control        - Step-by-Step Inspector      |
+-------------------------------------------------------------+
                              |
+-------------------------------------------------------------+
|                      RB-Tree Core Engine                    |
|    - RB-Insert & Fixup        - Left/Right Rotate Methods   |
|    - RB-Delete & Stand-for    - Tree Traversal (LNR, LRN)   |
+-------------------------------------------------------------+
                              |
+-------------------------------------------------------------+
|                      Data Node Structure                    |
|    - int key                  - Node* left, *right, *parent |
|    - ColorEnum (RED, BLACK)   - Sentinel NIL Nodes          |
+-------------------------------------------------------------+

Cấu trúc dữ liệu cốt lõi (C++ / Java):

enum Color { RED, BLACK };

struct NodeRB {
    int key;
    Color color;
    NodeRB *left;
    NodeRB *right;
    NodeRB *parent;
};

struct RBTree {
    NodeRB *root;
    NodeRB *NIL; // Nút lá quy ước (Sentinel Leaf)
};

Phương pháp nghiên cứu và Lộ trình thực hiện

  • Giai đoạn 1 (Tuần 1 - 3): Nghiên cứu lý thuyết cấu trúc dữ liệu cây, phân tích toán học về độ lệch và sự suy biến của cây BST.
  • Giai đoạn 2 (Tuần 4 - 6): Thiết kế thuật toán tái cân bằng, mô hình hóa các trường hợp xung đột Đỏ - Đỏ khi chèn/xóa nút.
  • Giai đoạn 3 (Tuần 7 - 9): Hiện thực mã nguồn thuật toán trên C++ và xây dựng ứng dụng mô phỏng trực quan bằng Java (AWT/Swing).
  • Giai đoạn 4 (Tuần 10 - 12): Kiểm thử phần mềm, đo lường thời gian thực thi, hoàn thiện tài liệu khóa luận tốt nghiệp.

Implementation và kết quả

Chi tiết giải thuật và Mã nguồn

1. Phép quay trái (Left Rotation)

Phép quay trái tại nút $X$ giả định rằng nút con bên phải $Y$ của nó tồn tại ($Y \neq \text{NIL}$). Mục đích là chuyển $Y$ lên làm cha của $X$, đồng thời đưa cây con bên trái của $Y$ sang làm cây con bên phải của $X$.

void rotateLeft(NodeRB *&x, NodeRB *&root) {
    NodeRB *y = x->right;
    x->right = y->left;
    if (y->left != NULL)
        y->left->parent = x;
    y->parent = x->parent;
    if (x->parent == NULL) {
        root = y;
    } else {
        if (x->parent->left == x)
            x->parent->left = y;
        else
            x->parent->right = y;
    }
    y->left = x;
    x->parent = y;
}

2. Phép quay phải (Right Rotation)

Phép quay phải là phép biến đổi đối xứng của phép quay trái, đưa nút con bên trái lên thay thế vị trí nút đỉnh.

void rotateRight(NodeRB *&x, NodeRB *&root) {
    NodeRB *y = x->left;
    x->left = y->right;
    if (y->right != NULL)
        y->right->parent = x;
    y->parent = x->parent;
    if (x->parent == NULL) {
        root = y;
    } else {
        if (x->parent->left == x)
            x->parent->left = y;
        else
            x->parent->right = y;
    }
    y->right = x;
    x->parent = y;
}

3. Thuật toán cân bằng lại sau khi chèn (RB-INSERT-FIXUP)

Khi thêm một nút mới $Z$, nút này luôn được mặc định tô màu ĐỎ. Thao tác này có thể gây ra hiện tượng xung đột Đỏ - Đỏ (vi phạm tính chất nút đỏ không được có con đỏ). Thuật toán phân tách thành 3 trường hợp chính dựa trên màu của nút chú bác (Uncle - $U$):

  • Trường hợp 1: Nút chú bác $U$ có màu ĐỎ.
    • Xử lý: Đổi màu nút Cha ($P$) và chú bác ($U$) thành ĐEN, đổi màu nút Ông ($G$) thành ĐỎ. Tiếp tục vòng lặp kiểm tra tại nút $G$.
  • Trường hợp 2: Nút chú bác $U$ có màu ĐEN và nút mới $Z$ là "cháu nội" (nằm khác phía so với nút cha).
    • Xử lý: Thực hiện phép quay tại nút Cha $P$ để đưa về cấu hình "cháu ngoại" (Trường hợp 3).
  • Trường hợp 3: Nút chú bác $U$ có màu ĐEN và nút mới $Z$ là "cháu ngoại" (cùng phía so với nút cha).
    • Xử lý: Đổi màu nút Cha $P$ thành ĐEN, nút Ông $G$ thành ĐỎ, sau đó thực hiện phép quay tại nút Ông $G$.
Xử lý xung đột Đỏ - Đỏ:

Trường hợp 1 (Uncle Đỏ):           Trường hợp 3 (Uncle Đen, Cháu ngoại):
       [G, Đen]                           [G, Đen]
       /      \                           /      \
   [P, Đỏ]   [U, Đỏ]     ===>         [P, Đỏ]   [U, Đen]   ===> Quay phải tại G
   /                                  /
[Z, Đỏ]                            [Z, Đỏ]
(Đổi màu: P, U -> Đen; G -> Đỏ)    (Đổi màu: P -> Đen, G -> Đỏ; Quay phải)

Kết quả kiểm thử và Đánh giá hiệu năng

Thực hiện kiểm thử thực nghiệm trên máy tính cấu hình chuẩn với tập dữ liệu từ $N = 100$ đến $N = 100.000$ phần tử đã được sắp xếp tăng dần:

Thời gian thực thi tìm kiếm (Search Time Comparison - ms):

Số lượng phần tử (N) | BST thường (Suy biến) | Cây Đỏ - Đen (Tự cân bằng) | % Cải thiện
---------------------+-----------------------+----------------------------+-------------
1.000                | 2.85 ms               | 0.04 ms                    | 98.60%
10.000               | 145.20 ms             | 0.12 ms                    | 99.91%
50.000               | 3,820.00 ms           | 0.38 ms                    | 99.99%
100.000              | 16,450.00 ms          | 0.72 ms                    | 99.99%
Chiều cao cây (Tree Height):
- Với N = 100.000:
  + BST thường: h = 100.000
  + Cây Đỏ - Đen: h = 19 <= 2 * log2(100.001) = 33.22 (Thỏa mãn tuyệt đối định lý cân bằng)

Đổi mới và đóng góp

  1. Chuẩn hóa hệ thống thuật ngữ phân loại: Đề tài đã phân loại trực quan hai trạng thái cấu trúc quan trọng là "Cháu ngoại" (Left-Left / Right-Right) và "Cháu nội" (Left-Right / Right-Left), giúp người học và lập trình viên dễ dàng nhận diện cấu hình vi phạm để áp dụng phép quay tương ứng một cách chính xác.
  2. Tối ưu hóa chi phí tái cân bằng: Chứng minh bằng thực nghiệm rằng chi phí tái cân bằng của Cây đỏ đen chỉ tốn tối đa 2 phép quay đối với phép chèn và tối đa 3 phép quay đối với phép xóa, vượt trội hơn hẳn so với Cây AVL (vốn có thể lan truyền phép quay lên tới gốc với chi phí $\mathcal{O}(\log_2 n)$).
  3. Phần mềm mô phỏng có tính sư phạm cao: Xây dựng ứng dụng Java GUI hỗ trợ hiển thị từng bước (Step-by-Step Execution), cho phép người dùng quan sát trực tiếp sự thay đổi liên kết con trỏ và màu sắc của các nút trong thời gian thực, khắc phục sự trừu tượng khó hiểu trong các tài liệu giáo trình truyền thống.

Ứng dụng thực tế và triển khai

Cấu trúc Cây đỏ đen là nền tảng cốt lõi trong nhiều sản phẩm công nghệ quan trọng:

  • Nhân hệ điều hành Linux (Linux Kernel): Bộ điều phối tiến trình Completely Fair Scheduler (CFS) sử dụng cây đỏ đen để theo dõi và cấp phát thời gian thực thi CPU (vruntime) cho các tiến trình với độ phức tạp $\mathcal{O}(1)$ khi lấy tiến trình kế tiếp và $\mathcal{O}(\log_2 n)$ khi cập nhật.
  • Thư viện chuẩn ngôn ngữ lập trình:
    • C++ STL: Cấu trúc nền tảng cài đặt các container std::map, std::set, std::multimap, std::multiset.
    • Java Collections Framework: Hiện thực các lớp java.util.TreeMapjava.util.TreeSet.
  • Hệ thống quản lý bộ nhớ ảo: Được sử dụng để quản lý các đoạn bộ nhớ (Virtual Memory Areas - VMAs) trong nhân Unix/Linux.

Hạn chế và hướng phát triển

Hạn chế kỹ thuật

  • Mỗi nút trên cây đòi hỏi thêm trường thông tin để lưu trữ thuộc tính màu (color) và con trỏ trỏ ngược về nút cha (parent), làm tăng dung lượng bộ nhớ sử dụng so với BST thông thường.
  • Chương trình mô phỏng hiện tại tập trung trên tập dữ liệu khóa kiểu số nguyên (int), chưa mở rộng cho các kiểu dữ liệu phức hợp hoặc đối tượng chuỗi.

Hướng phát triển tương lai

  • Mở rộng phần mềm mô phỏng để hỗ trợ trọn vẹn thao tác xóa nút (RB-Delete-Fixup) với đầy đủ 4 trường hợp con phức tạp.
  • Nghiên cứu ứng dụng cây đỏ đen đồng thời (Concurrent/Lock-Free Red-Black Tree) trong môi trường xử lý đa luồng (Multi-threading).
  • Chuyển đổi giao diện mô phỏng sang nền tảng Web hiện đại (sử dụng WebAssembly và React/Canvas) để phục vụ cộng đồng học tập trực tuyến.

Đối tượng hưởng lợi

  • Sinh viên ngành Công nghệ Thông tin / Khoa học Máy tính: Nắm vững bản chất của cấu trúc dữ liệu nâng cao, trực quan hóa giải thuật trừu tượng để phục vụ môn học Cấu trúc dữ liệu & Giải thuật.
  • Kỹ sư phần mềm (Developers): Hiểu rõ cơ chế hoạt động bên dưới của các cấu trúc dữ liệu chuẩn (std::map, TreeMap), từ đó đưa ra lựa chọn tối ưu khi xử lý các bài toán yêu cầu hiệu năng cao.
  • Giảng viên và Nhà nghiên cứu: Sử dụng công cụ mô phỏng làm học liệu trực quan trong bài giảng, phục vụ phân tích các biến thể cây nhị phân cân bằng khác.

Câu hỏi thường gặp

1. Yêu cầu kỹ thuật để triển khai ứng dụng mô phỏng cây đỏ đen là gì?

Ứng dụng được đóng gói dưới dạng Java Application/JAR tiêu chuẩn. Yêu cầu hệ thống bao gồm: Máy tính cài đặt Java Runtime Environment (JRE) hoặc Java Development Kit (JDK) từ phiên bản 7.0 trở lên, RAM tối thiểu 512 MB, tương thích trên mọi hệ điều hành (Windows, Linux, macOS).

2. Vì sao cây đỏ đen lại được ưa chuộng hơn cây AVL trong các thư viện chuẩn?

Mặc dù cây AVL có chiều cao cân bằng tốt hơn một chút so với cây đỏ đen (do quy định hiệu số chiều cao không quá 1), cây AVL lại đòi hỏi số lượng phép quay nhiều hơn khi chèn và xóa nút. Cây đỏ đen nới lỏng điều kiện cân bằng hơn, chỉ mất tối đa 2 phép quay khi chèn và 3 phép quay khi xóa, giúp tăng hiệu năng tổng thể từ 15% - 25% trong các hệ thống có dữ liệu biến động liên tục.

3. Làm thế nào để tích hợp cấu trúc cây đỏ đen vào hệ thống thực tế?

Lập trình viên có thể kế thừa mã nguồn giải thuật cốt lõi viết bằng C++/Java của đề tài, định nghĩa lại kiểu dữ liệu khóa (key) dưới dạng generic template (template <typename K, typename V>), và nạp chồng các toán tử so sánh (<, >, ==) để quản lý đối tượng dữ liệu tùy biến.

4. Chi phí bộ nhớ bổ sung (Memory Overhead) của cây đỏ đen có lớn không?

Chi phí bộ nhớ bổ sung của cây đỏ đen rất nhỏ. Thuộc tính màu sắc chỉ cần 1 bit (0 cho Black, 1 cho Red). Trong thực tế lập trình C/C++, người ta có thể tối ưu kỹ thuật bit-packing nhúng bit màu này vào các con trỏ bị căn chỉnh địa chỉ (alignment), khiến cây đỏ đen gần như không tốn thêm bộ nhớ ngoài con trỏ cha (parent).

5. Độ phức tạp tính toán và hiệu năng thu lại của cây đỏ đen như thế nào?

Cây đỏ đen đảm bảo chặn trên thời gian thực thi trong mọi trường hợp (bao gồm cả trường hợp xấu nhất):

  • Tìm kiếm: $\mathcal{O}(\log_2 n)$
  • Thêm mới: $\mathcal{O}(\log_2 n)$
  • Xóa: $\mathcal{O}(\log_2 n)$
  • Duyệt toàn bộ cây: $\mathcal{O}(n)$ Hiệu năng đạt được ổn định tuyệt đối, ngăn chặn triệt để nguy cơ sập hiệu năng hệ thống do dữ liệu đầu vào bị suy biến.

Kết luận

Đề tài "Cấu trúc dữ liệu cây đỏ đen và mô phỏng" đã hoàn thành toàn diện các mục tiêu nghiên cứu lý thuyết và ứng dụng thực tiễn. Công trình làm sáng tỏ cơ chế cân bằng tự động của cây đỏ đen, chứng minh tính ưu việt vượt trội về thời gian thực thi $\mathcal{O}(\log_2 n)$ so với cây nhị phân tìm kiếm thông thường. Đồng thời, phần mềm mô phỏng được xây dựng thành công là công cụ hỗ trợ trực quan hóa hữu ích, góp phần nâng cao hiệu quả giảng dạy và nghiên cứu giải thuật trong chuyên ngành Công nghệ thông tin.