2013-01-15 13 views
5

Tôi đang triển khai một vùng tối thiểu tối đa, một loại hàng đợi ưu tiên kép. Bạn có thể xem tại đây here để biết thêm thông tin về heaps tối đa.Hoạt động xóa-tối đa trong một heap tối thiểu

Mã để chèn và thao tác xóa-min rất đơn giản và có sẵn trên mạng. Tuy nhiên, tôi cũng đang cố gắng triển khai hoạt động xóa-tối đa trên heap tối thiểu. Ban đầu, tôi cảm thấy rằng xóa-max trong min-max heap sẽ giống như xóa-max trong đống tối đa (nếu chúng ta xem xét subtree của min-max heap chứa phần tử tối đa, nó giống như một max- min heap). Vì vậy, việc thực hiện sẽ đơn giản và tương tự như xóa-min của min-max heap.

Nhưng, có một vấn đề: enter image description here

Như có thể thấy trong hình trên, mặc dù 70 là yếu tố tối đa, yếu tố cuối cùng (12) của heap min-max được không cây con có chứa 70. Vì vậy, tôi có thể sử dụng nó để thay thế khoảng trống còn lại trong cây con trái sau khi xóa 70?

Nếu chúng tôi không sử dụng phần tử đó và thay vào đó hãy làm theo quy trình xóa tối đa của vùng tối đa và sử dụng 20 để thay thế khoảng cách, phần tử tiếp theo được chèn vào heap sẽ ở đúng con 10 và mãi mãi sẽ không có con đúng nào của số 9.

Vì vậy, bất kỳ ai cũng có thể giúp tôi không?

+3

Vì câu hỏi về việc xóa khóa ngẫu nhiên khác với câu hỏi về cách sửa lỗi sau khi xóa-tối đa, tôi sẽ xem xét đặt câu hỏi dưới dạng câu hỏi riêng. – templatetypedef

+0

@templatetypedef Đã chỉnh sửa câu hỏi này để tập trung vào "cách xóa phần tử tối đa". Bây giờ bạn có thể tìm thấy một câu hỏi cụ thể với giải pháp được đề xuất về "cách xóa bất kỳ nút nào khỏi vùng heap tối thiểu" tại đây: http://stackoverflow.com/q/39392864/3924118 – nbro

Trả lời

3

Tôi tin rằng việc xóa nút ngoài cùng bên phải ở mức cuối cùng là chính xác và sử dụng nó để thay thế phần tử tối đa đã bị xóa, ngay cả khi nó vượt qua trên cây. Lý do là như sau:

  1. Loại bỏ các nút ngoài cùng bên phải ở mức cuối cùng không thay đổi bất kỳ bất biến mà cần phải giữ cho bất kỳ nút trong cây rằng: tất cả các nút ở mức tối thiểu vẫn còn nhỏ hơn tất cả các hậu duệ của họ, và tất cả các nút ở mức tối đa vẫn lớn hơn con cháu của họ.

  2. Cây vẫn là cây nhị phân hoàn chỉnh.

Khi bạn đã di chuyển nút này qua, bạn có thể sử dụng thủ tục sửa lỗi bình thường trong vùng tối đa để đảm bảo rằng các biến thể subtree trái vẫn giữ.

Hy vọng điều này sẽ hữu ích!

+0

Đây cũng là cách tôi đã triển khai giải pháp đó, khi tôi viết một cấu trúc dữ liệu min-max-heap cách đây vài tháng. (+1) –

+0

Điều này có tác dụng loại bỏ phần tử _maximum_ trong vùng tối thiểu, nhưng bạn có chắc là nó hoạt động với bất kỳ nút nào trong vùng tối thiểu không? Nếu có, bạn sẽ sử dụng "fixup" nào chính xác? Sử dụng thao tác "nhỏ giọt" sẽ không hoạt động, hãy kiểm tra nhận xét duy nhất tôi đã thực hiện với ý chính này, hiển thị sự cố: https://gist.github.com/gnarmis/4647645 – nbro