-
Notifications
You must be signed in to change notification settings - Fork 32
Closed
Labels
Description
The PriorityQueue::remove()
does not work correctly in some cases.
Here is minimal reproducer:
use std::collections::hash_map::RandomState;
use priority_queue::PriorityQueue;
fn main() {
let mut queue = PriorityQueue::<i32, i32, RandomState>::default();
for i in 0..7 {
queue.push(i, i);
}
queue.remove(&0);
let mut last_priority = *queue.peek().unwrap().1;
while let Some((i, priority)) = queue.pop() {
dbg!(priority);
assert!(last_priority >= priority);
last_priority = priority;
}
}
This will pop elements in order 6, 5, 3, 4, which is clearly not correct.
I have partially debugged it and I think the map
, heap
and qp
are updated correctly and remain consistent, but the actual algorithm for removing element from heap is not correct. It seems that the remove()
function assumes that heapify()
will perform up-heapify or down-heapify as needed, but it in fact only performs down-heapify. So in the case when up-heapify should have happened, the "heap" vector is no longer an actual heap.
hniksic