是Java的ArrayList Iterator O(n ^ 2)还是O(n)的remove方法?迭代列表时?

时间:2016-07-26 23:20:20

标签: java iterator time-complexity

我使用while循环遍历ArrayList,并在符合某个条件的情况下就地删除值。我的代码符合以下代码段的精神:

    List<Integer> list = new ArrayList<>();
    int N = 1000
    // setup list to show as an example
    for (int i = 0; i < N; i++) {
        list.add(i);
    }

    Date start = new Date();
    // iterate over entire list, removing half the values
    Iterator<Integer> iter = list.iterator();
    while (iter.hasNext()) {
        Integer in = iter.next();
        if (in % 2 == 0) {
            // is it even?
            iter.remove();
        }
    }

    Date end = new Date();
    System.out.println(end.getTime() - start.getTime());
    System.out.println(list.size());

我想知道的是这个迭代器循环的时间复杂度是O(N)还是O(N ^ 2)。我相信它是O(N ^ 2),因为Java ArrayList是在常规数组上支持的,并且对于每次删除,你必须将后续值的O(N)向左移动以保持数组在一个理智的状态。

1 个答案:

答案 0 :(得分:-1)

我的问题的回复都没有提供Iterator.remove如何工作的证据,所以我做了自己的测试。我的个人测试让我相信时间复杂度是O(N ^ 2)。以下是来自3个不同测试的数据,其中每个“时间”值是10次迭代的平均值:

N = 10,000 时间= 8毫秒

N = 100,000 时间= 487毫秒

N = 200,000 时间= 2026ms

列表大小加倍会导致运行时间延长大约4倍。