AA Tree
Cây AA là một cấu trúc cây cân bằng được sử dụng để lưu trữ và truy xuất dữ liệu có thứ tự một cách hiệu quả. Giáo sư Arne Andersson đã giới thiệu nó trong bài báo "Balanced search trees made simple" năm 1993 với mục đích giảm bớt các trường hợp cần xem xét so với cây Đỏ-Đen. Cây AA có thể thực hiện tìm kiếm, chèn và xóa trong thời gian \(O(\log N)\). Dưới đây là một ví dụ về cây AA.

Cây AA là một biến thể của cây Đỏ-Đen. Khác với cây Đỏ-Đen, các nút đỏ trên cây AA chỉ có thể là nút con bên phải. Điều này khiến cây AA mô phỏng cây 2-3 thay vì cây 2-3-4, từ đó đơn giản hóa đáng kể các thao tác bảo trì. Các thuật toán bảo trì cây Đỏ-Đen cần xem xét bảy trường hợp khác nhau để cân bằng cây một cách chính xác.
Vì nút đỏ chỉ có thể là nút con bên phải, cây AA chỉ cần xem xét hai trường hợp.
Định nghĩa
Cây AA tuân theo các quy tắc giống như cây Đỏ-Đen, nhưng thêm một quy tắc mới, đó là nút đỏ không được xuất hiện dưới dạng con bên trái.
- Mỗi nút có thể là đỏ hoặc đen.
- Nút gốc luôn là màu đen.
- Các nút lá (NULL) luôn là màu đen.
- Hai nút con của một nút đỏ phải là màu đen, nghĩa là không có hai nút đỏ liền kề.
- Mỗi đường đi từ nút gốc đến nút NULL đều có cùng số lượng nút đen.
- Nút đỏ chỉ có thể là nút con bên phải.
Bảo trì cân bằng
Mỗi nút của cây AA duy trì một trường level, tương tự như mỗi nút của cây Đỏ-Đen duy trì một trường màu sắc ("RED" hoặc "BLACK"). Quy định về level thỏa mãn 5 điều kiện sau:
- Level của mỗi nút lá là 1.
- Level của mỗi nút con bên trái bằng level của nút cha trừ đi 1.
- Level của mỗi nút con bên phải bằng level của nút cha hoặc bằng level của nút cha trừ đi 1.
- Level của mỗi nút cháu nội bên phải phải nhỏ hơn nghiêm ngặt level của nút ông nội.
- Mỗi nút có level lớn hơn 1 đều có hai con.

Liên kết ngang (Horizontal Link)
Liên kết trong đó level của nút con bằng level của nút cha được gọi là liên kết ngang, tương tự như liên kết đỏ trong cây Đỏ-Đen. Cho phép liên kết ngang bên phải đơn lẻ, nhưng không cho phép các liên kết ngang bên phải liên tiếp; không cho phép liên kết ngang bên trái. Những hạn chế này chặt chẽ hơn so với cây Đỏ-Đen, do đó quá trình cân bằng cây AA đơn giản hơn nhiều về mặt thuật toán so với cây Đỏ-Đen.

Các thao tác chèn và xóa có thể tạm thời khiến cây AA mất cân bằng (vi phạm tính bất biến của cây AA). Để khôi phục sự cân bằng chỉ cần hai thao tác khác nhau: "skew" (nghiêng) và "split" (phân tách). "Skew" là thực hiện xoay phải một cây con chứa liên kết ngang bên trái để thay thế bằng một cây con chứa liên kết ngang bên phải. "Split" là thực hiện xoay trái và tăng level để thay thế một cây con chứa hai hoặc nhiều liên kết ngang bên phải liên tiếp, biến nó thành một cây con chứa ít liên kết ngang bên phải liên tiếp hơn. Việc triển khai chèn và xóa duy trì cân bằng trở nên đơn giản hơn bằng cách dựa vào các thao tác "skew" và "split" để chỉ sửa đổi cây khi cần thiết, thay vì để người gọi quyết định có thực hiện "skew" hay "split" hay không.
split (Xoay trái)
Xuất hiện chuỗi liên kết ngang liên tiếp hướng sang phải (ba nút liên tiếp bên phải thuộc cùng một level, nút R và nút X đều là nút đỏ).
Lúc này xoay trái nút T, coi các nút nhỏ hơn hoặc bằng level này là một cây con.
- Con bên phải của gốc cây con trở thành gốc cây con mới;
- Gốc cây con ban đầu trở thành con bên trái của gốc cây con mới;
- Level của gốc cây con mới +1.
Triển khai mã giả
skew (Xoay phải)
Xuất hiện chuỗi liên kết ngang hướng sang trái (hai nút liên tiếp bên trái thuộc cùng một level).
Xoay phải nút T, coi các nút nhỏ hơn hoặc bằng level này là một cây con.
- Con bên trái của gốc cây con trở thành gốc cây con mới;
- Gốc cây con ban đầu trở thành con bên phải của gốc cây con mới.
Triển khai mã giả
Thao tác trên cây AA
Bản thân cây AA là một cây tìm kiếm nhị phân, vì vậy thao tác tìm kiếm giống như các cây tìm kiếm nhị phân khác. Các thao tác chèn và xóa tương tự như cây AVL, đầu tiên chèn hoặc xóa khóa (key) trong cây, sau đó quay lui dọc theo đường tìm kiếm về gốc và tái cấu trúc cây trong quá trình này.
Chèn
Triển khai mã giả
Xóa
Quá trình xóa tương tự như các cây cân bằng nhị phân khác, đầu tiên chuyển đổi việc xóa nút nội bộ thành việc xóa nút lá. Phương pháp cụ thể là thay thế nút nội bộ bằng nút tiền nhiệm hoặc nút kế nhiệm gần nhất của nó. Vì tất cả các nút có level lớn hơn 1 của cây AA đều có hai nút con, nút tiền nhiệm hoặc nút kế nhiệm sẽ nằm ở level 1, việc xóa nút ở level 1 đơn giản hơn.
Triển khai mã giả
Hiệu suất
Hiệu suất của cây AA tương đương với hiệu suất của cây Đỏ-Đen. Mặc dù cây AA thực hiện nhiều thao tác xoay hơn cây Đỏ-Đen, nhưng thuật toán của cây AA đơn giản hơn, dẫn đến hiệu suất tương đương. Hiệu suất của cây Đỏ-Đen nhất quán hơn trong các tình huống khác nhau, trong khi cây AA có xu hướng phẳng hơn, điều này giúp cây AA có tốc độ tìm kiếm nhanh hơn một chút.
Tài liệu tham khảo
- AA tree - Wikipedia
- Introduction to AA trees
- AA tree - Visualization
- CMSC 420 Lecture 6: 2-3, Red-black, and AA trees
Last updated on this page:, Update history
Found an error? Want to help improve? Edit this page on GitHub!
Contributors to this page:OI-wiki
All content on this page is provided under the terms of the CC BY-SA 4.0 and SATA license, additional terms may apply