【问题标题】:Sorting a queue using same queue使用相同的队列对队列进行排序
【发布时间】:2011-07-05 06:47:36
【问题描述】:

有人问我这个问题,我认为这是可行的,但是我很难想出一个算法来做到这一点。限制是您不能使用任何其他数据结构,也不能创建另一个队列。此外,您只能使用 enqueue、dequeue 和 peek(不是优先级队列)。

感谢您的贡献:)

【问题讨论】:

  • 如果你能做到这一点,我会感到非常惊讶。但是,我认为您需要更具体地了解允许使用哪种临时内存。我假设你只被允许 O(1) 内存?
  • 没有时间和空间复杂性的限制。然而,这有点暗示空间复杂度将为 1,除非存在递归解决方案并且计算每个递归调用创建的 StackFrames 被认为会增加空间复杂度。
  • peek是只返回队列的头部,还是可以用它来查找队列任意位置的值?
  • 只有队列头:)
  • @3ashmawy:创建的堆栈帧必须计算在内,否则有一个非常简单的解决方案。

标签: algorithm data-structures


【解决方案1】:
Sort(Q,n):

  for i = 0 to n-1
    min = findMin(Q, n-i, n)
    reorder(Q, min, n)
  end for

findMin(Q, k, n):

  min = infinity

  for i = 1 to n
    curr = dequeue(Q)
    if curr < min && i<=k
      min = curr
    end if
    enqueue(Q,curr)
  end for

  return min

reorder(Q, min, n):

  for i = 1 to n
    curr = dequeue(Q)
    if (curr != min) // I'm assuming that there is a way to differentiate between any two items, this isn't hard to enforce
      enqueue(Q, curr)
    end if
  end for

  enqueue(Q,min)

升序排序,时间为O(n^2),空间为O(1)(即队列为O(n)空间,算法需要的额外空间为O(1))

说明:

本质上,我们遍历队列 n 次,每次迭代花费 2n。

在每次迭代中,我们都会遍历整个队列并在相关数量的项目中选择最小值。所以首先相关的项目数是 n,因为我们想要它们中的最小值。下一次迭代我们想要前 n-1 项中的最小值,然后是 n-2 项,等等。因为算法将在最后堆叠这些最小值。

一旦找到最小值,我们需要再次遍历整个堆栈,以便将其抓取并堆叠到最后。

这里的主要思想是,一个出队后跟一个相同元素的入队将允许我们遍历队列并检查最小值/最大值,同时保持顺序。

【讨论】:

  • 该死,我想出了相同的解决方案,当我回来发布它时,我看到你的答案已经发布了......eeeeeeh..speed ;)......我为你的速度投票
  • @Suraj,如果我有 1 个代表。每次发生在我身上的时候,我都必须发明一种新的数据类型来保存 BigBigBigInt :)
【解决方案2】:

使用队列的冒泡排序:

n <- size of queue
repeat n times
  x <- dequeue item
  repeat (n-1) times
    y <- dequeue item
    if x < y then
      enqueue y
    else
      enqueue x
      x <- y
    end
  end
  enqueue x
end

【讨论】:

  • 感谢您的精彩回答,它对我帮助很大。我在这里注意到的一件事是上面的伪代码中有一个错字。入队行 x (最后一行)在开头有一个额外的空间。所以看起来好像 enqueue x 应该重复 (n-1) 次而不是 n 次。
  • @akshayKhanapuri 我添加了end 标记,以使边界更清晰。
猜你喜欢
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 2013-01-02
相关资源
最近更新 更多