我使用递归来编写以下代码来执行CYK algorithm,以便语法G
可以生成具有相同数量a
的任何单词,后跟任意数量的b
但是由于某种原因它很慢,不知道为什么?当我使用s2时它可以工作,但是如果我使用s1这是一个更长的字符串,它需要永远。任何人都可以建议,因为我无法弄清楚瓶颈在哪里?
def fn(G, w, i, j, T):
if T[i, j]:
print '1'
return T[i, j]
elif i == j:
for r in G:
print '2'
if r.endswith(w[i]) and r[0] not in T[i, j]:
print '3'
T[i, j].append(r[0])
else:
print '4'
for k in range(i, j):
print '5'
for a in fn(G, w, i, k, T):
print '6'
for b in fn(G, w, k+1, j, T):
print '7'
for r in G:
print '8'
if r.endswith(a+b) and r[0] not in T[i, j]:
print '9'
T[i, j].append(r[0])
return T[i, j]
def fnmain(G, S, w):
dict = {}
for x in range(0, len(w)):
for y in range(x, len(w)):
dict[x,y] = []
print dict
v = fn(G, w, 0, len(w) - 1, dict)
print (w, v)
if S in v:
print ("T")
return True
else:
print ("F")
return False
G = ["S->AB", "S->XB", "T->AB", "T->XB", "X->AT", "A->a", "B->b"]
s1 = "aaaaabbbbb"
s1 = "aaaaaaaaabbbbbbbbb"
fnmain(G, "S", s1)
我已经按照@wwii的建议使用了cProfile
,结果如下: