2009-05-29 26 views
11

Tôi có một hàng đợi ưu tiên các sự kiện, nhưng đôi khi các ưu tiên sự kiện thay đổi, vì vậy tôi muốn duy trì các trình vòng lặp từ những người yêu cầu sự kiện vào heap. Nếu ưu tiên thay đổi, tôi muốn heap được điều chỉnh trong thời gian log (n). Tôi sẽ luôn có chính xác một trình vòng lặp trỏ tới từng phần tử trong heap.Có một lớp heap trong C++ hỗ trợ thay đổi mức độ ưu tiên của các phần tử khác với phần đầu?

Trả lời

3

Tôi rất vui mừng thông báo rằng Boost hiện đã thêm một số Boost.Heap library với một số stellar data structures.

Lợi thế của việc này là các mức Fibonacci hỗ trợ thay đổi ưu tiên trong thời gian khấu hao không đổi.

Thật không may, tất cả các vùng ẩn có thể thay đổi được dựa trên nút (nói cách khác, chúng có thêm sự gián tiếp như được đề xuất bởi @wilx). Câu trả lời của @ Feruccio về "đống có thể thay đổi" của Boost có mã cho phép người ta viết đống có thể biến đổi dựa trên vectơ nếu bạn sẵn sàng có con trỏ tới các tay cầm chứa trong loại giá trị của bạn.

2

Điều đó nghe có vẻ như bạn cần thêm hướng dẫn. Lưu trữ con trỏ tới các sự kiện trong hàng đợi ưu tiên thay thế. Khi ưu tiên của một số phần tử của hàng đợi thay đổi, hãy xóa nó và lắp lại.

10

Hãy xem Boost của mutable heaps.

+0

Cảm ơn, nếu tôi phải tự cuộn, tôi sẽ sử dụng đoạn mã đó để bắt đầu. –

+1

đã kết thúc với giải pháp này –

+1

@Ferruccio Cảm ơn, đã lưu 45 phút và một vài lỗi của tôi. –

0

Một cảnh báo ở đây là bạn kết thúc với sự kiện không ổn định phân loại, tức là Trật tự của các sự kiện với các ưu tiên như nhau là undefined (đọc 'họ sẽ được sắp xếp lại.)

+1

Bạn có thể loại bỏ một phần tử tùy ý khỏi một đống trong thời gian nhật ký (n). –

+0

Vâng, bạn đã đúng, đang nghĩ về điều gì khác :) –

+0

không có vấn đề :) –

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