【发布时间】:2015-04-07 06:26:15
【问题描述】:
这属于 stackoverflow.com/help/on-topic 中的“软件算法”,在这种情况下,是从未排序的数组列表中删除项目的软件算法
这是我们在课堂上讨论不同数据结构的大运行时
我的问题是关于删除未排序的非动态数组的值。根据我们的实现方式,这不应该是 O(n)(见下文)
public void remove(E value) {
int index = getIndex(value);
elementData[index] = elementData[size - 1];
elementData[size - 1] = null;
size--;
}
public int getIndex(E value) {
for (int i = 0; i < size; i++) {
if (elementData[i].equals(value)) {
return i;
}
}
return -1;
}
虽然我同意这个代码段
elementData[index] = elementData[size - 1];
elementData[size - 1] = null;
size--;
将在 O(1) 中运行。我从另一个问题Why is clear an O(n) operation for linked list? 中学到的是,Big Oh“考虑了运行代码必须做的所有事情”,在这种情况下,它包括受 O(n) 约束的 getIndex 函数。 因为 remove 方法由 O(n) 和 O(1) 组成,所以它将在 O(n) 时间内运行。 大家都同意我的评估还是我遗漏了什么?
【问题讨论】:
-
您的复杂性分析是正确的。我最好的猜测是,您引用的表是指删除由索引而不是值给出的元素,因此对
getIndex的调用将是多余的。 -
没有表有删除值并按索引删除
标签: java arrays algorithm arraylist time-complexity