首先我要说我是Big-O表示法的新手。但是据我了解,我的方法不是O(1)。我必须将其设置为O(1),反正有这样做吗?
我的方法的功能是将数组的元素向下移动一个,以便可以更改element [0]。
我只是试图改变周围的事物,但是不找到一种方法,而不使用array.length(我相信它会变成O(n)。
,,,,,,0,,,,,,,,, ,,, ,,,,,,,10,14,24,,,,,,,,,10,6,16,,,,,,,,12,14.5,26.5,
我希望该方法使current = current-1(请参阅代码以获取更多详细信息),以便可以将新元素添加到数组中的第一个元素,而不会从当前数组中删除任何信息。
答案 0 :(得分:2)
是的,如果允许您更改正在使用的数据结构。
您可以使用链接列表,看起来像这样
/*
enqueue()
adds newItem to back of this Queue
pre: none
post: !isEmpty()
*/
public void enqueue(Object newItem) {
Node p = new Node(newItem);
if (isEmpty()) {
head = tail = p;
} else {
tail.next = p;
tail = p; // instead of p = tail;
}
}
答案 1 :(得分:2)
只要您不必扩展,就可以将O(1)中的所有操作视为圆形封闭(即,索引0再次跟随最后一个索引),则可以执行O(1)中的所有操作。您可以在该环形缓冲区中保留第一个和最后一个使用的元素的位置。确保至少一个位置总是空闲的,否则您将无法区分完全空的缓冲区和完全空的缓冲区的情况。
当您需要扩展时,可以安排事物,以使工作量摊销O(1)。例如,通过在需要扩展时将数组大小加倍。扩展本身是O(n)操作,因为您必须复制数组内容。但是,在采用双倍策略的情况下,许多操作(以及一些很少扩展的操作)的平均工作量仍为O(1)。
答案 2 :(得分:0)
如果您调整expandCapacity
方法以从两侧扩展数组并保留第一个元素的index
,则可以这样操作:
@Override
public Object enqueueFront(Object element) {
expandCapacity();
elementData[indexFirst - 1] = element;
indexFirst = indexFirst - 1;
return;
}
此实现为O(1)。
@Henry详细介绍了等效方法的时间复杂度。