在Stack上使用Vector类中的remove(item)是否会保持O(1)pop,peek,push run times?

时间:2015-12-28 01:38:34

标签: java algorithm data-structures stack big-o

在我之前的问题(Calculating Space Complexity of Stack Search)中,有人说你不应该在堆栈中使用搜索(item)或删除(item)。我选择堆栈的原因是因为它似乎更容易弹出而不是访问array.length-1,如果你一直在寻找LIFO。

使用这些非传统的堆栈操作是否会影响pop,peek和push的O(1)运行时?

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)操作(即,它正在迭代寻找你要求的元素)。

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