具有随机删除的FIFO队列

时间:2016-09-20 05:27:03

标签: java algorithm data-structures queue

实现支持插入项目的数据类型,删除最近添加的项目,并删除随机项目。每个操作应该采用每个操作不变的预期摊销时间,并且应该使用与数据结构中的项目数成比例的空间(最多)。

例如。 1 2 3 4 5 6 - > 1 2 4 5 6

我已经实现了如下队列,但现在我不知道如何删除一个随机项目的摊销时间,我应该每次重新排列数组时,随机移除后移动数字随机移除后的第一号在阵列中向前插槽?这是一个非常糟糕的做法吗?或者我应该使用链表实现队列?但我的直觉告诉我链表也需要平均O(n)从链表头部到达随机节点。

FBSession

1 个答案:

答案 0 :(得分:1)

此问题的关键在于,您不是从正在创建排除随机项的队列的队列中删除随机项。您应该在程序中有一个接受队列作为输入的函数,并执行以下操作:

  1. 创建第二个排除随机删除项目的队列。
  2. 生成小于或等于第一个队列总长度的随机数。
  3. 创建一个循环,将从第一个队列中删除项目并将其添加到第二个队列。
  4. 如果循环中的计数器等于随机数,请不要将其添加到第二个队列。
  5. 删除第一个队列并返回第二个队列。