Tôi có một số đối tượng ưu tiên là loại ghép và chỉ được đặt hàng một phần . Tôi cần chọn các đối tượng theo thứ tự ưu tiên này (tức là mang lại mục tối thiểu mỗi lần). Nhưng thay vì tự ý hoàn thành đơn hàng, tôi thích nếu hàng đợi ổn định theo nghĩa là nếu có nhiều hơn một yếu tố tối thiểu, thì nó sẽ trả về cái cũ nhất trước.
Có cấu trúc dữ liệu heap nào sẽ hoạt động với thứ tự một phần không? Hoặc một sửa đổi của hàng đợi ưu tiên thường xuyên để làm việc với nó? Lựa chọn phổ biến cho thuật toán tôi cần là nhị phân đơn giản hoặc heap 4-ary, nhưng điều đó không hoạt động với thứ tự một phần.
Các giá trị ưu tiên hỗ trợ:
- Đặt hàng một phần bằng cách sử dụng thao tác . Đó là thứ tự một phần, vì vậy có thể một \ precurlyeq b là sai và b \ precurlyeq a cũng sai. Tôi viết một \ không \ lesseqgtr b trong trường hợp đó.b ≼ một một ⋚ ̸ b
- Tìm infima (glb) và suprema (mỡ). là y tối đa sao cho . Việc tính giá trị vô hạn của giá trị sẽ mất thời gian . Vô hạn (và tối cao) của mỗi bộ tồn tại.
- Một phần mở rộng tuyến tính cho thứ tự một phần có thể được xác định. Sử dụng nó cho hàng đợi ưu tiên là cách dễ dàng vì thuật toán thực hiện theo cách đó. Nhưng thứ tự ảnh hưởng đến hiệu suất và thứ tự chèn có vẻ như là tốt nhất để tránh các trường hợp xấu nhất.
Ngoài ra, thuật toán mà tôi muốn sử dụng này cần phải biết tối đa tất cả các ưu tiên trong hàng đợi.
Các ưu tiên có một số ý nghĩa trong thế giới thực, nhưng có thể thay đổi, do đó dường như không thể dựa vào các thuộc tính khác mà chúng có thể có.
Lưu ý: đống nhị phân không hoạt động với thứ tự một phần. Giả sử một đống nhị phân với , và , trong đó và và . Chúng được định vị theo thứ tự đó, vì vậy
a (0)
/ \
b (1) c (2)
bây giờ d được chèn vào. Vị trí miễn phí tiếp theo là 3, con trái của , vì vậy chúng tôi nhận được
a (0)
/ \
b (1) c (2)
/
d (3)
Nếu (ngụ ý từ tính chuyển đổi, nhưng không nói gì về và ) và , thì không bị tráo đổi với , vì nó không ít hơn. Nhưng nó thực sự ít hơn , nhưng nó không được so sánh với nó, vì vậy bây giờ bất biến heap chính không giữ được; hàng đầu không phải là tối thiểu.d ≼ c d b d ⋚ ̸ b d b một
Tôi nghi ngờ một rừng đống có phần nào đó theo kiểu nhị phân có thể được tạo ra để hoạt động. Về cơ bản, điều quan trọng là luôn luôn so sánh các giá trị mới với root và chỉ liên kết các yếu tố so sánh với nhau. Nó sẽ làm cho các cây trong rừng có kích thước ngẫu nhiên và do đó làm cho độ phức tạp phụ thuộc vào số lượng các bộ không thể so sánh được trong đống. Tôi hơi nghi ngờ sự phức tạp không thể khắc phục được (chúng ta phải tiếp tục so sánh cho đến khi chúng ta đạt được một yếu tố tương đương) Tôi có thể đã bỏ lỡ điều gì đó, vì vậy tôi bỏ ngỏ điều này.
Lưu ý: Thứ tự là một phần và trong khi có nhiều cách để xác định tiện ích mở rộng tuyến tính cho nó, việc thêm dấu thời gian và sử dụng nó làm tiêu chí phụ không phải là một trong số đó. Giả sử chúng ta đã gán dấu thời gian cho mỗi và xác định thứ tự là iff hoặc ( và . Sau đó, giả sử chúng ta có , , riêng biệt , sao cho và . Sau đó vàmột ≼ ' một ≼ ' b một ≼ b b ⋠ một t ( một ) ≤ t ( b ) một b c t ( một ) ≤ t ( b ) ≤ t ( c )một ≼ ' b b ≼ ' c c ≼ ' một , nhưng , vì vậy mối quan hệ này không và do đó hoàn toàn không phải là một trật tự. Kiểu mở rộng này chỉ hoạt động cho các thứ tự yếu, nhưng không phải là một phần.
Chỉnh sửa: Tôi nhận ra rằng không chỉ là tối ưu của bất kỳ tập hợp nào được xác định, mà tôi thực sự cần phải có khả năng nhận được các yếu tố hiện tại trong hàng đợi một cách hiệu quả. Vì vậy, bây giờ tôi đang suy nghĩ xem việc thêm các nút đặc biệt có chứa infima của cây con vào một số cấu trúc heap chung có giúp ích gì không.