关于KMP的算法已经熟悉了,但是发觉KMP算法中仍然不能完全去掉冗余的遍历,这样依然使效率变低,于是就继续研究了一下另外的一个算法,BM算法。
BM算法是Boyer和Moore提出的一个模式匹配的算法,是一个经典的字符串匹配算法,性能优越,在当今仍然有广泛的运用。
BM算法引入了两个最关键的跳跃表,一个是坏字符规则表,另一个是好后缀规则表。只要能理解这两个表就会一下子明白了。BM算法是从后往前匹配的。
坏字符就是匹配出错的文本的字符,好后缀是已经匹配的后缀。
i为坏字符,mple为好后缀。
简单的定义坏字符规则为:后移位数 = 坏字符的位置 - 搜索词中中的上一次字符出现的位置
简单的定义好后缀规则为:后移位数 = 好后缀 - 搜索词中上一次好后缀出现的位置
坏字符没有在模板中出现过,则后移位数 = 坏字符的位置 + 1
而每一次的匹配中出现问题后,后移位数 = max {坏字符规则,好后缀规则},这就是BM算法的精髓。下面来进行匹配分析一下,再对规则进行分析
文本为:"heresimpleexample",模板为:"example",
坏字符规则表:不在模板中有的字符都设为模板长度。
这并不是坏字符最终移动的位数,移动的位数需要根据坏字符位置 - 模板长度 + 1 + 坏字符规则
好后缀规则表:
匹配的过程如下,只需4次匹配,好快!
第1次匹配时,坏字符为m,没有好后缀,根据坏字符规则,后移位数 = 3
第2次匹配时,坏字符为s,好后缀为mple,根据坏字符规则,