时间复杂度和列表中的add()

时间:2015-01-17 12:01:05

标签: java performance algorithm time complexity-theory

这是一个算法。因为它只是一个for循环我会把它看作O(N),但我被告知它是O(N2)。我被告知这是因为list.add,但这不会改变N?那么为什么时间复杂度会发生变化?

public static void mystery3(List<String> list) {
        for (int i = 0; i < list.size() - 1; i += 2) {
            String first = list.remove(i);
            list.add(i + 1, first);
        }
    }

1 个答案:

答案 0 :(得分:2)

如果您正在使用数组(Arraylist),remove(i)需要O(n)而add(...)需要O(n)。这是因为在索引i处查找元素需要O(1)但调整大小需要O(n)。

如果使用链表,remove(i)取O(n),'add(...)取O(n)。这是因为在索引i处查找元素需要O(n)并且删除需要O(1)。

由于您调用方法n / 2次,因此其整个运行时间为O(n ^ 2)。