DualArrayDeque表示使用两个ArrayStacks的列表。双阵列队列add(i,x)的运行时间
List<T> front;
List<T> back;
void add(int i, T x) {
if (i < front.size()) {
front.add(front.size()-i, x);
} else {
back.add(i-front.size(), x);
}
balance();
}
忽略balance()的运行时间。如果i < front.size()
,add(i,x)
运行时间是O(i+1)
。将0-i元素向左移[O(i)
]并将第i个元素指定给x [O(1)
]。同样,当i > front.size()
,它是O(n-i+1)
;
front.size()
和back.size()
相差不超过3倍。特别是,3 · front.size() ≥ back.size()
和3 · back.size() ≥ front.size()
。因此,如果i < n/4
和O(1 + n − i)
如果i ≥ 3n/4
运行时间是O(1 + i)
;
我的问题是当n/4 <= i < 3n/4
,为什么add(i,x)
的运行时间是O(n)
?
PS:我正在阅读Open Data Structure http://opendatastructures.org/ods-java/2_5_DualArrayDeque_Building.html。我很困惑,为什么它是O(n)
。