如何获取队列的最小值和最大值



你能设计一个像包含"enqueue"、"dequeue"、"最小值"和"最大值"的队列一样的数据结构吗?我知道一种使用 2 个堆栈分别查找最小值和最大值的队列的方法,但是如何同时获取两者?

谢谢

使用标准容器,像std::set这样的完全有序的数据结构将提供对两个极值的访问,例如使用 *s.begin()*s.rbegin() 。如果有多个具有相同优先级的对象,则可能需要以任意方式断开连接,或者改用std::multiset

大多数实现可能会使用某种形式的红黑树来实现这样的集合。由于数据结构将始终保持排序,因此渐近性能可能比常规的基于单端堆的优先级队列更差,但对于许多应用程序来说,这种差异并不重要,因此应避免实现自定义数据结构的努力。

使用优先级队列!

C++ STL

#include<queue>

通常,优先级队列由二进制堆实现。但它不能同时保持最大值和最小值。@_@

也许平衡搜索树,如AVL,Splay或红黑树应该是更好的选择。

通常,优先级队列是使用某种堆结构实现的。有一种称为最小-最大堆的变体,它允许对最大和最小元素进行恒定时间访问。已经有一个问题要求C++实现这样的最小-最大堆。它的答案也应该对您有用。

Paul Dixon 的这篇评论首先提到了 min-max 堆,而 Chris Mansley 的这篇评论指出了 Stack Overflow 的实现问题。

数据结构是一种众所周知的结构,称为优先级队列。队列中的每个元素都有一个关联的优先级,队列按从高到低的排序顺序保持。

队列中的每个元素都必须带有优先级,并且代码必须维护订单协定。

一些 STL 包含优先级队列实现,尽管现在我查看它,我不确定整个队列是否按优先级顺序保持。

最新更新