Radix heap (基数ヒープ)
(data_structure/radix_heap.hpp)
std::priroity_queue
と同様の機能を提供するヒープだが,「最後に取り出した値以上の値しか追加できない」という制約があり(本実装では更に,top()
などのクエリで最後に「見た」以上の値しか追加できないという制約も加わる),また本実装では符号なし整数型に使用が限られる.ヒープがキーとして持つ整数型のビット数を $D$ とおくと,一度追加した要素に対しては演算が高々 $O(D)$ 回しか発生しないため,クエリ毎の計算量は償却 $O(D)$ で,定数倍にも優れているとされる.Dijkstra 法や各種フローアルゴリズムの定数倍高速化などに活用できる.
使用方法
radix_heap<unsigned, string> pq, pq2;
pq.push(5, "a");
pq.emplace(1, "b");
cout << pq.top_key() << ' ' << pq.top_label() << '\n'; // 1 b
cout << pq.top().first << ' ' << pq.top().second << '\n'; // 1 b
pq.push(2, "c");
pq.push(3, "d");
cout << "size=" << pq.size() << '\n'; // size=4
while (pq.size()) {
cout << pq.top_key() << ' ' << pq.top_label() << '\n';
// 1 b
// 2 c
// 3 d
// 5 a
pq.pop();
}
pq.push(50, "heap1");
pq2.push(100, "heap2");
pq.swap(pq2);
cout << pq.top_label() << ' ' << pq2.top_label() << '\n'; // heap2 heap1
問題例
リンク
Verified with
Code
Back to top page