STLヒープは減少キーをサポートしていませんが、ベクトルの値を直接変更するだけで、O(n)時間のmake_heapを再度呼び出すことができます。しかし、これはO(logn)時間がかかるバイナリヒープ減少キーほど効率的ではありません。STLヒープをO(logn)時間で実行する減少キー
STLヒープ関数を使用してO(logn)時間を達成する方法はありますか?
STLヒープは減少キーをサポートしていませんが、ベクトルの値を直接変更するだけで、O(n)時間のmake_heapを再度呼び出すことができます。しかし、これはO(logn)時間がかかるバイナリヒープ減少キーほど効率的ではありません。STLヒープをO(logn)時間で実行する減少キー
STLヒープ関数を使用してO(logn)時間を達成する方法はありますか?
あなたはpush_heap
に続く値をデクリメント続いpop_heap
を使用することができます。
int main() {
//Create the heap
std::vector<int> heap{1,2,3,4,5,6,7};
std::make_heap(heap.begin(), heap.end());
//Decrease key
std::pop_heap(heap.begin(), heap.end());
--*(std::prev(heap.end()));
std::push_heap(heap.begin(), heap.end());
}
EDIT:これはあなたが何を意味するかですか、でどの要素のキーを減少させることができるようにしたいんヒープ?
私はそれを行うための標準的な準拠の方法はありませんかなり確信している - Wikipedia says so tooは:
それが行くんが減少/増加、キー操作のための標準サポート
はありませんgheap
ライブラリを指し示すようにしてください。これは一見価値があるかもしれません。
ここでの問題は、標準ではヒープ構造がどのような形式をとるのか、どのように操作が正確に行われるのかを規定していないことです。
実装で標準のバイナリヒープを使用している場合は、要素を単にheap[i]
に減らしてから、push_heap(heap.begin(), heap.begin() + i + 1)
を呼び出すと、必要なアップヒープ操作が実行されます。位置i
に終わる要素は、もともとの値より大きくなくてはならないため、ヒープ全体のヒーププロパティが保持されます。しかし、いくつかの実装では時々動作するとしても、これは標準によってサポートされていません。
残念ながら – Jake