Cocke-Younger-Kasami算法——上下文无关文法的句法分析利器
一种基于动态规划的算法,用于判定给定字符串是否可由某个上下文无关文法生成
时间复杂度: O(n³ · |G|)
空间复杂度: O(n²)
CYK算法是一种用于判断字符串是否属于某个上下文无关文法的动态规划算法。
CYK算法由三位独立研究者分别提出:John Cocke、Daniel Younger和Tadao Kasami。
判断一个给定字符串是否可以被特定的上下文无关文法生成。
要求上下文无关文法必须是乔姆斯基范式(CNF)。
CYK算法使用动态规划表来存储子问题的解,避免重复计算。
对于长度为n的字符串,构建一个n×n的三角矩阵,其中:
CYK算法要求文法必须是CNF形式,其产生式只有两种形式:
任何上下文无关文法都可以转换为等价的CNF形式。
| i\j | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 1 | S,A | - | B | - | S,A |
| 2 | B | A | - | S,A,C | - |
| 3 | A,C | - | B | - | - |
| 4 | B | S,A,C | - | - | - |
| 5 | A,C | - | - | - | - |
对每个位置i和长度为1的子串,找出可以直接生成该终结符的非终结符。
for i = 1 to n:
P[i,1] = {A | A → word[i] ∈ G}
对于长度从2到n的所有子串,分解为两部分,检查是否存在产生式A→BC。
for length = 2 to n:
for i = 1 to n-length+1:
for k = 1 to length-1:
P[i,length] ∪= {A | A→BC ∈ G, B∈P[i,k], C∈P[i+k,length-k]}
检查起始符号S是否在P[1,n]中,如果在则字符串可由文法生成。
if S ∈ P[1,n] then
return "字符串属于文法"
else
return "字符串不属于文法"
运行算法后将在此显示结果矩阵和解析结果
用于句法分析,判断句子是否符合语法规则。
在语法分析阶段检查程序代码结构是否正确。
研究上下文无关文法的性质和能力。
在对话系统和知识表示中应用形式文法。