我实现了 KMP 算法的失败表。
kmp s = b
where a = listArray (0,length s-1) s
b = 0:list 0 (tail s)
list _ [] = []
list n (x:xs)
| x==a!n = (n+1):list (n+1) xs
| n > 0 = list (b!!(n-1)) (x:xs)
| otherwise = 0:list 0 xs
b
是一个列表,b!!(n-1)
最后一行很慢,因此我希望加快速度并执行以下操作。
kmp s = b
where a = listArray (0,length s-1) s
t = listArray (0,length s-1) b
b = 0:list 0 (tail s)
list _ [] = []
list n (x:xs)
| x==a!n = (n+1):list (n+1) xs
| n > 0 = list (t!(n-1)) (x:xs)
| otherwise = 0:list 0 xs
请注意,唯一的区别是替换b!!
为t!
并声明t
为从 生成的数组b
。
对于相同的输入,原始代码具有正确的输出,但新代码只是输出<<loop>>
。
如何解决这个问题?