在我之前的问题(Calculating Space Complexity of Stack Search)中,有人说你不应该在堆栈中使用搜索(item)或删除(item)。我选择堆栈的原因是因为它似乎更容易弹出而不是访问array.length-1,如果你一直在寻找LIFO。
使用这些非传统的堆栈操作是否会影响pop,peek和push的O(1)运行时?
答案 0 :(得分:2)
在Stack上使用Vector类中的remove(item)是否会保持O(1)pop,peek,push run times?
这取决于href="#"
的实现方式以及Stack的底层实现是什么(在这种情况下,你说它是Java remove
,所以它取决于Vector
的方式实施)。
如果基础数据结构是基于链表的,那么我们必须迭代到我们想要移除的位置,这是Vector.remove
操作,其中O(n)
是向量的长度。如果底层数据结构是基于数组的,那么它是一个O(1)索引,可以到达我们想要删除的位置。这里的问题是如果我们想要删除数组开头的元素,那么我们必须将每个元素移到左边,这是一个线性时间操作。因此,这也是n
最坏情况。
在Java中,O(n)
类是使用数组作为底层结构实现的。这意味着如果Vector
实现查找Stack.pop
中的最后一个元素,Vector
将不必移位任何元素,因此运行时为O(1)。
这个问题的博士“有时候”。
使用这些非传统的堆栈操作是否会影响pop,peek和push的O(1)运行时?
Vector
肯定是一个O(n)操作(即,它正在迭代寻找你要求的元素)。
要回答这个问题,使用这些非传统的堆栈操作不会影响search
,pop
和peek
的O(1)运行时。也就是说,push
和search
本身的运行时间确实为O(n)。