std::priority_queue
テンプレートは、ヒープのすべてのプロパティを提供します。一定時間の最大または最小抽出(アイテムの比較方法に応じて)、および対数時間の挿入。<queue>
ヘッダーファイルにあります。
デフォルトでは、priority_queue
は最大ヒープです。
int numbers[11] = { 0, 9, 3, 4, 8, 12, 2, 11, 10, 1, 5 };
std::priority_queue<int> myheap(numbers, numbers + 11);
std::cout << "biggest " << myheap.top() << std::endl; // 12
myheap.pop();
std::cout << "biggest " << myheap.top() << std::endl; // 11
myheap.push(6);
std::cout << "biggest " << myheap.top() << std::endl; // 11
myheap.push(13);
std::cout << "biggest " << myheap.top() << std::endl; // 13
最小ヒープを作成する方法の例を次に示します。
std::priority_queue<
int,
std::priority_queue<int>::container_type,
std::greater<int>
>;
ストリーミング中央値アルゴリズムを実装するためのアプローチは、次のようになります。
- 中央値よりも小さいアイテムの最大ヒープを作成します
- 中央値よりも大きいアイテムの最小ヒープを作成します
- 新しいアイテムをヒープにプッシュするとき
- プッシュするヒープを決定し、そこにプッシュします
- ヒープのサイズの1つが他のヒープより1より大きい場合は、大きい方のヒープをポップし、その要素を小さい方のヒープに配置します。
次に、中央値は、大きい方のヒープのトップ、または両方のヒープのトップの平均のいずれかです。
ヒープを手動で管理する必要があると思われる場合はC++
、独自のランダムアクセスデータ構造で管理できるアルゴリズムを提供します。
std::make_heap
--イテレータエンドポイントによって指定された領域をヒープ化します
std::push_heap
--最初のN-1要素がすでにヒープであると想定し、N番目の要素をヒープに組み込みます
std::pop_heap
-領域の最初の要素を最後の位置に配置し、領域を再ヒープしますが、最後の要素はそのままにします