【问题标题】:Time complexity of remove method with a given element value in dynamic array动态数组中给定元素值的remove方法的时间复杂度
【发布时间】:2020-04-28 01:31:14
【问题描述】:

在学习数据结构时,我尝试使用静态数组在 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--;
        }
    }

【问题讨论】:

    标签: data-structures time-complexity dynamic-arrays array-algorithms


    【解决方案1】:

    复杂度似乎是 O(N),其中 N 迭代数组,N 执行一次移位操作。一次元素被删除,'if' 迭代其余元素以进行移位,执行 'i' 迭代以找到元素,并执行 'n - i' 迭代以对其进行移位。在'if'的末尾,外部'for'被破坏,因为返回和操作完成。

    我认为您需要迭代直到 'numberOfElements' 而不是直接使用 'array.length'。

    【讨论】:

    • 哦,对了!谢谢指正!我应该迭代直到 numberOfElements 但不是 arr.length。谈到时间复杂度,我从您的回复中了解到,它是 O(n),因为内部循环只执行一次。我说的对吗?
    • 是的。 'if' 内部有一个中断迭代的返回。然后运行 ​​1 次。
    • 谢谢你的解释:)
    【解决方案2】:

    即使给定要删除的元素的索引,从数组中删除元素也需要 O(n) 时间。排序数组的时间复杂度也保持为 O(n)。 在链表中,如果我们知道要删除的节点的前一个节点的指针,就可以在O(1)时间内完成删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-01
      • 2020-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多