Skip to content

算法Algorithm

CYK 算法

施工中 · 内容逐步修订

Cocke–Younger–Kasami algorithm

用区间动态规划判定给定字是否属于 Chomsky 范式文法生成的语言。

形式陈述 ​

对 Chomsky 范式文法和长度 n≥1 的词 w,CYK 建立集合 T[i,ℓ]:所有能推出子串 wi⋯wi+ℓ−1 的非终结符。长度 1 由规则 A→wi 初始化;对 ℓ>1,枚举切分 k 与规则 A→BC,若 B∈T[i,k] 且 C∈T[i+k,ℓ−k],则加入 A。最终 w∈L(G) 当且仅当 S∈T[1,n]。朴素复杂度为 O(n3|G|)。

直觉

CYK 把“某个非终结符能否生成这一整段子串”拆成所有更短区间的组合。Chomsky 标准形把产生式统一为 A→BC 或 A→a,所以每棵解析树的根部都把长区间在某个位置切成左右两段;动态规划恰好从短子串到长子串枚举这些切点与中间非终结符,并缓存“哪种非终结符能生成这段”,避免重复求解相同子问题。表格中的每个集合不是一棵具体语法树,而是对所有可能解析的压缩表示。

CYK 算法示意图
例子与边界

先看最小合并:对 S→AB、A→a、B→b 和输入 ab,有 T[1,1]={A}、T[2,1]={B},因此唯一切点把 S 放入 T[1,2]。

再用一个能生成非空偶数长度回文的 CNF 文法,完整分析字 abba:

S→AA∣BB∣AC∣BD,C→SA,D→SB,A→a,B→b.

所有有效表项如下,列按起点 i 排列,“—”表示区间超出输入,而 ∅ 表示合法区间没有可用非终结符。

长度 ℓ i=1 i=2 i=3 i=4
1 {A} {B} {B} {A}
2 ∅ {S} ∅ —
3 ∅ {C} — —
4 {S} — — —

长度二只有 bb 能由 S→BB 生成。长度三的 bba 在切分 bb|a 处用 C→SA,得到 C∈T[2,3]。最后把 abba 切成 a|bba,用 S→AC 得 S∈T[1,4],故接受。其余切点与规则不匹配,正是表中空集的来源。若要恢复这棵解析树,应同时记录所用规则和切点;恢复所有解析则要保存全部有效选择。

空串按开始规则单独判断。直接拿含单位规则、A→BCD 或 A→ε 的一般文法套二分递推会漏解,因此先做保持语言的 CNF 转换。最坏 O(n3|G|) 是逐切点、逐规则检查的朴素界;固定文法时写为 O(n3),不意味着每个输入都达到该成本。

推论与应用

CYK 是 动态规划 在形式语言中的典型实例,也是 CFG 成员资格的标准多项式算法,证明了固定 上下文无关文法 的成员问题可在多项式时间解决。它以 Chomsky 标准形 为接口,可扩展为计数解析、概率文法的 Viterbi/inside 算法、求最高概率解析、构造共享解析森林,以及基于半环的通用解析框架。

Earley解析不先转CNF,而以产生式点位置、起点和当前列保存部分推导;该页的左递归加法例与同列空规则闭包,可用来比较两种动态规划怎样避免重复工作。若需要按LR表保留冲突分支,GLR还要区分共享状态栈与保存语法树的打包森林。

参考资料
  • John E. Hopcroft, Rajeev Motwani, and Jeffrey D. Ullman, Introduction to Automata Theory, Languages, and Computation, 3rd ed., Pearson, 2006,Chs. 1–9。
  • Michael Sipser, Introduction to the Theory of Computation, 3rd ed., Cengage, 2013,Chs. 0–10。
关系图谱4 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系

使用的工具