为什么在文本编辑器的查找功能中选择 "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 加速字符串匹配:delta1
和 delta2
也称为 错误后缀 table 和 良好前缀 table.
如果字母表很大,例如ascii范围或one-byte范围(0-255),delta1
在匹配中起主要作用。否则,对于小字母表,例如 DNA(4 号字母表),delta2
比 delta1
更有效。
对于delta2需要稍微复杂一点的预处理(如果写时间复杂度O(n)的代码)
和更多的内存(它包含一个额外的字母表 table),简化的 Boyer-Moore 算法只使用 delta1
table。在一般情况下它工作正常。
Horspool算法是Simplified-Boyer-Moore算法之一,Sunday算法是Horspool算法的改进版。
文本编辑器不关心多一点内存负载(最多256字节),完整版Boyer Moore算法是更合理的选择。
随机字符下,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 加速字符串匹配:delta1
和 delta2
也称为 错误后缀 table 和 良好前缀 table.
如果字母表很大,例如ascii范围或one-byte范围(0-255),delta1
在匹配中起主要作用。否则,对于小字母表,例如 DNA(4 号字母表),delta2
比 delta1
更有效。
对于delta2需要稍微复杂一点的预处理(如果写时间复杂度O(n)的代码)
和更多的内存(它包含一个额外的字母表 table),简化的 Boyer-Moore 算法只使用 delta1
table。在一般情况下它工作正常。
Horspool算法是Simplified-Boyer-Moore算法之一,Sunday算法是Horspool算法的改进版。
文本编辑器不关心多一点内存负载(最多256字节),完整版Boyer Moore算法是更合理的选择。