在 priority_queue 中插入:在该值第一次出现之前而不是在最后一次出现之后
Inserting in a priority_queue: before the first occurence of that value instead of after the last occurence
所以这是同一个问题(),但是 priority_queue。此外,关于何时使用 helpful.I 的任何见解都会看到 priority_queue.push 是 O(log(n)),但推送 n 个元素是 O(n)。这怎么可能?
您可以关注this了解如何在线性时间内建立堆。
一般来说,优先级队列不会根据到达时间对同等优先级的项目进行排序。如果你想这样做,你需要创建你自己的比较运算符,它不仅比较优先级值而且比较到达时间(或者可能是单调递增的序列号)。这里的关键是优先级队列本身并不关心插入顺序。
对于 C++,请参阅 https://en.cppreference.com/w/cpp/container/priority_queue 了解有关优先级队列和 Compare
构造函数参数的更多信息。
请参阅 Priority Queue remove items with same priority first one entered 以了解为什么在作为二进制堆实现的优先级队列中,不可能确保按插入顺序(或相反顺序)删除具有相同优先级的项目。
你说:
I see that priority_queue.push is O(log(n)) but pushing n elements is
O(n). How is that possible?
不是。您不能将 push n 个元素放入 O(n) 复杂度的堆中。但是,您可以在 O(n) 时间内将 n 个元素的数组转换为堆。详情请参阅 How can building a heap be O(n) time complexity?。
所以这是同一个问题(
您可以关注this了解如何在线性时间内建立堆。
一般来说,优先级队列不会根据到达时间对同等优先级的项目进行排序。如果你想这样做,你需要创建你自己的比较运算符,它不仅比较优先级值而且比较到达时间(或者可能是单调递增的序列号)。这里的关键是优先级队列本身并不关心插入顺序。
对于 C++,请参阅 https://en.cppreference.com/w/cpp/container/priority_queue 了解有关优先级队列和 Compare
构造函数参数的更多信息。
请参阅 Priority Queue remove items with same priority first one entered 以了解为什么在作为二进制堆实现的优先级队列中,不可能确保按插入顺序(或相反顺序)删除具有相同优先级的项目。
你说:
I see that priority_queue.push is O(log(n)) but pushing n elements is O(n). How is that possible?
不是。您不能将 push n 个元素放入 O(n) 复杂度的堆中。但是,您可以在 O(n) 时间内将 n 个元素的数组转换为堆。详情请参阅 How can building a heap be O(n) time complexity?。