java - 非动态未排序数组列表的删除不会是 O(n) 吗?

标签 java arrays algorithm arraylist time-complexity

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

当我们讨论不同数据结构的 big oh runtime 时,这是我类的 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) 绑定(bind)的 getIndex 函数。 因为 remove 方法由 O(n) 和 O(1) 组成,所以它将在 O(n) 时间内运行。 每个人都同意我的评估还是我错过了什么?

最佳答案

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

关于java - 非动态未排序数组列表的删除不会是 O(n) 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28377170/

相关文章:

java - 为两个不同的 JButton 设置不同的禁用颜色? (UIManager.getDefaults 更改两个按钮)

java - 需要通过网页获取路径位置

javascript - Array.prototype.filter - 是否可以使用多个条件过滤多个条件? [JS、VueJS]

java - 将数组与 Switch 语句一起使用时需要常量表达式

java - 哪个布局管理器可以在 Java 中进行此布局?

java - 如何在java中关闭ServerSocket.accept()命令?

.NET-SQL选择->数组。最快的方法是什么?

algorithm - 在线性时间内计算集合的模式(最频繁的元素)?

c++ - 有没有办法使用 transform 而不是 for_each 来实现这个?如果是,这样做真的更好吗?

algorithm - 使用递归实现东北路径时遇到问题