インターバルヒープ(区間ヒープ)とは?データ構造の基本をわかりやすく解説
インターバルヒープとは
インターバルヒープ(Interval Heap)は、両端優先度キュー(Double-Ended Priority Queue)を効率的に実装するために用いられるデータ構造です。完全二分木の一種であり、最後のノードを除くすべてのノードが2つの要素を持つという特徴があります。
ノードと区間の関係
ノードPに格納された2つの要素の優先度を「a」と「b」とし、a ≤ b が成り立つものとします。このとき、ノードPは閉区間 [a, b] を表すと定義されます。ここで、a を区間の左端点、b を右端点と呼びます。
ある区間 [c, d] が区間 [a, b] に包含されるのは、次の条件が成り立つとき、かつそのときに限ります。
a ≤ c ≤ d ≤ b
親子ノード間の包含条件
インターバルヒープでは、各ノードPの左の子および右の子が表す区間は、必ずP自身が表す区間に包含されていなければなりません。つまり、木を根から葉に向かうほど区間が狭くなっていく構造になっています。
また、最後のノードが要素を1つしか持たない場合(優先度を c とする)、その親ノードの区間を [a, b] としたときに、a ≤ c ≤ b という条件を満たす必要があります。
最小ヒープと最大ヒープの性質を併せ持つ
インターバルヒープの重要な性質として、以下の2点が挙げられます。
- すべてのノードの左端点だけに着目すると、木全体が最小ヒープ(Min Heap)の構造になっている
- すべてのノードの右端点だけに着目すると、木全体が最大ヒープ(Max Heap)の構造になっている
この性質により、インターバルヒープは最小ヒープと最大ヒープの役割を1本の木で同時に実現できるのです。
主な操作と計算量
- 最小値の参照: 根ノードの左端点を見るだけでよいため、O(1) で取得可能
- 最大値の参照: 根ノードの右端点を見るだけでよいため、O(1) で取得可能
- 挿入・削除: ヒープの再構築が必要なため、O(log n)
応用例
インターバルヒープは、最小値と最大値の両方を高速に取り出したい場面で活躍します。具体的には、タスクスケジューリング、イベント駆動シミュレーション、ストリームデータからの中間値や極値の管理など、両端優先度キューが必要となるさまざまなアルゴリズムで利用されています。
-
データ構造入門:圧縮四分木と八分木(Octree)の基礎と活用法
圧縮四分木(Compressed Quadtree)とは四分木では、分割されたセルごとにノードを保存していくため、データを持たない空のノードが大量に発生しがちです。こうした疎なツリーのサイズを抑えるには、意味のあるデータを保持する葉を持つ部分木、いわゆる「重要な部分木」だけを保存すれば十分です。さらにサイズを削減することも可能です。重要な部分木だけを扱う場合、枝刈りの過程で、中間ノードの次数が2(親へのリンク1つと子へのリンク1つのみ)であるような長いパスを取り除けます。実際には、そのパスの始点にあるノードUだけを保存し(削除したノード群を表すメタデータをUに関連付けておき)、パスの終点を根と
-
ハーフエッジデータ構造(HalfedgeDS)とは?基本概念とCGAL実装例をわかりやすく解説
はじめにテンプレートパラメータとして用いられるハーフエッジデータ構造(Halfedge Data Structure、略称 HalfedgeDS)は、頂点・辺・面の接続情報(インシデンス情報)を管理できる、辺を中心としたデータ構造として定義されています。平面地図(planar map)や多面体など、任意の次元空間に埋め込まれた向き付け可能な2次元曲面の表現に適した構造です。このデータ構造では、各辺が逆向きの向きを持つ2つのハーフエッジ(半辺)に分割されます。各ハーフエッジは、隣接する1つの面と1つの頂点への参照を保持し、逆に各面および各頂点にも、それぞれ1つの接続ハーフエッジが格納されます。さ