哪个更好地找到最小元素堆栈或堆数据结构

时间:2013-03-15 17:54:44

标签: algorithm data-structures stack heap

哪一个更好,实现堆栈以获取最小元素或维护堆数据结构以提取最小元素。两者都给出O(1)中的最小元素(如果实现2个堆栈,一个具有最小元素,另一个堆栈具有实际输入)。

解释一下,在哪些情况下我们可以使用Stack或堆来提取最小或最大元素以及为什么

4 个答案:

答案 0 :(得分:2)

您基本上可以使用a solution based on two stacks来查找最小值,但它无效(因为它占用2 * N内存,而堆消耗N内存)并且堆栈应该用于其他目的。

答案 1 :(得分:1)

类似堆栈的数据结构[1]和堆都支持“获得最小”操作。 (请注意,我们讨论的是堆数据结构,而不是用于内存分配的“堆”。)它们都允许添加新元素。

他们在删除元素方面有所不同。具体来说,使用堆栈,您可以按照与插入相反的顺序删除元素。使用堆,您可以按值按顺序删除元素(即始终删除最小值)。

所以你应该使用支持你需要的操作的那个。


[1]所引用的数据结构是两个并行堆栈,或一堆项目;在这两种情况下,堆栈都会保留添加的项目和最小值,这可以在O(1)中计算,因为它只是推送项目的最小值和之前的最小值。

答案 2 :(得分:0)

MinHeaps旨在快速为您提供最小元素。只是偷看最小元素(不删除)需要O(1)(常数)时间。通常,您将删除最小元素,这将强制您重新堆积堆,这需要log(n)时间。 wikipedia article图显示了MaxHeap,但实现MinHeap几乎完全相同。

要查找(单个)堆栈中的最小元素需要 n 时间(和log(n)< n),因为您必须搜索堆栈中的所有元素才能找到最低。因此,您需要关闭每个元素pop(),检查它是否小于您记住的最小值,并将它()推送到辅助堆栈,直到您完成整个堆栈。因此,如果获取最小元素是数据结构的主要目的,通常需要使用MinHeap。

另一方面,其他人提到的双栈解决方案对于操作(添加,删除和getMin)具有O(1)复杂度,但对于removeMin具有O(n)时间。在最坏的情况下,它还有2N的空间要求。

总结:

              add/push 1    remove/pop 1   peekMin   removeMin   space
              ==========    ============   =======   =========   =====
one stack         O(1)          O(1)         O(n)       O(n)       n
two stacks        O(1)          O(1)         O(1)       O(n)      2n
minHeap         O(log(n)        N/A          O(1)     O(log n)     n

正如@rici指出minHeap,支持在O(log n)中的removeMin操作,即比堆栈更快,但是,对于add / remove和peekMin,双栈解决方案更快。 minHeap也不维持秩序,在“大于”和“小于”的关系之外。

答案 3 :(得分:0)

我真的不明白这个问题。

似乎与问题相似:我应该使用锤子还是壶?答案是:为了什么目的?

堆和堆栈的目的/行为不同

Heap提供的API类似于:Insert(Key x),GetandDeleteMin()

虽然堆栈提供了LIFO(后进先出)API:推送(值x),值弹出()(如果需要,可以使用GetMin())。

你应该问自己的问题是,我是否需要支持min的LIFO结构?如果是这样,您可以使用堆栈。

OR

我是否需要一个“优先级结构”,我可以按随机顺序插入,并删除优先级最高/最低的那个?如果是这样,您可以使用堆。

即。您应首先查看您所需的行为

比较运行时间和空间使用情况的所有这些答案对我来说也很奇怪。当使用本质上不同时,甚至可以做什么比较?首先确定行为,然后如果您有选择,请进行时间/空间等比较。

你真正想要的是什么?