【发布时间】:2022-01-23 02:55:00
【问题描述】:
我在某处读到,在未排序的数组中删除元素的速度更快,但我不确定这是否正确。 根据我的理解,如果我们想删除某个特定元素,那么在排序数组的情况下,搜索它并最终删除它需要 O(log N) 时间,但在未排序数组的情况下,最坏的情况可能需要在我们最终删除它之前线性搜索它的时间为 O(N)。 那么这怎么可能呢?
【问题讨论】:
标签: arrays algorithm time-complexity
我在某处读到,在未排序的数组中删除元素的速度更快,但我不确定这是否正确。 根据我的理解,如果我们想删除某个特定元素,那么在排序数组的情况下,搜索它并最终删除它需要 O(log N) 时间,但在未排序数组的情况下,最坏的情况可能需要在我们最终删除它之前线性搜索它的时间为 O(N)。 那么这怎么可能呢?
【问题讨论】:
标签: arrays algorithm time-complexity
如果您从数组中物理删除该元素,则从数组中删除元素是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
在排序数组中删除元素比在未排序数组中更快。
这是因为您可以对已排序的数组进行二分搜索以找到指定的元素。
未排序的数组必须逐个检查每个元素(线性搜索)以找到要删除的元素。
删除操作本身的时间复杂度相同。
O(log N) 比 O(N) 花费 更少 时间来执行。
【讨论】: