为什么在文本编辑器的查找功能中选择 "BM algorithm" 而不是 "Sunday algorithm"?

Why choose "BM algorithm" rather than "Sunday algorithm" in text editor's Find function?

随机字符下,Sunday算法比bm算法快

那么,为什么在文本编辑器的查找功能中选择 "BM algorithm" 而不是 "Sunday algorithm"?

对于为什么要选择其中之一,没有简单的答案。 "BM" 指的是 "Boyer-Moore"。 "Sunday" 算法参考了 Sunday 的 Boyer-Moore-Horspool 变体。

正如您可能从名字中猜到的那样,周日的 Boyer-Moore-Horspool 变体与 Boyer-Moore 非常相似。

说实话,人们选择 Sunday 变体的主要原因与执行速度无关。相反,它的实现要简单得多。原始的 Boyer-Moore 算法很难完全正确。 Sunday 的变体也不完全是微不足道的,但它仍然要简单得多。

支持 Boyer-Moore 的论据是,虽然代码更复杂,但它减少了搜索所需的比较次数,使其非常接近绝对必要的最小值。最大的问题是它需要更多的预处理(和更多的内存)才能做到这一点。

您会发现在执行速度方面(但是,据我所见)在文本编辑器中使用搜索可能倾向于支持 Sunday 的 Boyer-Moore-Horspool 变体。

就我而言,

完整版 Boyer-Moore 算法通过两个 table 加速字符串匹配:delta1delta2 也称为 错误后缀 table 良好前缀 table.

如果字母表很大,例如ascii范围或one-byte范围(0-255),delta1在匹配中起主要作用。否则,对于小字母表,例如 DNA(4 号字母表),delta2delta1 更有效。

对于delta2需要稍微复杂一点的预处理(如果写时间复杂度O(n)的代码) 和更多的内存(它包含一个额外的字母表 table),简化的 Boyer-Moore 算法只使用 delta1 table。在一般情况下它工作正常。

Horspool算法是Simplified-Boyer-Moore算法之一,Sunday算法是Horspool算法的改进版。

文本编辑器不关心多一点内存负载(最多256字节),完整版Boyer Moore算法是更合理的选择。