ツリーの重軽分解:長子優先によるパス操作の高速化
セグメント木は、配列上の区間和や最大値などの情報を効率的に管理するためのデータ構造であり、クエリや更新を \(O(\log n)\) で処理できる。しかし、問題が「配列」ではなく「木構造」に拡張され、任意の2ノード間のパス上の情報を維持・操作したい場合、単純にセグメント木を適用することはできない。
木上のパスを線形構造に変換するアイデア
木は分岐構造を持つため ...
8月19日 04:01 投稿
樹における最近共通祖先の効率的計算手法
木構造上の2頂点間の最近共通祖先(Lowest Common Ancestor, LCA)を高速に求めるには、複数のアルゴリズムが存在します。本稿では、倍増法、オイラー巡回+RMQ、および木の重軽分解(Heavy-Light Decomposition)の3つの代表的手法について、それぞれの設計思想・実装構造・計算量特性を解説します。
倍増法によるLCAクエリ
各頂点から根方向へ2kステップ先の祖先とその ...
8月5日 03:47 投稿
木の連鎖分解(ヘビーライト分解)のまとめ
木の連鎖分解(ヘビーライト分解)のまとめ
基本概念
基本的な考え方
実装手順
ステップ1: 重い子、重い連鎖
ステップ2: dfn順序
ステップ3: 時間計算量の分析
コード実装
重い子の検出
連鎖分解
各種操作
LCAの計算:
パス更新:
パスクエリ:
推奨問題
基本概念
基本的な考え方
\qquad 木の連鎖分解、名前の通り、木データ構造に適用され ...
5月28日 14:42 投稿