为什么在排序数组上"删除"操作被认为是"慢"的?



我目前在Tim Roughgarden的著名斯坦福课程的帮助下学习算法和数据结构。在视频13-1中,当解释平衡二进制搜索树时,他将它们与排序数组进行了比较,并提到我们不删除排序数组,因为它太慢了(我相信他的意思是"与其他操作相比慢,我们可以在常量[Select,Min/Max,Pred/Succ],O(log n([Search,Rank]和O(n([Output/print]时间中运行">(。

我无法停止思考这句话。也就是说,我无法将我的思想包裹在以下内容上:

假设我们得到一个订单统计数据或项目的值要从排序(升序(数组中删除。

我们可以使用Select或分别在常数或O(n(时间内搜索。

然后,我们可以删除此项并在右侧的项上进行迭代删除的,将其索引增加一O(n(时间。[这是我试图描述的(可能没有成功("将它们中的每一个向左移动一个位置"操作]

在最坏的情况下,整个操作将花费线性时间-O(n(脚本

关键问题-我的想法有错吗?如果不是,为什么它被认为是缓慢和不可取的?

你是对的:从数组中删除很慢,因为你必须将数组后面的所有元素向左移动一个位置,这样你就可以覆盖你创建的洞。

O(n)是否被认为是缓慢的取决于情况。从数组中删除很可能是更大、更复杂算法的一部分,例如在循环中。这会给你的最终复杂度增加一个因子n,这通常是不好的。使用树只会添加一个因子log n,并且O(n log n)O(n^2)好得多(渐近(。

该语句与用于保存排序值的特定数据结构有关:排序数组。选择这种特定的数据结构是为了简单、高效存储和快速搜索,但在添加和删除数据结构中的元素时速度较慢。

可以选择保持排序值的其他数据结构。例如,二叉树、平衡二叉树或trie。每种都在操作性能和存储效率方面具有不同的特性,并将根据预期用途进行选择。

排序数组的添加和删除速度较慢,因为平均而言,这些操作需要移动数组的一半,为新元素腾出空间(或者分别填充空单元格(。

然而,在许多体系结构上,数据结构的简单性和移位速度意味着数据结构适合"小"数据集。

相关内容

最新更新