我正在寻找一种数据结构来实现随机访问队列("直接"队列,而不是优先级)。也就是说,标准的队列操作(推送到后面,从前面删除,size / isEmpty),但是我希望能够在队列中间进行类似数组索引的皱纹(但是不是插入或删除)。 (澄清一下:我只在队列后面添加元素,而仅从前面删除元素。)把它想象成一个可变大小的滑动窗口
理想情况下,我正在寻找支持O(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,并最终摆脱第一个如果它清空 - 这样做并不理想,但实现自己的树可能仍然更简单(因为订单统计树在图书馆中并不常见。