📜  上下文无关文法的CYK算法

📅  最后修改于: 2021-08-25 17:42:57             🧑  作者: Mango

先决条件–将上下文无关语法转换为Chomsky范式
CYK算法是一种上下文无关文法的解析算法。
为了将CYK算法应用于语法,它必须采用Chomsky Normal Form。它使用动态编程算法来判断字符串是否为语法语言。

算法 :
令w为要解析的长度为n的字符串。 G表示我们语法中具有起始状态S的规则集。

  1. 构造大小为n×n的表DP。
  2. 如果w = e(空字符串)并且S-> e是G中的规则,则我们接受字符串,否则我们拒绝。
  3. For i = 1 to n:
      For each variable A:
         We check if A -> b is a rule and b = wi for some i:
            If so, we place A in cell (i, i) of our table. 
  4. For l = 2 to n:
      For i = 1 to n-l+1:
           j = i+l-1
            For k = i to j-1:
               For each rule A -> BC: 
            We check if (i, k) cell contains B and (k + 1, j) cell contains C:
                 If so, we put A in cell (i, j) of our table. 
  5. We check if S is in (1, n):
      If so, we accept the string
      Else, we reject.

例子 –
让我们的语法G为:

S -> AB | BC
A -> BA | a
B -> CC | b
C -> AB | a 

我们检查baaba是否在L(G)中:

  1. 我们首先将单长规则插入到表中。

  2. 然后,我们填充表格的其余单元格。

  3. 我们观察到S在单元格(1、5)中,因此字符串baaba属于L(G)。

时空复杂性:

  • 时间复杂度–
    O(n3.|G|) 

    | G |是给定语法中规则的数量。

  • 空间复杂性–
    O(n2)