Haskell中的Knuth-Morris-Pratt算法
我在理解Haskell中Knuth-Morris-Pratt算法的这种实现时遇到困难 特别是,我不理解自动装置的构造。我知道它使用了“打结”的方法来构造它,但我不清楚,我也不知道为什么它应该具有正确的复杂性 我想知道的另一件事是,您是否认为这个实现可以很容易地推广到实现Aho-Corasick算法Haskell中的Knuth-Morris-Pratt算法,haskell,knuth-morris-pratt,aho-corasick,Haskell,Knuth Morris Pratt,Aho Corasick,我在理解Haskell中Knuth-Morris-Pratt算法的这种实现时遇到困难 特别是,我不理解自动装置的构造。我知道它使用了“打结”的方法来构造它,但我不清楚,我也不知道为什么它应该具有正确的复杂性 我想知道的另一件事是,您是否认为这个实现可以很容易地推广到实现Aho-Corasick算法 谢谢你的回答 下面是算法: makeTable :: Eq a => [a] -> KMP a makeTable xs = table where table = makeTab
谢谢你的回答 下面是算法:
makeTable :: Eq a => [a] -> KMP a
makeTable xs = table
where table = makeTable' xs (const table)
makeTable' [] failure = KMP True failure
makeTable' (x:xs) failure = KMP False test
where test c = if c == x then success else failure c
success = makeTable' xs (next (failure x))
利用这些,让我们看看为“鞋店”构建的表:
注意success5
如何使用消耗的“s”回溯模式的初始“s”
现在,浏览一下当您执行isSubstringOf2“shoeshop”$cycle“shoe”
时会发生什么
请注意,当test7
无法匹配“p”时,它会返回到test3
以尝试匹配“e”,这样我们就可以无限循环地进行success4
、success5
、success6
和success7
测试
makeTable "shoeshop" = table0
table0 = makeTable' "shoeshop" (const table0)
= KMP False test0
test0 c = if c == 's' then success1 else const table0 c
= if c == 's' then success1 else table0
success1 = makeTable' "hoeshop" (next (const table0 's'))
= makeTable' "hoeshop" (next table0)
= makeTable' "hoeshop" test0
= KMP False test1
test1 c = if c == 'h' then success2 else test0 c
success2 = makeTable' "oeshop" (next (test0 'h'))
= makeTable' "oeshop" (next table0)
= makeTable' "oeshop" test0
= makeTable' "oeshop" test0
= KMP False test2
test2 c = if c == 'o' then success3 else test0 c
success3 = makeTable' "eshop" (next (test0 'o'))
= makeTable' "eshop" (next table0)
= makeTable' "eshop" test0
= KMP False test3
test3 c = if c == 'e' then success4 else test0 c
success4 = makeTable' "shop" (next (test0 'e'))
= makeTable' "shop" (next table0)
= makeTable' "shop" test0
= KMP False test4
test4 c = if c == 's' then success5 else test0 c
success5 = makeTable' "hop" (next (test0 's'))
= makeTable' "hop" (next success1)
= makeTable' "hop" test1
= KMP False test5
test5 c = if c == 'h' then success6 else test1 c
success6 = makeTable' "op" (next (test1 'h'))
= makeTable' "op" (next success2)
= makeTable' "op" test2
= KMP False test6
test6 c = if c == 'o' then success7 else test2 c
success7 = makeTable' "p" (next (test2 'o'))
= makeTable' "p" (next success3)
= makeTable' "p" test3
= KMP False test7
test7 c = if c == 'p' then success8 else test3 c
success8 = makeTable' "" (next (test3 'p'))
= makeTable' "" (next (test0 'p'))
= makeTable' "" (next table0)
= makeTable' "" test0
= KMP True test0