随机访问队列数据结构

时间:2014-05-02 22:36:09

标签: data-structures queue random-access

我正在寻找一种数据结构来实现随机访问队列("直接"队列,而不是优先级)。也就是说,标准的队列操作(推送到后面,从前面删除,size / isEmpty),但是我希望能够在队列中间进行类似数组索引的皱纹(但是不是插入或删除)。 (澄清一下:我在队列后面添加元素,而从前面删除元素。)把它想象成一个可变大小的滑动窗口

  • 必须是无界的(例如,固定长度的循环缓冲区已经出局)
  • 不要担心并发性
  • 性能比空间要求更重要(当然在限制范围内:例如2个 64 元素的平面阵列并不完全实用)
  • 性能的一致性比直接性能更重要:真实的最坏情况而不是摊销:据我所知,所以(大多数)基于数组的数据结构已经不存在了。

理想情况下,我正在寻找支持O(1)操作的内容,但至少我喜欢具有次线性最坏情况的内容。

注意:我没有寻找实现或库,因为我正在寻找数据结构。 (这是个人好奇的问题,跟随我最​​近的一次考试中提出的相关问题)

1 个答案:

答案 0 :(得分:1)

resizable array将为插入和删除以及O(1)随机访问提供O(1)摊销成本。


或者,您可以使用order statistics tree实现队列。

  

订单统计树基本上是binary search tree(特别是self-balancing one以获得有效的性能),但每个节点存储一个额外的值,即以该节点为根的子树的大小(即它下面的节点数量。)

插入将涉及将值插入最大位置,删除将从最小位置删除。随机访问只涉及使用子树的大小来遍历对应于给定索引的节点。

这将导致所有操作的O(log n)性能。


与上述类似,但在实现方面更简单,我们可以使用标准二进制搜索树,由不断增加的唯一ID索引 - 插入的每个值都将获得插入的最后一个ID的ID加1。要进行随机访问,您可以通过给定索引偏移树中的最小ID,并在树中查找该ID。

如果ID曾经溢出,你可以继续使用另一个BST,并最终摆脱第一个如果它清空 - 这样做并不理想,但实现自己的树可能仍然更简单(因为订单统计树在图书馆中并不常见。