CYK算法

CYK算法英語:Cocke–Younger–Kasami algorithm,縮寫為CYK algorithm)是由約翰·科克,Younger和嵩忠雄共同研究出來大約發表於1965年的一個算法,它是一個用來判定任意給定的字元串 是否屬於一個上下文無關文法的算法。

基本介紹

  • 中文名:CYK算法
  • 外文名:Cocke–Younger–Kasami algorithm
簡介,相關參數定義,算法描述,簡介,偽代碼,擴展CYK算法,簡介,偽代碼,

簡介

普通的回溯法(backtracking)在最壞的情況下需要指數時間才能解決這樣的問題,而CYK算法只需要多項式時間就夠了({\displaystyle ~O(n^{3})}, n 為字元串 w 的長度)。CYK算法採用了動態規劃的思想。
對於一個任意給定的上下文無關文法,都可以使用CYK算法來計算上述問題,但首先要將該文法轉換成喬姆斯基範式

相關參數定義

1.
是一個上下文無關文法
2.對於任意字元串
,定義
3.對於任意選擇的
,定義

算法描述

簡介

通過由下而上的方法計算
這個集合,如果
,那么就說明
是被上下文無關文法G接受的字元串。
因為
是一個喬姆斯基範式,若且唯若有下面描述的情況時
中的一個規則且

偽代碼

FOR i:= 1 TO n DO {\displaystyle V_{i,i}:=\{X\in V~|~X\rightarrow \sigma _{i}~in~P\}}FOR l:= 1 TO n-1    FOR i:= 1 TO n-l DO        {\displaystyle ~V_{i,i+l}:=\varnothing }        FOR k:= i TO i+l-1 DO            {\displaystyle ~V_{i,i+l}:=V_{i,i+l}\cup \{X~|~X\rightarrow YZ,Y\in V_{i,k},Z\in V_{k+1,i+l}\}}IF {\displaystyle S\in V_{1,n}} THEN accept ELSE reject

擴展CYK算法

簡介

對於上述CYK算法作一個小改動,也就是說記住每次的k,就可以自動產生一個由該上下文無關語言的推導樹。

偽代碼

FOR i:= 1 TO n DO {\displaystyle V_{i,i}:=\{X\in V~|~X\rightarrow \sigma _{i}~in~P\}}FOR l:= 1 TO n-1    FOR i:= 1 TO n-l DO        {\displaystyle ~V_{i,i+l}:=\varnothing }        FOR k:= i TO i+l-1 DO            {\displaystyle ~V_{i,i+l}:=V_{i,i+l}\cup \{(X,k)~|~X\rightarrow YZ,Y\in V_{i,k},Z\in V_{k+1,i+l}\}}IF {\displaystyle \exists k:(S,k)\in V_{1,n}} THEN accept ELSE reject通過對下面的方法遞歸運行就可以生成推導樹。Tree(X,i,j):   IF i=j THEN RETURN {\displaystyle ~\sigma _{i}}   選擇一個 k 使 {\displaystyle (X,k)\in V_{i,j}}    選擇 Y 和 Z 使 {\displaystyle X\rightarrow YZ,Y\in V_{i,k},Z\in V_{k+1,j}}    RETURN Tree(X,Tree(Y,i,k),Tree(Z,k+1,j))

相關詞條

熱門詞條

聯絡我們