AVL và Đỏ cây đen đều tự cân bằng ngoại trừ màu Đỏ và màu đen ở các nút. Lý do chính để chọn cây Đỏ đen thay vì cây AVL là gì? Ứng dụng của cây Đỏ đen là gì?
AVL và Đỏ cây đen đều tự cân bằng ngoại trừ màu Đỏ và màu đen ở các nút. Lý do chính để chọn cây Đỏ đen thay vì cây AVL là gì? Ứng dụng của cây Đỏ đen là gì?
Câu trả lời:
Lý do chính để chọn cây Đỏ đen thay vì cây AVL là gì?
Cả cây đỏ đen và cây AVL đều là những cây tìm kiếm nhị phân cân bằng được sử dụng phổ biến nhất và chúng hỗ trợ chèn, xóa và tra cứu trong đảm bảo O(logN) time
. Tuy nhiên, có những điểm sau so sánh giữa hai loại:
O(N)
thêm không gian. Tuy nhiên, nếu chúng ta biết rằng các khóa sẽ được chèn vào cây sẽ luôn lớn hơn 0, chúng ta có thể sử dụng bit dấu của các khóa để lưu trữ thông tin về màu sắc của một cây đỏ đen. Vì vậy, trong những trường hợp như vậy cây đỏ-đen không tốn thêm diện tích.Ứng dụng của cây đỏ đen là gì?
Cây đỏ-đen có mục đích chung hơn. Chúng hoạt động tương đối tốt về thêm, bớt và tra cứu nhưng cây AVL có khả năng tra cứu nhanh hơn với chi phí thêm / bớt chậm hơn. Cây đỏ đen được sử dụng như sau:
java.util.TreeMap
,java.util.TreeSet
In general, the rotations for an AVL tree are harder to implement and debug than that for a Red-Black tree.
là không đúng sự thật.
std:: map
và bạn bè sử dụng bất kỳ cấu trúc cụ thể nào. Đó là việc thực hiện, mặc dù libstdc ++ và Dinkumware ít nhất cũng sử dụng cây đỏ-đen và có vẻ như bạn đã đúng trong thực tế.
Hãy thử đọc bài viết này
Nó cung cấp một số thông tin chi tiết tốt về sự khác biệt, điểm tương đồng, hiệu suất, v.v.
Đây là trích dẫn từ bài báo:
Cây RB, cũng như cây AVL, tự cân bằng. Cả hai đều cung cấp hiệu suất tra cứu và chèn O (log n).
Sự khác biệt là RB-Trees đảm bảo O (1) lần quay cho mỗi thao tác chèn. Đó là những gì thực sự chi phí hiệu suất trong triển khai thực tế.
Đơn giản hóa, RB-Trees có được lợi thế này từ khái niệm là 2-3 cây mà không cần thực hiện các cấu trúc nút động. Về mặt vật lý, cây RB được triển khai dưới dạng cây nhị phân, các cờ đỏ / đen mô phỏng 2-3 hành vi
Theo sự hiểu biết của riêng tôi, cây AVL và cây RB không khác xa nhau lắm về mặt hiệu suất. Cây RB chỉ đơn giản là một biến thể của cây B và việc cân bằng được thực hiện khác với cây AVL.
Sự hiểu biết của chúng tôi về sự khác biệt trong hiệu suất đã được cải thiện trong những năm qua và bây giờ lý do chính để sử dụng cây đỏ đen trên AVL sẽ không được tiếp cận với việc triển khai AVL tốt vì chúng hơi ít phổ biến hơn có lẽ vì chúng không được đề cập trong CLRS.
Cả hai cây hiện được coi là dạng cây cân bằng nhưng cây đỏ-đen luôn chậm hơn khoảng 20% trong các thử nghiệm trong thế giới thực . Hoặc thậm chí chậm hơn 30-40% khi dữ liệu tuần tự được chèn vào .
Vì vậy, những người đã nghiên cứu cây đỏ đen nhưng không phải cây AVL có xu hướng chọn cây đỏ đen. Các mục đích sử dụng chính của cây đỏ-đen được trình bày chi tiết trong mục nhập Wikipedia dành cho chúng .
Các câu trả lời khác ở đây tổng hợp những ưu và nhược điểm của cây RB và AVL, nhưng tôi thấy sự khác biệt này đặc biệt thú vị:
Cây AVL không hỗ trợ chi phí cập nhật phân bổ liên tục [nhưng cây đỏ-đen thì có]
Nguồn: Mehlhorn & Sanders (2008) (phần 7.4)
Vì vậy, trong khi cả hai cây RB và AVL đều đảm bảo thời gian trong trường hợp xấu nhất là O (log (N)) để tra cứu, chèn và xóa, thì việc khôi phục thuộc tính AVL / RB sau khi chèn hoặc xóa một nút có thể được thực hiện trong O (1) thời gian khấu hao cho cây đỏ đen.
Các lập trình viên thường không thích cấp phát bộ nhớ động. Vấn đề với cây avl là đối với "n" phần tử, bạn cần ít nhất là các bit log2 (log2 (n)) ... (height-> log2 (n)) để lưu trữ chiều cao của cây! Vì vậy, khi bạn đang xử lý dữ liệu khổng lồ, bạn không thể chắc chắn có bao nhiêu bit để phân bổ để lưu trữ chiều cao tại mỗi nút.
Ví dụ: nếu bạn sử dụng 4 byte int (32 bit) để lưu trữ chiều cao. Chiều cao tối đa có thể là: 2 ^ 32 và do đó số phần tử tối đa bạn có thể lưu trữ trong cây là 2 ^ (2 ^ 32) - (có vẻ là rất lớn nhưng trong thời đại dữ liệu này không có gì là quá lớn, tôi đoán vậy). Và do đó nếu bạn vượt quá giới hạn này, bạn phải tự động phân bổ thêm không gian để lưu trữ chiều cao.
Đây là một câu trả lời do một giáo sư tại trường đại học của tôi gợi ý, điều này có vẻ hợp lý với tôi! Hy vọng tôi có ý nghĩa.
Chỉnh sửa: Cây AVL cân bằng hơn so với Cây Đỏ Đen, nhưng chúng có thể gây ra nhiều xoay hơn trong quá trình chèn và xóa. Vì vậy, nếu ứng dụng của bạn liên quan đến nhiều thao tác chèn và xóa thường xuyên, thì cây Đỏ đen nên được ưu tiên hơn. Và nếu việc chèn và xóa ít thường xuyên hơn và hoạt động tìm kiếm thường xuyên hơn, thì cây AVL nên được ưu tiên hơn Cây đen đỏ. --Nguồn GEEKSFORGEEKS.ORG
you need need atleast log2(log2(n))...(height->log2(n)) bits to store the height of [an AVL] tree
Tôi không cần chiều cao của bất kỳ nút nào trong cây AVL để triển khai nó. Bạn cần thêm một chút thông tin cho mỗi nút ( TÔI LÀ TUYỆT VỜI NHẤT (anh chị em có cây con cao nhất))); nó là thuận tiện hơn cũng như thường có hai bit thêm (con là cao hơn đối với trái và phải), như đã trình bày bởi AV & L.
Cân bằng lại cây AVL phải đáp ứng thuộc tính dưới đây. (Tham khảo Wiki - Cây AVL )
Trong cây AVL, chiều cao của hai cây con của bất kỳ nút nào khác nhau nhiều nhất là một; nếu bất kỳ lúc nào chúng khác nhau nhiều hơn một, việc cân bằng lại được thực hiện để khôi phục thuộc tính này.
Vì vậy, điều này ngụ ý rằng chiều cao tổng thể của cây AVL không thể tăng lên tức là việc tra cứu sẽ tốt hơn với Cây AVL. Và vì các hoạt động bổ sung (phép quay) phải được thực hiện để không làm cho chiều cao tăng lên, các hoạt động sửa đổi cây có thể hơi tốn kém.