9 h! p' m0 L; I% P4 K由于位运算在计算机中可以并行进行,每次循环的执行是常数时间的,所以上面代码段的复杂度是 O(m)。 : D1 H! {/ O" Q- X. Y) | 7 E4 f, `& T9 E( Z3,辅助表 B & }! A# J4 u \! q上面没有提到如何得到辅助表B。很简单,只要获得模式串T 中每个字符出现的位置。+ ^% N. v/ I- V" ]
Z/ x/ q, Y1 X3 I3 m- v a! a. g1 @6 X' i* l
显然,上述代码段的复杂度是 O(n)。Shift-And 算法的时间复杂度是O(m+n)。 4 P* V$ b' M+ f+ B1 s实际上,shift 算法通常比KMP 算法的匹配速度要快,因为计算机位并行运算是非常高效的。1 B8 b' ]+ \6 x0 ~4 i
3 Q( x3 P& h a* Y8 A h注意:数组B 的大小是由字符集决定的,如果字符来自ASCII 码,字符的数值范围是0~127,数组大小是128 即可;否则,可能需要更大的数组B,或者自己构建字符到整数索引之间的散列关系。 P( ^/ v T* i `' P+ _, N4 Y0 H' t9 ~+ _' H; S( ]/ S
4,Shift-Or 算法1 L- e `1 ]' D
在Shift-And 中,对掩码D 的更新:D = (D << 1 | 1) & B[S[i] ;) i @/ {5 o4 H) C+ F- t- f
每次更新D 都需要额外进行D 移位后与"1" 的"或"运算。这是由于我们要保证当字符S 在T[0] 处出现时,D[0] 一定要等于1,而D 向左移位后最低位是0。& H, c* l7 F; N$ n9 ~ N