fibonacci_heap
クラス · フィボナッチヒープ(decrease-key 対応)
template <class Key, class Value, class Comp = std::less<>>
struct fibonacci_heap;
概要
フィボナッチヒープ(decrease-key 対応)
順序基準の Key と付随データ Value を保持し、Comp で Key を比較する。 Comp = std::greater<> で Key 最小をルートにする最小ヒープになる (binary_heap / dary_heap と同じ規約)。 ノードを std::vector のプールに置き int インデックスで連結する index-pool 実装で、new/delete を一切行わない(コピー・ムーブも自動で正しい)。 push は安定なハンドルを返し、update で decrease-key できる。
備考
popしたノードはプールから物理削除しない(ハンドルの寿命は呼び出し側管理)。
構築・破棄
| 名前 | 説明 | 計算量 |
|---|---|---|
(constructor) |
空のフィボナッチヒープを構築する | $O(1)$ |
メンバ関数
| 名前 | 説明 | 計算量 |
|---|---|---|
empty |
空か返す | $O(1)$ |
size |
要素数を返す | $O(1)$ |
top |
最上位のkeyとvalueを返す | $O(1)$ |
push |
要素を追加して安定ハンドルを返す | 償却 $O(1)$ |
emplace |
要素を追加して安定ハンドルを返す | 償却 $O(1)$ |
pop |
最上位の要素を削除する | 償却 $O(\log n)$ |
update |
ハンドルの順序基準 key を更新する(ルート側へ近づく更新のみ反映)。 |
償却 $O(1)$ |
メンバ型
| 名前 | 説明 | 計算量 |
|---|---|---|
handle |
push が返す安定ハンドル。update に渡してその要素を decrease-key する。 |
構築・比較は $O(1)$ |
メンバの詳細
update
void update(handle h, Key key);
ハンドルの順序基準 key を更新する(ルート側へ近づく更新のみ反映)。
最小ヒープ(greater<>)では「より小さい key」への更新、つまり decrease-key に対応する。逆向きの更新は無視する。
- 計算量: 償却 $O(1)$
handle
struct handle;
push が返す安定ハンドル。update に渡してその要素を decrease-key する。
既定構築(handle{})は無効値で bool 文脈で false。
- 計算量: 構築・比較は $O(1)$
| メンバ | 説明 |
|---|---|
handle |
無効なハンドルを作る |
operator bool |
有効なハンドルなら true を返す |
operator== |
2 つのハンドルが同じ要素を指すか比較する |