【问题标题】:Is deletion of an element faster in unsorted array?在未排序的数组中删除元素是否更快?
【发布时间】:2022-01-23 02:55:00
【问题描述】:

我在某处读到,在未排序的数组中删除元素的速度更快,但我不确定这是否正确。 根据我的理解,如果我们想删除某个特定元素,那么在排序数组的情况下,搜索它并最终删除它需要 O(log N) 时间,但在未排序数组的情况下,最坏的情况可能需要在我们最终删除它之前线性搜索它的时间为 O(N)。 那么这怎么可能呢?

【问题讨论】:

    标签: arrays algorithm time-complexity


    【解决方案1】:

    如果您从数组中物理删除该元素,则从数组中删除元素是O(n) 操作。那是因为必须移动已删除元素右侧的所有元素。如果元素位于数组的末尾,这只是一个O(1) 操作,因此我们可以弹出它。

    现在,在一个未排序的数组中,您只需将找到的元素与 O(1) 中数组末尾的元素交换,然后从末尾弹出一个元素,也是在恒定时间内。

    但是在一个排序数组中,如果你想保持排序,你不能这样做。您必须物理移除元素以保持数组排序。

    因此,为了清楚起见,您需要明确说明从排序数组中删除一个元素并保持其排序是O(n)。如果你不关心它是否被排序,你可以在O(1) 中删除它。搜索是对数的,所以这变成对数。但是你只能这样做一次。因为在那之后数组不再排序,您无法在 log n 时间内搜索您的元素。

    【讨论】:

    • 请阅读全文,我已经解释了这两种可能性。你只是在看第一段。
    • 现在我重新阅读了我的帖子,我发现您可能误读了第一段。它说:Deleting an element from an array is a O(n) operation **if** you physically remove that element from the array. 然后是你引用的部分:That's because all the elements to the right of the deleted element must be shifted. 这是对之前情况的解释。有一个重要的背景@greybeard
    • 所以我觉得你想说的是,如果我们只关注删除元素的标准而不关注搜索模式,那么在未排序数组的情况下它只会花费恒定的时间,而由于元素的移动以保持排序,因此排序数组将花费线性时间。但是,如果总体上我们考虑使用搜索时间删除,那么两者都将采用线性时间复杂度。我对吗? @user1984
    • 没错。总而言之:搜索一个是线性的,另一个是对数的。在 unsorted 中删除是恒定的,而在 sorted 中是线性的,除非我们准备销毁 sorted 属性。这使得搜索和删除的组合在两种情况下都是线性的,除非您在已排序的数组中搜索并在恒定时间内删除(您只能执行一次,因为它不再被排序)。
    • @user1984 非常感谢。
    【解决方案2】:

    在排序数组中删除元素比在未排序数组中更快。

    这是因为您可以对已排序的数组进行二分搜索以找到指定的元素。

    未排序的数组必须逐个检查每个元素(线性搜索)以找到要删除的元素。

    删除操作本身的时间复杂度相同。

    O(log N) 比 O(N) 花费 更少 时间来执行。

    【讨论】:

      猜你喜欢
      • 2015-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多