我正在尝试实现一个具有最小堆和最大堆功能的二进制堆(优先级队列)。它需要有一个insert(value)
, extractMin()
, 和一个extractMax()
方法。extract 方法从堆中删除值并返回值。
我最初使用两个数组,称为minHeap
and maxHeap
,一个将数据存储在最小堆结构中,另一个将相同的数据存储在最大堆结构中。因此,当我调用时extractMin()
,它会从 中删除并返回值minHeap
。然后我也必须从中删除该值maxHeap
(如果我调用 ,反之亦然extractMax()
),以保持两个堆中的数据集相同。而且由于堆顺序属性,可以保证我会在另一个堆的叶子中找到该值。在另一个堆中搜索该值会导致时间复杂度为 O(n) 或更准确地说是 O(n/2),因为我只会搜索叶子。更不用说,percolatingDown()
和percolatingUp()
删除值后恢复堆的方法已经是 O(log n);所以总的来说,提取方法将是 O(n)。问题是,我需要提取方法为 O(log n)。
有没有更好的方法来解决这个问题?
我也想过这个想法,但想知道大家首先是怎么想的。
我刚刚完成了一个“中值堆”的编码,将较小的一半数据放在最大堆中,将较大的一半放在最小堆中。使用该结构,我可以轻松检索给定值集的中值。我正在考虑使用类似的结构,将较小的一半数据放在最小堆中,将较大的一半放在最大堆中,并使用所有值的平均值(而不是中位数)作为决定是否调用时将值放在最大或最小堆中insert(value)
。我认为这可能会起作用,因为提取方法将保持 O(log n)。