Java Boyer-Moore字符串搜索算法开始对齐

Java Boyer-Moore字符串搜索算法开始对齐,java,c,algorithm,Java,C,Algorithm,我不是一个专业的程序员,所以请容忍我。 我在四处寻找原因,为什么不应该在针的最后一个字符与干草堆中的同一个字符的第一个同余处进行haystack和Pineder的初始“对齐”,而是在最早的时候在Pinele.length()-1处进行,而不是在“haystack.Pineder.length()-1”和“Pineer.length()处进行比较-1' 例如:- 干草堆:真的 针:下降 如上所述,就之前的移位和比较而言,草堆中最后一个“t”之前的所有内容都可以完全忽略。如果你想在草堆中找到第一个t

我不是一个专业的程序员,所以请容忍我。 我在四处寻找原因,为什么不应该在针的最后一个字符与干草堆中的同一个字符的第一个同余处进行haystack和Pineder的初始“对齐”,而是在最早的时候在Pinele.length()-1处进行,而不是在“haystack.Pineder.length()-1”和“Pineer.length()处进行比较-1'

例如:-

干草堆:真的

针:下降


如上所述,就之前的移位和比较而言,草堆中最后一个“t”之前的所有内容都可以完全忽略。

如果你想在草堆中找到第一个
t
(从第七个字符开始),你必须查看草堆中的每个字符,直到最后


博耶·摩尔发现这种情况的比较要少得多。例如,在将
t
e
进行比较后,它可以向前移动五个字符。因此,下一个比较将在
t
和最后一个
a
之间进行,这将导致两个位移。因此,只需进行两次比较,而不是七次比较,就可以找到正确的对齐方式。

如果不查看前面的所有字符,您如何在大海捞针中找到该点?是的,我当然完全理解您的观点。然而,我看到了讽刺的是,没有真正的方法来利用这种不言而喻的可能性——人眼可以看到,逻辑支持,但不能在代码中有效地实现。然而,在测试中,在某些情况下,我所概述的算法的计时比B-M等效算法要好。@bjwg:这在很大程度上取决于您对这两种可能性的编码方式。但总的来说,写得好的Boyer Moore是一个巨大的胜利。(我不确定这是否真的是“讽刺”,但毫无疑问,像人类视觉这样的复杂并行处理系统有时会比计算机表现得更好。另一方面,人类视觉受到视觉错觉的影响,所以一切都不一定是它看起来的样子。对,尽管搜索空间随着针在干草堆上的移动而减少。我可以想象相对的针的字符在整个字母表中的“rity”也会影响性能,因此搜索“e”比搜索“z”更耗时。