【问题标题】:how to get the minimum and maximum of a queue?如何获得队列的最小值和最大值?
【发布时间】:2012-09-09 06:49:27
【问题描述】:

你能设计一个数据结构,就像一个包含'enqueue'、'dequeue'、'minimum'和'maximum'的队列吗? 我知道一种使用 2 个堆栈创建队列以分别找到最小值和最大值的方法,但我怎样才能同时获得这两个堆栈?

谢谢

【问题讨论】:

  • 在任何给定的堆栈或队列中查找最小值和最大值需要 n 的大 O。这意味着您必须对堆栈进行完整的迭代。
  • 这可能有助于您走上正确的道路。 stackoverflow.com/questions/4077101/…

标签: c++ data-structures stl queue


【解决方案1】:

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

大多数实现可能会使用某种形式的red-black tree 来实现这样的集合。由于数据结构将始终保持排序,asymptotic performance 可能比基于常规单端heappriority queue 给您的结果更糟糕,但对于许多应用程序来说,差异并不重要,因此应该避免实现自定义数据结构。

【讨论】:

    【解决方案2】:

    使用优先队列!

    C++ STL

    #include<queue>
    

    通常,优先级队列是由 Binary-Heap 实现的。但它不能同时保持最大值和最小值。 @_@

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

    【讨论】:

      【解决方案3】:

      通常priority queue 是使用某种heap structure 实现的。有一种称为min-max heap 的变体,它允许对最大和最小元素进行恒定时间访问。已经有a question 要求使用这种最小-最大堆的 C++ 实现。它的答案也应该对你有用。

      This comment by Paul Dixon 首先提到了 min-max heaps,而 this comment by Chris Mansley 在 Stack Overflow 上指出了实现问题。

      【讨论】:

        【解决方案4】:

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

        队列中的每个元素都必须携带一个优先级,并且代码必须维护订单契约。

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

        【讨论】:

        • 不幸的是,我相信设置优先级队列是为了让您能够廉价地挑选出最高的剩余元素。大多数实现不会让您访问最低元素。有关 STL 接口的说明,请参阅en.cppreference.com/w/cpp/container/priority_queue
        • 一个最小-最大堆可以在恒定时间内访问最大和最小的元素en.wikipedia.org/wiki/Min-max_heap
        • +1 到@PaulDixon。常规的 std::priority_queue 不会在所有基础上做他想做的事。
        • @PaulDixon,我建议将您的评论变成单独的答案。到目前为止,我们还没有在正文中建议 min-max heaps 的答案。
        猜你喜欢
        • 2015-09-10
        • 1970-01-01
        • 1970-01-01
        • 2020-09-22
        • 2017-07-29
        • 2012-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多