2013-03-16 33 views
15

tôi đang học Left-Lean-Red-Black tree, từ Prof.Robert SedgewickCó ai có thể giải thích rõ ràng việc xóa cây Trái-Đỏ-Đen không?

http://www.cs.princeton.edu/~rs/talks/LLRB/LLRB.pdf http://www.cs.princeton.edu/~rs/talks/LLRB/RedBlack.pdf

Trong khi tôi đã hiểu được insert của 2-3 treeLLRB, tôi đã trải qua hoàn toàn như 40 giờ bây giờ cho 2 tuần và tôi vẫn có thể' t nhận được sự xóa của LLRB.

Có ai thực sự giải thích được deletion của LLRB cho tôi không?

+2

Đó là ... phức tạp. – Thomas

+0

@Thomas, rất nhiều RB hoặc LLRB chỉ nói về chèn, không ai thực sự nói về xóa –

Trả lời

8

Ok Tôi sẽ thử điều này, và có lẽ những người tốt khác của SO có thể giúp đỡ. Bạn biết làm thế nào một cách suy nghĩ của các nút màu đỏ là như các chỉ số của

  1. nơi có có sự mất cân bằng/nút mới trong cây, và
  2. bao nhiêu sự mất cân bằng có.

Đây là lý do tại sao tất cả các nút mới đều có màu đỏ. Khi các nút (cục bộ) cân bằng, chúng trải qua một màu lật, và màu đỏ được chuyển lên cho cha mẹ, và bây giờ cha mẹ có thể trông mất cân đối so với anh chị em của nó.

Như minh hoạ, hãy xem xét một tình huống mà bạn đang thêm các nút từ lớn hơn đến nhỏ hơn. Bạn bắt đầu với nút Z mà bây giờ là gốc và là màu đen. Bạn thêm nút Y, màu đỏ và là một con trái của Z. Bạn thêm một chữ X màu đỏ làm con của Z, nhưng bây giờ bạn có hai màu đỏ liên tiếp, vì vậy bạn xoay phải, tô màu và bạn có cân bằng, tất cả màu đen (không có sự mất cân bằng/"nút mới"!) cây bắt nguồn từ Y [bản vẽ đầu tiên]. Bây giờ bạn thêm W và V, theo thứ tự đó. Lúc đầu, cả hai đều là màu đỏ [bản vẽ thứ hai], nhưng ngay lập tức V/X/W được xoay sang phải và màu bị lật, sao cho chỉ X là màu đỏ [bản vẽ thứ ba]. Điều này quan trọng: X là màu đỏ chỉ ra rằng trái subtree của Y là không cân bằng bởi 2 nút, hoặc, nói cách khác, có hai nút mới trong subtree trái. Vì vậy, chiều cao của các liên kết màu đỏ là số lượng các nút mới, có khả năng không cân bằng: có 2^chiều cao của các nút mới trong cây con màu đỏ.

enter image description here

Note thế nào khi thêm nút, đỏ luôn được thông qua lên: trong lật màu, hai đứa con đỏ trở thành màu đen (= cân bằng cục bộ) trong khi màu đỏ mẹ. Về cơ bản những gì xóa bỏ, là đảo ngược quá trình này. Giống như một nút mới có màu đỏ, chúng tôi cũng luôn muốn xóa một nút màu đỏ. Nếu nút không phải là màu đỏ, sau đó chúng tôi muốn làm cho nó màu đỏ đầu tiên. Điều này có thể được thực hiện bằng cách lật màu (tình cờ, đây là lý do tại sao màu lật trong mã trên trang 3 thực sự là màu trung tính). Vì vậy, nếu đứa trẻ chúng tôi muốn xóa là màu đen, chúng tôi có thể làm cho nó màu đỏ bằng cách lật màu mẹ của nó. Bây giờ đứa trẻ được đảm bảo là màu đỏ.

Vấn đề tiếp theo cần giải quyết là khi chúng tôi bắt đầu xóa, chúng tôi không biết liệu nút đích có bị xóa hay không. Một chiến lược sẽ là tìm ra đầu tiên. Tuy nhiên, theo đọc của tôi về tham chiếu đầu tiên của bạn, chiến lược được chọn có để đảm bảo rằng nút đã xóa có thể được làm đỏ, bằng cách "đẩy" một nút màu đỏ xuống trước nút tìm kiếm khi chúng tôi đang tìm kiếm trên cây cho nút bị xóa. Điều này có thể tạo ra các nút màu đỏ không cần thiết mà thủ tục fixUp() sẽ giải quyết trên đường sao lưu cây. fixUp() có lẽ duy trì các bất biến LLRBT thông thường: "không có nút màu đỏ liên tiếp" và "không có nút màu đỏ bên phải."

Không chắc chắn liệu điều đó có hữu ích hay không, hoặc nếu chúng ta cần kiểm tra mã chi tiết hơn.

+3

nó rất hữu ích. 'Giống như một nút mới có màu đỏ, chúng tôi cũng luôn muốn xóa một nút màu đỏ. Nếu nút không phải là màu đỏ, sau đó chúng tôi muốn làm cho nó màu đỏ đầu tiên.', điều này thực sự là cảm hứng. –

+2

Tôi nghĩ có gì đó sai với vòng xoay của bạn. nếu h.left và h.left.left đều có màu đỏ, chúng tôi thực hiện một rotateToRight trên nút trên cùng, trong trường hợp bạn đang hiển thị, kết quả sẽ là V/W/X và W trở thành màu đỏ sau khi lật màu. {Trên thực tế, VXW con của bạn không phù hợp với tiêu chí của cây tìm kiếm nhị phân} – hakunami

1

Có một nhận xét thú vị về việc triển khai Sedgwich và đặc biệt là phương pháp xóa của nó từ giáo sư Harvard Comp Sci. Left-Leaning Red-Black Trees Considered Harmful được viết vào năm 2013 (pdf Sedgwich bạn tham chiếu ở trên là ngày 2008):

viết Tricky

giấy Sedgewick là khéo léo. Tính đến năm 2013, phần chèn trình bày 2–3–4 cây làm mặc định và mô tả 2-3 cây như một biến thể. Tuy nhiên, việc thực hiện xóa chỉ hoạt động cho 2-3 cây. Nếu bạn triển khai biến thể chèn mặc định và biến thể xóa duy nhất, cây của bạn sẽ không hoạt động. Văn bản không làm nổi bật chuyển đổi từ 2-3–4–3: không tốt.

Phiên bản gần đây nhất tôi có thể tìm thấy mã Sedgwich, có chứa bản triển khai 2-3, được ghi ngày tháng 4 năm 2014. Đó là trên trang web Thuật toán của mình tại RedBlackBST.java

+0

Việc triển khai của anh ấy sai, chỉ cần nói. Kiểm tra phương thức deleteMin. – Pavel

+1

Chỉ cần tò mò, bạn đã thực sự nhìn vào giấy của Sedgewick, mà Kohler liên kết đến? Tôi không thấy làm thế nào một chú thích lớn và văn bản xung quanh mà nói 2-3 nhiều lần không "làm nổi bật" mã xóa là 2-3 cây. Sedgewick thậm chí làm cho một bình luận về việc sửa đổi mã cho 2-3-4. Tôi không biết nơi Kohler có ý tưởng rằng 2-3-4 là cây chính và 2-3 là một biến thể. Sedgewick thể hiện rõ ràng cả hai loại ngay từ đầu, không được mô tả là "mặc định". Kohler dường như có một cái rìu để xay với một số ý kiến ​​của anh ta ở đó. –

Các vấn đề liên quan