แบบฟอร์มปกติของ Chomsky เปิดใช้งานอัลกอริทึมเวลาพหุนามเพื่อตัดสินใจว่าสามารถสร้างสตริงโดยไวยากรณ์ได้หรือไม่ อัลกอริธึมค่อนข้างเนียนถ้าคุณรู้ว่าการเขียนโปรแกรมแบบไดนามิก ...
ถ้าความยาวของการป้อนข้อมูลของคุณ ( ) เป็นแล้วคุณใช้อาร์เรย์ 2 มิติ ( ) ของสลัว x nInAnn
A[i,j]หมายถึงสัญลักษณ์ทั้งหมดในไวยากรณ์ที่สามารถได้รับมาสตริงย่อยJ)GI(i,j)
ในที่สุดถ้ามีสัญลักษณ์เริ่มต้น ( ) ก็หมายความว่าสตริงที่ฉันสามารถได้รับจากซึ่งเป็นสิ่งที่เราต้องการตรวจสอบA[1,n]SS
def decide (string s,grammar G):
//base case
for i=1 to n:
N[i,i]=I[i] //as the substring of length one can be generated by only a
terminal.
//end base case
//induction
for s=1 to n: //length of substring
for i=1 to n-s-1: //start index of substring
for j=i to i+s-1: //something else
if there exists a rule A->BC such that B belongs to N[i,j] and C
belongs to N[j+1,i+s-1] then add A to N[i,i+s-1]
//endInduction
if S belongs to N[1,n] then accept else reject.
ฉันรู้ว่าดัชนีดูบ้ามาก แต่โดยทั่วไปนี่คือสิ่งที่เกิดขึ้น
ฉันคิดว่าตัวเรือนฐานค่อนข้างชัดเจน
ในขั้นตอนการอุปนัยเราสร้างโซลูชันสำหรับความยาวสตริงย่อยจากการแก้ปัญหาที่มีความยาวน้อยกว่าsss
บอกว่าคุณกำลังมองหาวิธีการแก้ปัญหาสำหรับความยาว substring ( ) เริ่มต้นที่ดัชนี1แล้วคุณจะเริ่มห่วง (อย่างอื่นบางส่วน) ..... ซึ่งการตรวจสอบว่ามีการปกครอง ( ) เช่นที่และได้รับมาสองสตริงต่อเนื่องกันและเคลื่อนย่อยและถ้าเป็นเช่นเพิ่มทั้งหมดเช่น's เพื่อ[1,6]5sub
1A−>BCBCAN[1,6]
สุดท้ายถ้าคุณมีสัญลักษณ์เริ่มต้นในคุณก็ยอมรับ!N[1,n]