2013-04-15 11 views
5

Czytałem o CYK algorithm i jest jedna część pseudokodu, którego nie rozumiem. Cały pseudokod jest:Nie rozumiem pseudokodu algorytmu CYK

let the input be a string S consisting of n characters: a1 ... an. 
let the grammar contain r nonterminal symbols R1 ... Rr. 
This grammar contains the subset Rs which is the set of start symbols. 
let P[n,n,r] be an array of booleans. Initialize all elements of P to false. 
for each i = 1 to n 
    for each unit production Rj -> ai 
    set P[i,1,j] = true 
for each i = 2 to n -- Length of span 
    for each j = 1 to n-i+1 -- Start of span 
    for each k = 1 to i-1 -- Partition of span 
     for each production RA -> RB RC 
     if P[j,k,B] and P[j+k,i-k,C] then set P[j,i,A] = true 
if any of P[1,n,x] is true (x is iterated over the set s, where s are all the indices for Rs) then 
    S is member of language 
else 
    S is not member of language 

Te części są który ja mylić:

for each production RA -> RB RC 
     if P[j,k,B] and P[j+k,i-k,C] then set P[j,i,A] = true 

Czy ktoś podać kilka wskazówek na temat tych Pseudokod?

+0

@ syb0rg: Celowo zostawiam wcięcie, aby łatwiej było zlokalizować mniejszy fragment kodu z dużej części kodu. – nhahtdh

+0

@nhahtdh Naprawiono (zwyczaj formatowania, przepraszam). – syb0rg

+0

@ syb0rg: Wcięcie mniejszego fragmentu kodu jest nieco wyłączone (możesz po prostu skopiować i wkleić z oryginalnego kodu). – nhahtdh

Odpowiedz

3

pseudokod

Dla każdego produkcji R → R B R C:

jeżeli P [j, k, B] i P [j + k ik , C] następnie ustawić P [j, i, A] = true

Należy interpretować w następujący sposób. Załóżmy, że to prawda, że ​​P [j, k, B] jest prawdziwe. Oznacza to, że ciąg utworzony z postaci k zaczynając od pozycji j może pochodzić od nieterminalnego R B. Jeśli jest również prawdą, że P [j + k, i-k, C] jest prawdziwe, to łańcuch utworzony ze znaków i-k rozpoczynających się od pozycji j + k może pochodzić od nieterminalnego R C. W związku z tym, jako R → R B R C jest produkcja, to jest tak, że łańcuch utworzony z postaci I, wychodząc z pozycji j może pochodzić z R .

myślę, że może to pomóc w interpretacji tego Pseudokod jako

Dla każdej produkcji R → R B R C:

jeśli P [j, k, B] == true i P [j + k, ik, C] == true, następnie ustaw P [j, i, A] = true

Mam nadzieję, że to pomoże!

+0

Czy możesz wyjaśnić, jakie są indeksy A i B? – user2280838

+0

@ user2280838- Algorytm numeruje wszystkie nieterminalne R_1, R_2, ..., R_n. W tym przypadku A, B i C są wskaźnikami nieterminali w produkcji R_A -> R_B R_C. Na przykład, jeśli produkcja była S -> T U i S miał indeks 1, T miał indeks 2, a U miał indeks 3, to mielibyśmy A = 1, B = 2 i C = 3. Czy to pomaga? – templatetypedef

+0

Pomaga, ale co jeśli A B i C jako non terminali są zdefiniowane więcej niż jeden raz w gramatyce? Czy przydziału indeksu sortuje się wartość ID, która pomaga odróżnić je od innych nieterminali? – user2280838