Java 不会';非动态未排序数组列表的删除是否为O(n)?

Java 不会';非动态未排序数组列表的删除是否为O(n)?,java,arrays,algorithm,arraylist,time-complexity,Java,Arrays,Algorithm,Arraylist,Time Complexity,这属于stackoverflow.com/help/on-topic中的“软件算法”,在本例中,是从未排序数组列表中删除项的软件算法 这是我在课堂上讨论不同数据结构的big oh运行时时讲的 我的问题是关于移除未排序的非动态数组的值。这不应该是基于我们如何实现它的O(n)吗(见下文) 将在O(1)中运行。我从我的另一个问题中学到的是Big Oh“协调了运行代码所必须做的一切”,在本例中,它包括由O(n)绑定的getIndex函数。 因为remove方法由O(n)和O(1)组成,所以它将在O(n

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

这是我在课堂上讨论不同数据结构的big oh运行时时讲的

我的问题是关于移除未排序的非动态数组的值。这不应该是基于我们如何实现它的O(n)吗(见下文)

将在O(1)中运行。我从我的另一个问题中学到的是Big Oh“协调了运行代码所必须做的一切”,在本例中,它包括由O(n)绑定的getIndex函数。 因为remove方法由O(n)和O(1)组成,所以它将在O(n)时间内运行。
是每个人都同意我的评估还是我遗漏了什么?

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

您的复杂性分析是正确的。我最好的猜测是您引用的表引用了由索引给出的元素的移除,而不是值,因此调用<代码> GETIndex <代码>将是多余的。没有表具有删除值和索引平均值的移除,因为元素通常落在列表中间。是的,因为平均地,元素将在中心找到。(给定一个随机数组).是的,我一直对上半部分的变化感到困惑,因为我觉得这是说元素必须在中间,而它可以朝向前面或后面。在随机数组中,元素在上半部分发生的变化是50%,在下半部分发生的变化是50%。这与取1000000个介于0和1之间的随机数。所有这些随机数加起来总是在500000左右,因为0和1之间的随机数的平均值是0.5。平均而言,要找到正确的索引需要n/2次迭代。没有大O。你说O(n*1/2)没有意义是正确的,因为O(n*1/2)等于O(n).这两个大O函数是完全相同的。
 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--;