我有一個maxheap和minheap其中maxheap的最大元素小於或等於所述minheap的最小元素。移動minheap.top到maxheap.top其中maxheap.top <= minheap.top
我現在想移動minheap的最小元素成爲maxheap的最大元素。要做到這一點
的一種方法是,以彈出minheap的頂部元素,並把它壓入maxheap。
有沒有更有效的方法來做到這一點?
以下是我最後做:
其實我有插入一個元素minheap然後執行上述操作,我做了以下內容:
// place value to insert at end of minheap
mintoph[mintoph_size] = R;
// use std::pop_heap, minimum element now at end
pop_heap(mintoph.begin(), mintoph.begin() + mintoph_size + 1, greater<int>());
// (*) make room in maxheap at top
for (int pos = maxboth_size++; pos > 0;)
{
int parent = (pos - 1)/2;
maxboth[pos] = maxboth[parent];
pos = parent;
}
// move element from back of minheap to maxheap head
maxboth[0] = mintoph[mintoph_size];
有一個在上面的步驟(*)
處浪費已付費的比較,因爲父母被降級爲子女,但我認爲這是不可避免的。
我不認爲有「交叉優化」的基礎上的事實,你有兩個數據結構的任何方式;畢竟,他們都必須獨立地維護它們的不變量(當然,除非您準備轉向不同的數據結構)。我認爲唯一可以幫助你的事情就是你要插入的物品保證是最大的。 – 2012-07-06 19:25:35
順便提一下,您的問題標題(「maxheap.top to minheap.top」)與您的問題主體不符(「移動minheap的最小元素...」)。 – 2012-07-06 19:30:11
實際上我想去兩個方向,但它是一個鏡像,所以一種方式將提供另一種方式。 – 2012-07-06 19:32:37