Cây đỏ đen là cây tìm kiếm nhị phân. Nó chỉ là một hương vị của BST có phiên bản ưa thích của các hoạt động insert
và delete
tổ chức lại cây khi chúng chạy để cây không bao giờ bị "dài và xâu chuỗi". Cây càng dài và xâu chuỗi càng lớn, nó càng hoạt động giống như một danh sách liên kết. Trung bình, các hoạt động danh sách liên kết yêu cầu một nửa danh sách được chạm (hoặc toàn bộ danh sách trong trường hợp xấu nhất), do đó thời gian chạy thay đổi tuyến tính (O (n) trong số phần tử n). Khi cây "rậm rạp" hoặc gần như cân bằng, thì hoạt động rẻ hơn nhiều (O (log n)). Các thuật toán màu đỏ-đen đảm bảo rằng cây vẫn rậm rạp.
Để làm cho bê tông này, đây là hai cây lưu trữ các phím A đến G. Bên trái dài và có dây. Lưu ý nó trông giống như một danh sách. Trong trường hợp xấu nhất, phải mất 4 so sánh chính để tìm một phần tử. Cây bên phải là bụi rậm. Nó chỉ cần 3. Ở đây sự khác biệt là nhỏ. Đối với một cây của 1023 yếu tố, cây dây cần 512 so sánh và một trong những bụi rậm chỉ 10. Đây là sức mạnh của log n.
B _D_
/\ / \
A D B F
/\ /\ /\
C F A C E G
/\
E G
Cây đỏ đen là không đảm bảo được một cách hoàn hảo rậm (trong thuật ngữ chính xác "hoàn toàn cân bằng"), nhưng các quy tắc đỏ-đen đảm bảo rằng nó đủ rậm một cách toán học chặt chẽ để lần hoạt động thay đổi như log của n chứ không phải tuyến tính trong n.
Thiên tài quy tắc màu đỏ đen là chúng là "địa phương". Trong quá trình chèn hoặc xóa phá vỡ các quy tắc, có thể khôi phục chúng bằng cách chỉ điều chỉnh số lượng nút liên tục cho mỗi nút được thao tác. Do đó chúng rẻ và khá dễ thực hiện.
Tuy nhiên, khi các quy tắc màu đỏ-đen là đúng cho toàn bộ cây, có thể hiển thị bằng bằng chứng toán học thông minh rằng nó đủ rộng như mô tả ở trên.
Còn sơ đồ cây thì sao? Bản đồ là một hàm có tên miền được gọi là tập hợp khóa K và phạm vi được gọi là tập hợp giá trị V. Để triển khai bản đồ cây, mỗi nút lưu trữ cặp khóa-giá trị <k,v>
trong đó k \in K
và v \in V
. Trong các bản vẽ ở trên (và hầu hết các bài thuyết trình), chỉ có các phím (chữ A-G) mới được hiển thị. Trong bản đồ, chèn, tra cứu, và xóa công việc trên các cặp một cách khá rõ ràng. Ví dụ: tra cứu tìm kiếm khóa bằng thuật toán BST thông thường. Khi tìm thấy khóa, giá trị cũng được tìm thấy bởi vì nó nằm trong cùng một cặp. Đó là những gì được trả lại. Trong java, cặp được gọi là Map.Entry
. Bạn có thể kiểm tra điều này trong số Java source code.
Tôi sẽ không đi sâu vào chi tiết về cách quy tắc đen-đen hoạt động vì tôi không thể cải thiện trên the Wikipedia page. Đoán và hy vọng của tôi là bạn đã bỏ lỡ "bức tranh lớn" nên bây giờ cuộc thảo luận đó sẽ có ý nghĩa. Tin vui là gần như tất cả các ngôn ngữ đều cung cấp một cách thực hiện cây được tối ưu hóa hiệu quả và được kiểm tra kỹ lưỡng, vì vậy việc biết các chi tiết phức tạp của phép quay là không cần thiết. Tất nhiên, nếu bạn tò mò và chỉ muốn biết, có nó! Xin chúc mừng!
Đối với những gì đáng giá, giải thích Top Coder về thuật toán không phải lúc nào cũng rõ ràng nhất. Tìm kiếm những người khác cho đến khi một "nhấp chuột" cho bạn.Các sách giáo khoa được tôn trọng trong CS được tôn trọng vì một lý do: giải thích của họ là tuyệt vời. Corman and Rivest là một yêu thích được chấp nhận.