algo — C++23 日本語リファレンス GitHub

CykGraph

クラス · グラフ上の文脈自由到達可能性 (CykGraph)

struct CykGraph;

概要

辺ラベル付き有向グラフ上の文脈自由到達可能性 (CYK のグラフ版)

CNF(A->BC または A->終端)の文法を、各辺が 1 記号を表す 有向グラフに適用する。各記号 $X$ について「頂点 $u$ から $v$ へ、 通った辺ラベル列が $X$ から導出される歩道が存在する」頂点対 $(u, v)$ の集合を不動点反復で求める。辺は繰り返し使え、向きは固定。 記号は $[0, num\_sym)$ の整数 id で表す(非終端・終端クラスを区別しない)。 ビット行列($n$ 行 $\times$ $n$ 列)の合成で $A \mathrel{|}= B \circ C$ を計算するため、 1 反復あたり $O(R n^3 / 64)$($R$ は規則数)。

計算量

構築・破棄

名前 説明 計算量
(constructor) n頂点・num_sym記号の空の到達関係を構築する $O(Sn^2/64)$

メンバ関数

名前 説明 計算量
add 記号 sym の到達対に $(u, v)$ を追加する(終端辺の登録に使う) $O(1)$
get $(u, v)$ が記号 sym から導出可能か $O(1)$
add_rule 二項規則 A->BC を追加する 償却 $O(1)$
solve 不動点まで反復して全到達対を確定する 1反復 $O(Rn^3/64)$、最悪 $O(SRn^5/64)$

メンバ変数

名前 説明 計算量
words 頂点数・記号数・1 行あたりの 64 bit ワード数 $O(1)$ で参照可能
rules 登録済みの二項規則 {A, B, C} 1 規則の参照は $O(1)$
reach 各記号の到達可能性を表すビット行列 1 ワードの参照は $O(1)$