|
看 KMP 被提了一万遍,特来为 Boyer-Moore 找点存在感
在长度 n 的字符串中寻找长度 m 的子串,Boyer Moore 算法的最优情况时间复杂度是 O(n/m),最差情况(打上补丁之后)是 O(n)
做到 O(n/m) 的方法特惊艳:从右往左匹配
具体点,假设在 "1234567" 里面查找 "abcd",一般的算法要比较 '1'!='a', '2'!='a', '3'!='a', '4'!='a' ... 然鹅 Boyer-Moore 算法只需要做一次字符比较就能得出结论:'4'!='d', 所以匹配窗口应该右移4位,越界,所以没有匹配 (当然为了快速得出匹配失败之后窗口最多可以右移多少位的结论需要花 O(m) 的时间预处理模式串 "abcd")
P.S. 具体算法这里用通俗语言讲得特别清楚:Boyer-Moore algorithm
P.P.S. 好消息好消息 c++17 标准里包含了实现 std::boyer_moore_searcher - cppreference.com |
|