动态数组中给定元素值的remove方法的时间复杂度
Time complexity of remove method with a given element value in dynamic array
在学习数据结构时,我尝试使用静态数组在 Java 中实现动态数组,并尝试计算每种方法的时间复杂度。
对于以元素作为参数的remove 方法,我的代码包含一个if 语句来检查是否在数组中找到了给定的元素。只有当元素存在时,它才会执行删除操作。
我正在努力寻找这种方法的时间复杂度。是 O(n) 吗?有人可以解释一下吗?
public boolean remove(int ele) {
for (int i = 0; i < numberOfElements; i++) {
if (arr[i] == ele) {
removeAt(i);
return true;
}
}
return false;
}
public void removeAt(int index) {
if (index > numberOfElements) {
throw new IllegalArgumentException();
} else {
for (int i = index; i < numberOfElements - 1; i++) {
arr[i] = arr[i + 1];
}
numberOfElements--;
}
}
复杂度好像是O(N),N次遍历数组,N次移位一次。一旦删除元素,'if' 遍历其余元素以进行移位,进行 'i' 次迭代以查找元素并进行 'n - i' 次迭代以进行移位。在'if'的末尾,由于return和操作完成,外部'for'被破坏。
我认为您需要迭代到 'numberOfElements',而不是直接使用 'array.length'。
从数组中删除一个元素需要 O(n) 的时间,即使我们给出了要删除的元素的索引。排序数组的时间复杂度也保持为 O(n)。
在链表中,如果我们知道要删除的节点指向前一个节点的指针,我们就可以在O(1)时间内进行删除。
在学习数据结构时,我尝试使用静态数组在 Java 中实现动态数组,并尝试计算每种方法的时间复杂度。
对于以元素作为参数的remove 方法,我的代码包含一个if 语句来检查是否在数组中找到了给定的元素。只有当元素存在时,它才会执行删除操作。 我正在努力寻找这种方法的时间复杂度。是 O(n) 吗?有人可以解释一下吗?
public boolean remove(int ele) {
for (int i = 0; i < numberOfElements; i++) {
if (arr[i] == ele) {
removeAt(i);
return true;
}
}
return false;
}
public void removeAt(int index) {
if (index > numberOfElements) {
throw new IllegalArgumentException();
} else {
for (int i = index; i < numberOfElements - 1; i++) {
arr[i] = arr[i + 1];
}
numberOfElements--;
}
}
复杂度好像是O(N),N次遍历数组,N次移位一次。一旦删除元素,'if' 遍历其余元素以进行移位,进行 'i' 次迭代以查找元素并进行 'n - i' 次迭代以进行移位。在'if'的末尾,由于return和操作完成,外部'for'被破坏。
我认为您需要迭代到 'numberOfElements',而不是直接使用 'array.length'。
从数组中删除一个元素需要 O(n) 的时间,即使我们给出了要删除的元素的索引。排序数组的时间复杂度也保持为 O(n)。 在链表中,如果我们知道要删除的节点指向前一个节点的指针,我们就可以在O(1)时间内进行删除。