我使用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)向左移动以保持数组在一个理智的状态。
答案 0 :(得分:-1)
我的问题的回复都没有提供Iterator.remove如何工作的证据,所以我做了自己的测试。我的个人测试让我相信时间复杂度是O(N ^ 2)。以下是来自3个不同测试的数据,其中每个“时间”值是10次迭代的平均值:
N = 10,000 时间= 8毫秒
N = 100,000 时间= 487毫秒
N = 200,000 时间= 2026ms
列表大小加倍会导致运行时间延长大约4倍。