在堆栈上使用 Vector class 中的 remove(item) 是否会保持 O(1) 弹出、查看、推送 运行 次?

Will using remove(item) from Vector class on a Stack maintain O(1) pop, peek, push run times?

在我之前的问题 () 中,有人说您不应该在堆栈中使用 search(item) 或 remove(item)。我选择堆栈的原因是,如果您一直使用 LIFO,它似乎更容易弹出而不是访问 array.length-1。

使用这些非传统堆栈操作会影响弹出、查看和推送的 O(1) 运行时间吗?

Will using remove(item) from Vector class on a Stack maintain O(1) pop, peek, push run times?

这取决于 remove 是如何实现的以及 Stack 的底层实现是什么(在这种情况下,你说它是 Java Vector,所以它取决于Vector.remove 是如何实现的)。

如果底层数据结构是基于链表的,那么我们必须迭代到我们要删除的位置,这是一个O(n)操作,其中n是向量的长度.如果底层数据结构是基于数组的,那么它是一个 O(1) 索引,可以到达我们想要删除的位置。这里的问题是,如果我们想删除数组开头的一个元素,那么我们必须将每个元素向左移动,这是一个线性时间操作。因此,这也有一个 O(n) 最坏的情况。

在Java中,Vectorclass是使用数组作为底层结构实现的。这意味着如果 Stack.pop 实现查找 Vector 中的最后一个元素,Vector 将不必移动任何元素,因此运行时间为 O(1)。

这个问题的 tl;dr 是 "sometimes"。

Would using these non traditional stack operations impact O(1) runtimes of pop, peek, and push?

search 肯定是一个 O(n) 操作(即,它通过查找您要求的元素进行迭代)。

为了回答这个问题,使用这些非传统堆栈操作将不会影响poppeekpeek的O(1)运行时间push。也就是说,searchremove 本身确实有 O(n) 的运行时间。