maxheapとminheapがあり、maxheapの最大要素がminheapの最小要素以下です。
ここで、minheapの最小要素を移動して、maxheapの最大要素にします。
これを行う1つの方法は、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];
親が子供に降格されるため、上記のステップですでに支払われた比較の無駄がありますが、(*)
これは避けられないと思います。