Skip to content

CYK 算法

Cocke–Younger–Kasami algorithm

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

条目类型
算法

形式陈述

对 Chomsky 范式文法和长度 n1 的词 w,CYK 建立集合 T[i,]:所有能推出子串 wiwi+1 的非终结符。长度 1 由规则 Awi 初始化;对 >1,枚举切分 k 与规则 ABC,若 BT[i,k]CT[i+k,k],则加入 A。最终 wL(G) 当且仅当 ST[1,n]。朴素复杂度为 O(n3|G|)

直觉

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

CYK 算法示意图
例子与边界

对于输入 abba,表格先标出每个符可由哪些变量产生,再逐层组合长度 2、3、4 的区间。若要恢复解析树,应记录产生式和切分点,而非只存布尔值。空串必须依据开始规则单独判断;未先转为 CNF 时,单位规则、长右部和 ε 规则会破坏上述递推。复杂度中的 |G| 取决于产生式组织方式,固定文法时常简写为 O(n3)

设文法含 SABAaBb,输入为 ab。长度为 1 的表项分别有 AT[1,1]BT[2,2];长度为 2 时在切点 1 看到 A,B,故把 S 放入 T[1,2],字符串被接受。若同一表项能由多个产生式或切点得到,CYK 仍只需记录非终结符;要恢复所有解析树,则必须同时保存回溯指针。

算法依赖标准形。直接拿含 ABCDAε 的一般文法套入二分递推会漏解;通常先做等价变换,并单独处理空串。最坏 O(n3|G|) 是朴素实现的界,不意味着每个文法和输入都达到该成本。

推论与应用

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

参考资料
  • 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。
关系图谱6 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

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

使用的工具