2.4 BOM 算法【ALLAUZEN C., CROCHEMORE M., RAFFINOT M., 1999】
K 算法沿用了 # 算法思想,只是预处理过程建立类似于 /L2E 结构的自动机
K %&C。K %&C 的特点是易于构造并且结构简单,所以可以获得较高的速度。K %&C 采
用链表 G2/G*+-,C%/*+-表示。2 代表状态 2,G*2-是由从状态 2 出发的边
组成的链表,从状态 2+ 到状态 2 的边可省略。/*2-./LWE 表示接点 2 为终止状态。
K %&C 自动机满足'%(有向无循环'(能识别所有 $
的后缀 '&(状态尽可能少'(边的数量为
K'(。
K 算法见附录 :
例如:
2. 5 Shift-or 算法【BAEZA-YATES, R.A., GONNET, G.H., 1992】与 shift-
and 算法【WU, S., MANBER, U., 1992】
算法本质上是一种自动机,但它比自动机所占存储空间要小,它用一个
来代表自动机的一个状态,所以它限制模式串的大小不大于计算机寄存器的位数如
或 。咋看起来,这种算法似乎很难奏效,但仔细研究之后会发现这种算法十分巧妙。
因为刚刚接触这种算法会觉得难以理解,所以我们先从一个例子入手,然后再进行理
论分析。
设 $= “686R0/.X686/R0Y.906080/;
首先建立掩码表(&%&C%%C)。表格的列数等于模式串的长度,行数等于
字符集中字符的个数。列的编号从右往左递增。对于某个字符 %,如果 % 在 $ 中出现,在
% 这一行,% 在 $ 中出现的位置填 ,其它位置填 。如 在模式串 $ 第三个位置出现,则
行 列填 ,其它位置填 。
% 表计算公式表示如下
下面用到 %&5 5 ,大小为Q$Q即 有 个 ,各个 从右向左编号。
初始化各位置 ,代表各个状态为 %C。
匹配时从 / 中读入字符 %,根据 &%&C%%C 找到 %*%-,将 左移一位
并与 %*%-相或,结果放回 中,如果 最高位为 则报告在 / 中发现了 $。