【发布时间】:2020-05-31 02:46:09
【问题描述】:
考虑一个我们知道从 0 开始依次包含从 0 到 n 的整数的数组。例如:
a=[0,1,2]
现在,我们弹出位置 1 的元素。
a.pop(1)
我们剩下的数组:
[0,2]
我们有 a[0]=0,a[1]=2。 让我们弹出位置 0 的元素。
a.pop(0)
我们只剩下:
[2]
现在,引用 a[0] 将产生 2。
这是我想要的行为,除了弹出操作的时间为 O(n),因为需要将整个数组复制到左侧。有没有办法更有效地做到这一点,以便每个弹出(或等效)操作不超过 O(log(n))?如果需要,可以占用另一个 O(n) 空间。
在上面显示的操作序列之后,最后查询索引 0 应该仍然返回 2。我尝试将弹出的元素存储在二叉搜索树中(实际上没有弹出),但逻辑变得太复杂了。
【问题讨论】:
-
这是一个列表而不是一个数组。您可以使用
collections.deque,它在两端提供高效的弹出/插入 -
也在中间?阵列可能非常大,并且大多数爆裂声可能发生在中心。
-
不,不在中间。我读了
pop(0)两次。我的错误 -
list基于array,它为您提供O(1)访问时间,而如果您想弹出元素,则需要O(n)时间来弹出元素。如果你有一棵树,比方说 RB-tree,它可以用O(log(n))时间弹出一个元素,但你也需要O(log(n))时间来访问一个元素。所以这里是权衡。如果要O(1)的访问时间,相信不可能有O(log(n))的弹出时间。 -
@Sraw "
listis based onarray" 与“Python 基于计算机”差不多。如果你想让它被认真对待,你必须更具体地说明该声明的含义。