【发布时间】:2017-12-04 10:40:01
【问题描述】:
动态数组是一种众所周知的数据结构:例如,我们分配一个包含 8 个元素的数组,并在插入到数组末尾时使用这些插槽。当我们没有插槽时,我们分配一个大小为 16 的数组,依此类推。我们得到O(1) 插入到末尾的摊销复杂性。动态数组以多种语言及其标准库实现。
这里的一个限制是插入到数组的开头是O(n),因为开头没有空闲插槽。但是为什么不在数组的开头和结尾都设置一些空闲槽呢?它可以在两端插入O(1),如果我们用完任一侧的空闲插槽,我们会像往常一样分配一个更大的数组。
它的内存效率将低于单端动态数组(因为我们需要在两侧维护空闲插槽),但在两侧插入 O(1) 并不是一个糟糕的权衡。或者是吗?还有其他缺点吗?我还没有看到这种数据结构在任何地方实现,它的致命缺陷是什么?
【问题讨论】:
-
我猜这取决于算法,如果您的算法要求您同时执行追加和前置操作,那么这种数据结构可能会给您带来一些好处。即使在这种情况下,跟踪最后一个元素的链表也可能更易于使用。
-
@Ankur 链表会更简单,但这里我也有
O(1)随机索引访问。 -
我猜大多数算法只是不需要在开头经常插入。 grep 一些 Python 代码库,并计算
append的数量与insert(0,的数量。所以大多数人只是懒得去创造它。
标签: arrays algorithm data-structures dynamic-arrays