不会为非动态未排序数组列表删除O(n)?

时间:2015-02-07 00:39:42

标签: java arrays algorithm arraylist time-complexity

这属于stackoverflow.com/help/on-topic的“软件算法”,在这种情况下,是从未排序的数组列表中删除项目的软件算法

当我们讨论不同数据结构的大运行时,这是来自我的课程 enter image description here

我的问题是删除未排序的非动态数组的值。根据我们如何实施它(见下文)

,这不应该是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)时间内运行。 每个人都同意我的评估,还是我错过了什么?

1 个答案:

答案 0 :(得分:1)

是的,你是对的。你的getIndex函数平均运行在O(n)(O(1/2 * n),但我们通常对常量不感兴趣)。 remove函数中的其他代码以恒定时间运行,因此总运行时间为O(n + c),其中c是常量,表示总运行时间为O(n)。