插入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:在该值第一次出现之前而不是在最后一次出现之后的主要内容,如果未能解决你的问题,请参考以下文章