无论如何,我可以在Big-O中将此方法设为O(1)吗?

时间:2019-03-29 04:13:01

标签: java big-o

首先我要说我是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(请参阅代码以获取更多详细信息),以便可以将新元素添加到数组中的第一个元素,而不会从当前数组中删除任何信息。

3 个答案:

答案 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详细介绍了等效方法的时间复杂度。