Sự khác biệt giữa cây đỏ đen và cây AVL


82

Ai đó có thể vui lòng giải thích sự khác biệt chính giữa hai cấu trúc dữ liệu này là gì không? Tôi đã cố gắng tìm một nguồn trực tuyến làm nổi bật sự khác biệt / tương đồng, nhưng tôi không tìm thấy bất cứ điều gì quá nhiều thông tin. Trong những trường hợp nào thì cái này được ưu tiên hơn cái kia? Những tình huống thực tế nào khiến cái này "tốt hơn" để sử dụng hơn cái kia?

Câu trả lời:


100

Cây AVL duy trì sự cân bằng cứng nhắc hơn cây đỏ-đen. Đường đi từ gốc đến lá sâu nhất trong cây AVL tối đa là ~ 1,44 lg (n + 2), trong khi ở cây đen đỏ thì tối đa là ~ 2 lg (n + 1).

Kết quả là, tra cứu trong cây AVL thường nhanh hơn, nhưng điều này đi kèm với chi phí là chèn và xóa chậm hơn do thao tác xoay nhiều hơn. Vì vậy, hãy sử dụng cây AVL nếu bạn mong đợi số lượng tra cứu chiếm ưu thế so với số lượng các bản cập nhật cho cây.


3
Yêu cầu để hiểu khái niệm tốt hơn. Cả cây avl và cây Đỏ đen đều có ít nhất hai lần xoay mỗi lần chèn. Vì vậy, làm thế nào bạn có thể nói AVL cây chậm? Cảm ơn trước!
user2626445

@larsmans! Sự khác biệt về hiệu suất có quá nhiều mà một khái niệm mới được tạo ra?
Shashwat

@Shashwat Tôi không hiểu ý bạn. Khái niệm mới?
Fred Foo

2
@larsmans! Ý tôi là tại sao chúng ta lại có khái niệm cây Đỏ-Đen quá nổi tiếng khi chúng ta có cây AVL, mặc dù chỉ có sự khác biệt nhỏ về hiệu suất chèn, xóa và cập nhật của chúng. Có điều gì chính làm cho cây Đỏ-Đen khác với cây AVL?
Shashwat

Các thuật toán để duy trì chúng khác nhau, vì vậy chúng có các tên khác nhau. AFAIK, họ hỗ trợ cùng một nhóm hoạt động với cùng giới hạn thời gian lớn nhất.
Fred Foo,

54

Đối với dữ liệu nhỏ :

insert : RB tree & avl tree có số vòng quay max không đổi nhưng cây RB sẽ nhanh hơn vì trung bình cây RB sử dụng ít vòng quay hơn.

Tra cứu : Cây AVL nhanh hơn, vì cây AVL có ít độ sâu hơn.

xóa : Cây RB có số lần quay tối đa không đổi nhưng cây AVL có thể có O (log N) lần quay là tồi tệ nhất. và trung bình cây RB cũng có số vòng quay ít hơn do đó cây RB nhanh hơn.

cho dữ liệu lớn :

insert : AVL tree nhanh hơn. bởi vì bạn cần tìm kiếm một nút cụ thể trước khi chèn. khi bạn có nhiều dữ liệu hơn, chênh lệch thời gian khi tra cứu nút cụ thể sẽ tăng tỷ lệ thuận với O (log N). nhưng cây AVL & cây RB vẫn chỉ cần số vòng quay không đổi trong trường hợp xấu nhất. Vì vậy, cổ chai sẽ trở thành thời gian bạn tra cứu cho nút cụ thể đó.

tra cứu : Cây AVL nhanh hơn. (giống như trong trường hợp dữ liệu nhỏ)

xóa : Cây AVL trung bình nhanh hơn, nhưng trong trường hợp xấu nhất thì cây RB nhanh hơn. bởi vì bạn cũng cần phải tìm kiếm một nút rất sâu để hoán đổi trước khi loại bỏ (tương tự như lý do chèn). trung bình cả hai cây có số vòng quay không đổi. nhưng cây RB có giới hạn trên không đổi cho phép quay.


2
điều này dường như có nghĩa là cây AVL hầu như luôn được ưu tiên với lượng lớn dữ liệu. Làm thế nào nó được sử dụng trong Java và C ++ STL? stackoverflow.com/questions/3901182/…
emschorsch,

Bạn cần có một lượng dữ liệu nhất định (1 triệu ví dụ) để làm cho cây AVL tốt hơn cây RB trong trường hợp chèn / xóa và nó thực sự phụ thuộc vào cách bạn triển khai nó. Một triển khai AVL thông minh có thể đánh bại std :: map ngay cả với lượng dữ liệu ít hơn. Ví dụ, bạn không cần phải kiểm tra xem các con và cháu là null nếu phụ huynh> chiều cao lớn hơn 5.
DU Jiaen

Đây là một phân tích tuyệt vời và nên là điển hình của bất kỳ loại so sánh cấu trúc dữ liệu nào. Tốt hơn câu trả lời được chấp nhận
pterodragon

1
Là một bản tóm tắt rút gọn của 'dữ liệu nhỏ', những gì tôi lấy từ đây là: AVL thực hiện nhiều công việc hơn từ trước và chặt chẽ hơn (ghi / quay), để tăng hiệu suất sau này (đọc). Việc đọc trở nên quan trọng hơn khi dữ liệu phát triển, bởi vì bạn sẽ đọc nhiều hơn là viết (xoay vòng sẽ không đáng kể so với tìm kiếm). Vì vậy, AVL giành chiến thắng trên tất cả các số lượng, bởi vì nó được tối ưu hóa để đọc.
Ben Butterworth

8

Trích dẫn từ điều này: Sự khác biệt giữa AVL và Cây Đỏ-Đen

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ý, RB-Trees được thực hiện dưới dạng cây nhị phân, các cờ đỏ / đen mô phỏng 2-3 hành vi.

theo định nghĩa, mọi AVL do đó là các tập con của Đỏ-Đen. Người ta có thể tô màu bất kỳ cây AVL nào, mà không cần tái cấu trúc hoặc xoay, để biến nó thành cây Đỏ-Đen.


3

Cây AVL thường được so sánh với cây đỏ-đen vì cả hai đều hỗ trợ cùng một tập hợp các thao tác và mất O(log n)thời gian cho các thao tác cơ bản. Đối với các ứng dụng tra cứu chuyên sâu, cây AVL nhanh hơn cây đỏ-đen vì chúng được cân bằng chặt chẽ hơn. Tương tự như cây đỏ đen, cây AVL có chiều cao cân đối. Nhìn chung, cả hai đều không cân bằng trọng lượng cũng không cân bằng μ đối với bất kỳ μ ≤ ½ nào; nghĩa là, các nút anh chị em có thể có số lượng con cháu rất khác nhau.

Từ Bài viết Wikipedia về Cây AVL


3

Chiều cao tối đa của cây là điều tối quan trọng để giữ thăng bằng. Nó gần như bằng 1.44 * log(n)với AVL, nhưng đối với cây RB, nó là như vậy 2 * log(n). Vì vậy, chúng tôi có thể kết luận rằng tốt hơn là sử dụng AVL khi vấn đề là khuyến khích tìm kiếm. Điều quan trọng là một câu hỏi khác cho cây AVL và RB. Cây RB tốt hơn AVL khi đối mặt với việc chèn ngẫu nhiên với chi phí thấp hơn của vòng quay nhưng AVL tốt để chèn các dữ liệu tăng dần hoặc giảm dần. Vì vậy, nếu vấn đề là khuyến khích chèn, chúng ta có thể sử dụng cây RB.


3

Để có ý tưởng về cách hoạt động của Cây AVL, hình ảnh trực quan tương tác này sẽ hữu ích.

AVL cũng như RedBlack Trees là các Cấu trúc Dữ liệu Cây cân bằng chiều cao. Chúng khá giống nhau và sự khác biệt thực sự bao gồm số lượng thao tác xoay được thực hiện trên bất kỳ thao tác thêm / bớt nào - cao hơn trong trường hợp AVL, để duy trì sự cân bằng tổng thể đồng nhất hơn.

Cả hai quy mô triển khai như một O(lg N) , trong đó N là số lá, nhưng trên thực tế, Cây AVL nhanh hơn khi thực hiện các nhiệm vụ tra cứu chuyên sâu: tận dụng lợi thế của việc cân bằng tốt hơn, các lần truyền qua Cây trung bình ngắn hơn. Mặt khác, việc chèn và xóa khôn ngoan, Cây AVL chậm hơn: cần có số lần xoay cao hơn để cân bằng lại đúng cấu trúc Dữ liệu khi sửa đổi.

Đối với các triển khai cho mục đích chung (tức là ưu tiên không rõ liệu tra cứu có phải là hoạt động chiếm ưu thế hay không), Cây RedBlack được ưu tiên hơn: chúng dễ thực hiện hơn và nhanh hơn trong các trường hợp phổ biến - bất cứ khi nào Cấu trúc dữ liệu được sửa đổi thường xuyên như được tìm kiếm . Một ví dụ, TreeMapTreeSettrong Java sử dụng RedBlack Tree hỗ trợ.


2

Tuy nhiên, thực tế là cây RedBlack có ít vòng quay hơn có thể làm cho chúng nhanh hơn khi chèn / xóa. Vì chúng thường sâu hơn một chút Chúng cũng có thể chậm hơn trong việc chèn và xóa. Mỗi khi bạn đi từ cấp độ này sang cấp độ tiếp theo, có một thay đổi lớn là thông tin được yêu cầu không có trong bộ nhớ cache và phải được truy xuất từ ​​RAM. Do đó, thời gian đạt được trên ít vòng quay hơn đã có thể bị mất vì nó phải điều hướng sâu hơn và do đó phải cập nhật bộ nhớ cache thường xuyên hơn. Có thể hoạt động từ bộ nhớ cache hay không tạo ra sự khác biệt lớn. Nếu thông tin liên quan nằm trong bộ nhớ cache, thì bạn có thể thực hiện nhiều thao tác xoay vòng, trong thời gian cần thiết để điều hướng một cấp bổ sung và thông tin cấp tiếp theo không có trong bộ nhớ cache. Vì vậy, trong trường hợp RedBlack trên lý thuyết nhanh hơn, chỉ nhìn vào các thao tác cần thiết, nó có thể chậm hơn trong thực tế,


1

Từ những gì tôi đã thấy, có vẻ như Cây AVL thực hiện nhiều phép quay (đôi khi lên cây một cách đệ quy) khi cần thiết để có được chiều cao mong muốn của Cây AVL (Log n). Điều này làm cho nó trở nên cân bằng cứng cáp hơn.

Đối với Cây Đỏ Đen, có 5 Bộ quy tắc bạn cần đảm bảo duy trì trong quá trình chèn và loại bỏ mà bạn có thể tìm thấy tại đây http://en.wikipedia.org/wiki/Red-black_tree .

Điều chính có thể giúp bạn cho cây đỏ đen là thực tế là tùy thuộc vào năm quy tắc đó, bạn có thể tô màu đệ quy cho cây cho đến gốc nếu chú là màu đỏ. Nếu chú màu đen, bạn sẽ cần thực hiện tối đa hai lần xoay để khắc phục bất kỳ vấn đề nào bạn gặp phải nhưng sau một hoặc hai lần xoay đó, BẠN ĐÃ LÀM ĐƯỢC. Gói nó vào và nói chúc ngủ ngon vì đó là bước kết thúc của thao tác bạn cần làm.

Quy tắc lớn là số 5 ... 'Mọi đường dẫn đơn giản từ một nút nhất định đến bất kỳ lá nào trong số các lá con của nó đều chứa cùng một số lượng nút đen ".

Điều này sẽ gây ra hầu hết các vòng quay mà bạn cần để cây hoạt động và điều đó khiến cây không bị mất cân bằng quá xa.


1

Tóm lại: AvlTrees cân bằng tốt hơn một chút so với RedBlackTrees. Cả hai cây đều mất O (log n) thời gian tổng thể cho việc tra cứu, chèn và xóa, nhưng để chèn và xóa, cây trước yêu cầu phép quay O (log n), trong khi cây sau chỉ cần phép quay O (1).

Vì các phép quay có nghĩa là ghi vào bộ nhớ và việc ghi vào bộ nhớ rất tốn kém, nên trên thực tế, RedBlackTrees cập nhật nhanh hơn AvlTrees

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.