【问题标题】:Implement Queue such that FindMin and FindMax is 0(1)实现 Queue 使得 FindMin 和 FindMax 为 0(1)
【发布时间】:2012-08-21 19:39:25
【问题描述】:

这是一个非常常见的问题,但我在任何地方都没有找到明确的答案。 我正在做的是使用 2 stacks 实现 Queue ,并且在节点中连同 data ,我也维护 min 和 max 值。实现是用Java完成的。

现在,问题是如果 first element is Max / Min 和我将它出队,那么其余节点包含最小/最大值作为出队的那个。

示例:10 7 8 9 2

节点 - [数据,最大值,最小值]

[10,10,10] , [7,10,7] ,[8,10,7] , [9,10,7] , [2,10,2]

现在,如果我将其出队,则队列为:[7,10,7] ,[8,10,7] , [9,10,7] , [2,10,2]

并且最小值和最大值是错误的 (10,7) ,应该是 (9,2)。

我的算法基本上适用于堆栈,我正在使用队列。那么如何修改我的算法以得到正确的结果呢?

【问题讨论】:

  • 如果这是一个优先队列——并且你想跟踪最大元素——那么你将不会使用堆栈到达任何地方。优先级队列的实现与队列完全不同。
  • “这是一个非常常见的问题......我正在做的是使用 2 个堆栈实现队列”你已经问过很多次了,但我从来没有听到有人问过这个问题,主要是因为它没有没有任何意义,除非作为面试问题。你能说你为什么要这样做吗?你想解决什么问题。
  • @LouisWasserman 从技术上讲,优先级队列为您提供下一个最低元素。例如如果按时间排序,则希望出现下一个节点。
  • 既然可以用一个Queue作为队列,为什么还要用两个栈来实现一个队列?
  • 你能说一下它是做什么用的吗?你想解决什么现实世界的问题?你能提供其他人讨论过这个问题的参考吗?

标签: java algorithm data-structures queue


【解决方案1】:

你需要this吗?

双端队列有两种编码方式:

  • 有两个队列副本,并且为每个元素维护一个到相应元素的链接

  • 使用名为min-max heap的数据结构

【讨论】:

    【解决方案2】:

    查看堆排序中的heapify()。我想这就是你需要的......

    【讨论】:

      猜你喜欢
      • 2011-05-04
      • 2016-07-28
      • 1970-01-01
      • 1970-01-01
      • 2014-12-30
      • 1970-01-01
      • 2018-09-26
      • 2017-05-30
      • 2011-03-01
      相关资源
      最近更新 更多