ruby数组中shift/unshift的运行时间是多少?

djb*_*ick 9 ruby big-o

有谁知道红宝石阵列中的移位和非移位效率如何?

从数组的开头删除并且必须移动内存中的每个元素可能变得非常低效.我认为红宝石会以其他方式做到这一点.

以下任何信息都会有所帮助:
- 算法运行时
- 实现
- 一般效率
- 移位/取消移位是否可以接受用于队列(在C++中这不会)

谢谢!

Ker*_*ley 7

在Ruby的旧版本(〜2012之前)中,unshift是O(n)操作。但是,此提交中添加了一个优化,并在Ruby 2.0.0发布了该优化,该优化使unshift 摊销后的O(1)平均保证为O(1),但单个操作可能为O(n )。这与的运行时间相同shift

这篇CS Stack Exchange帖子很好地解释了它是如何工作的,以及如何以O(1)摊销运行时间(这与C ++差不多vector::push_back,但它的工作方式相同)。


KL-*_*L-7 3

您可以在这里查看该方法的 C 源代码unshift(只需单击描述块)。非常清楚:如果内存容量不够,则增加内存容量,向前移动数组的当前内容,将传递的参数复制到内存块开头的可用空间。所以是O(n)为了unshift.