我最近了解了不同的字符串搜索算法,例如 Knuth-Morris-Pratt 和 Boyer Moore 算法,在这样做的过程中,我了解了有关这两种算法的一些细节我无法消化它们,或者已经对它们有了自己的理解,但仍然不确定它们的正确性。
问题:
- 此 question 的最佳答案指出,如果字母表较小,则 KMP 效果很好。为什么会出现这种情况,为什么在这种情况下 Boyer 的算法不能比 KMP 表现得更好?
- KMP 和 Boyer 算法性能最差的示例分别是什么? 我已经发现,对于像这个 Boyer 这样的例子,性能最差。是吗?
text='AAAAA....13 A'S'
pattern='AAA'
3.我能够理解 KMP 的正确前缀方面,并且能够消化这样一个事实,即它在跳过文本的已匹配部分时不会跳过可能的匹配,但即使我确实得到了背后的直觉Bad Character Heuristic 和 Good Suffix Heuristic 的 Boyer 算法专注于跳过字符,以便模式与未来可能的匹配相吻合,我仍然无法让自己理解这两种启发式如何保证跳过的字符获胜无论如何都不要提供火柴。
给定 document 中第 2 页的 4th Paragraph 谈到我们可以跳过文本的某些字符而不看它们。为什么我们可以忽略它们?
- 在外行的语言中,我们可以声称 KMP 和 Boyer 算法之间的区别在于 KMP 通过跳过已经匹配的字符来工作,而 Boyer 通过跳过不会产生任何区别的字符来工作,因为文本上窗口的当前位置已经有错过比赛。