插入priority_queue:在该值第一次出现之前而不是在最后一次出现之后

Posted

技术标签:

【中文标题】插入priority_queue:在该值第一次出现之前而不是在最后一次出现之后【英文标题】:Inserting in a priority_queue: before the first occurence of that value instead of after the last occurence 【发布时间】:2019-08-08 06:49:45 【问题描述】:

所以它和这个(Inserting in a multiset: before the first occurence of that value instead of after the last occurence) 是同一个问题,但是对于一个priority_queue。还有任何关于何时使用有用的见解。我看到priority_queue.push是O(log(n)),但推送n个元素是O(n)。这怎么可能?

【问题讨论】:

您有两个问题。你能在不同的问题中问他们以更好地适应 Stack Overflow Q/A 格式吗? 酷!你可以根据需要编辑它吗?我在这里很少发帖。 嗯...据我所知,我无法以您的名义发布新问题。你必须自己做。 【参考方案1】:

一般来说,优先级队列不会根据到达时间对同等优先级的项目进行排序。如果你想这样做,你需要创建自己的比较运算符,它不仅比较优先级值,而且比较到达时间(或者可能是单调递增的序列号)。这里的关键是优先级队列本身并不关心插入顺序。

对于 C++,有关优先级队列和 Compare 构造函数参数的详细信息,请参阅 https://en.cppreference.com/w/cpp/container/priority_queue。

请参阅Priority Queue remove items with same priority first one entered,了解为什么在作为二进制堆实现的优先级队列中,无法确保按照插入顺序(或相反顺序)删除具有相同优先级的项目。

你说:

我看到 priority_queue.push 是 O(log(n)) 但推送 n 个元素是 在)。这怎么可能?

不是。您不能push n 个元素到 O(n) 复杂度的堆上。但是,您可以在 O(n) 时间内将包含 n 个元素的数组转换为堆。详情请见How can building a heap be O(n) time complexity?。

【讨论】:

【参考方案2】:

您可以关注this,了解如何在线性时间内建立堆。

【讨论】:

以上是关于插入priority_queue:在该值第一次出现之前而不是在最后一次出现之后的主要内容,如果未能解决你的问题,请参考以下文章

在vs2017写javascript进行调试,不能设置断点,出现提示,在该位置未能插入断点啥原因。

优先队列priority_queue

priority_queue用法

priority_queue(堆)干货归纳+用法示例

PL/SQL 触发器插入下一个值

STL 可迭代容器,例如 priority_queue