Tôi đang sử dụng hàng đợi ưu tiên làm bộ lập lịch với một yêu cầu bổ sung. Tôi cần có thể hủy các mục đã lên lịch. Điều này tương đương với việc loại bỏ một mục từ giữa hàng đợi ưu tiên.Xóa phần tử khỏi phần giữa của tiêu chuẩn :: heap
Tôi không thể sử dụng std::priority_queue
vì quyền truy cập vào bất kỳ phần tử nào khác ngoài phần đầu được bảo vệ.
Tôi đang cố sử dụng chức năng heap của algorithm
. Nhưng tôi vẫn còn thiếu phần tôi cần. Khi tôi loại bỏ một phần tử tôi từ giữa đống, tôi muốn nó tự xây dựng lại hiệu quả. C++ cung cấp các chức năng này đống:
std::make_heap
O (3n)std::push_heap
O (lg (n))std::pop_heap
O (2 lg (n))
Tôi muốn có một chức năng mới như std::repair_heap
với một lớn-O < 3n. Tôi sẽ cung cấp cho nó vị trí của lỗ mà mục bị hủy bỏ được sử dụng để cư trú và nó sẽ điều chỉnh đúng đống.
Dường như có sự giám sát rất lớn để không cung cấp chức năng std::repair_heap
. Tôi có thiếu một cái gì đó hiển nhiên?
Có thư viện nào cung cấp tuân thủ STN std::repair_heap
không?
Có cấu trúc dữ liệu tốt hơn để lập mô hình trình lên lịch không?
LƯU Ý:
Tôi không sử dụng std::map
vì một vài lý do.
- Một đống có phí trên bộ nhớ không đổi.
- Một vùng có vị trí bộ nhớ cache tuyệt vời.
Hãy sửa tôi nếu tôi sai, nhưng tôi nghĩ bạn phải gọi 'std :: make_heap' vì điều này, vì bạn sẽ phải di chuyển các phần tử xung quanh anyways. –
Tôi chỉ có thể sử dụng 'std :: make_heap'. Nhưng nó cảm thấy như có một sự thay thế nhanh hơn. Tôi nghi ngờ 'repair_heap' có thể được viết thành _O (lg (n)) _, như push và pop. Lý do của tôi là 'repair_heap' chỉ là popping từ giữa đống thay vì đầu. –
Tôi đã viết một cái gì đó như 'repair_heap' cho một vấn đề lập kế hoạch tương tự (không phải trong C + +) và nó có thể được thực hiện. Sau đó tôi đã gặp vấn đề tương tự như bạn với 'std :: priority_queue' và cuối cùng tôi đã quyết định loại bỏ đó là không thường xuyên so với chèn (có thể không đúng cho bạn) mà tôi vừa sao chép đống trong khi loại bỏ phần tử. Mục tiêu của tôi trong trường hợp đó là tạo ra ít mã mới/chưa được kiểm tra càng tốt. –