最大HBLTから任意のノードを削除する方法と計算量の解説
最大HBLTにおける任意のノード削除とは
最大HBLT(Height-Biased Leftist Tree:高さ偏り左木)や最小HBLTから任意のノードを削除することは、優先度付きキュー(プライオリティキュー)やHBLTにおける標準的な操作ではありません。しかし、特定の要件によっては、指定したノードKをHBLTから取り除く必要が生じる場合があります。その際は、以下のルールに従って削除を行います。
削除の基本ルール
サブツリーの分離とmeld(併合)による置換: ノードKを根とする部分木を木全体から切り離し、その位置にノードKの左右の部分木をmeldした結果を配置します。
s値の更新と部分木の交換: ノードKから根(ルート)に至る経路上のs値を更新し、HBLTの性質を維持できるよう、必要に応じて経路上の部分木を交換します。
s値更新の仕組み
Kから根へ向かってs値を更新するためには、各ノードが親ポインタを持っている必要があります。この更新操作は、途中でs値が変化しないノードに到達した時点で終了できます。
更新されるs値は必ず昇順の列を形成します。これは、各ノードのs値が直前のノードより必ず1大きくなければならないというHBLTの性質によるものです。s値の最大値はO(log n)であり、すべてのs値が正であることから、更新パス上で処理されるノード数は最大でもO(log n)個にとどまります。さらに、各ノードのs値更新には定数時間O(1)しかかかりません。
計算量のまとめ
以上の理由から、HBLTから任意のノードを削除する操作全体の計算量はO(log n)となります。これは、更新が必要なノード数が対数オーダーに抑えられるためであり、HBLTが効率的なデータ構造であることを示す重要な特性の一つです。
-
データ構造入門:圧縮四分木と八分木(Octree)の基礎と活用法
圧縮四分木(Compressed Quadtree)とは四分木では、分割されたセルごとにノードを保存していくため、データを持たない空のノードが大量に発生しがちです。こうした疎なツリーのサイズを抑えるには、意味のあるデータを保持する葉を持つ部分木、いわゆる「重要な部分木」だけを保存すれば十分です。さらにサイズを削減することも可能です。重要な部分木だけを扱う場合、枝刈りの過程で、中間ノードの次数が2(親へのリンク1つと子へのリンク1つのみ)であるような長いパスを取り除けます。実際には、そのパスの始点にあるノードUだけを保存し(削除したノード群を表すメタデータをUに関連付けておき)、パスの終点を根と
-
ハーフエッジデータ構造(HalfedgeDS)とは?基本概念とCGAL実装例をわかりやすく解説
はじめにテンプレートパラメータとして用いられるハーフエッジデータ構造(Halfedge Data Structure、略称 HalfedgeDS)は、頂点・辺・面の接続情報(インシデンス情報)を管理できる、辺を中心としたデータ構造として定義されています。平面地図(planar map)や多面体など、任意の次元空間に埋め込まれた向き付け可能な2次元曲面の表現に適した構造です。このデータ構造では、各辺が逆向きの向きを持つ2つのハーフエッジ(半辺)に分割されます。各ハーフエッジは、隣接する1つの面と1つの頂点への参照を保持し、逆に各面および各頂点にも、それぞれ1つの接続ハーフエッジが格納されます。さ