这个(简单)代码的时间复杂度是多少?

时间:2013-09-28 23:37:57

标签: java time complexity-theory

我试图找出下面代码的运行时间,如果列表是一个arraylist并且它是一个链表。我很感激任何建议!

数组:我认为删除操作是O(n),循环是N / 2,所以O(n ^ 2)

LinkedList:只有引用更改,因此删除的循环时间和循环的N / 2,所以O(n)

int halfSize = lst.size() / 2;

for (int i = 0; i < halfSize; i++){
    lst.remove(0);
}

1 个答案:

答案 0 :(得分:2)

<强>的ArrayList :  评估正确,由于基础array copy

    public E remove(int index) {
    rangeCheck(index);

    modCount++;
    E oldValue = elementData(index);

    int numMoved = size - index - 1;
    if (numMoved > 0)
        System.arraycopy(elementData, index+1, elementData, index,
                         numMoved);
    elementData[--size] = null; // Let gc do its work

    return oldValue;
}

<强>链表: 评估正确,节点删除@zero索引是常量

public E remove(int index) {
    checkElementIndex(index);
    return unlink(node(index));
}

/**
 * Returns the (non-null) Node at the specified element index.
 */
Node<E> node(int index) {
    // assert isElementIndex(index);

    if (index < (size >> 1)) {
        Node<E> x = first;
        for (int i = 0; i < index; i++)
            x = x.next;
        return x;
    } else {
        Node<E> x = last;
        for (int i = size - 1; i > index; i--)
            x = x.prev;
        return x;
    }
}