Я обнаружил, что самый простой и наиболее точный способ ответить на этот вопрос - проверить его.
require 'benchmark'
Benchmark.bm do |x|
iterations = 10000000
x.report("push") {
a = []
iterations.times do a.push(10) end
}
x.report("unshift") {
a = []
iterations.times do a.unshift(10) end
}
a = []
iterations.times do a.push(10) end
x.report("shift") {
iterations.times do a.shift() end
}
a = []
iterations.times do a.push(10) end
x.report("pop") {
iterations.times do a.pop() end
}
end
В моей системе с запущенной версией ruby 2.0.0
это возвращает результаты:
user system total real
push 0.880000 0.030000 0.910000 ( 0.917213)
unshift 0.920000 0.090000 1.010000 ( 1.026208)
shift 0.780000 0.030000 0.810000 ( 0.810293)
pop 0.710000 0.000000 0.710000 ( 0.724865)
Кажется, что push
, pop
, shift
и unshift
занимают примерно одинаковое количество времени.
Повторный запуск этого кода с другими значениями для iterations
дает мне результатыэта шкала пропорционально сумме, которую я изменил iterations
.Это означает, что независимо от значения iterations
каждая операция всегда занимает в среднем одно и то же время, а это означает, что время выполнения каждой операции не зависит от длины массива и поэтому имеет время выполнения O(1)
.
Я бы сказал, что это будет приемлемо для использования в качестве очереди.