字符串与模式匹配算法(五):BMH算法
一、BMH算法介绍 在BM算法的实际应用中,坏字符偏移函数的应用次数要远远超过好后缀偏移函数的应用次数,坏字符偏移函数在匹配过程中起着移动指针的主导作用。在实际匹配过程,只是用坏字符偏移函数也非常有效。1980年,奈杰尔·豪斯普(Nigel Horspool)提出了改进的BM算法,也就是BMH算法。简化了BM算法,执行非常方便,效率也很可观。Boyer-Moore算法使用两种策略来确定不匹配模式的位移:坏字符策略和高端策略。 来自Horspool的想法是仅使用坏字符策略,而不使用导致不匹配的字符,而始终使用文本窗口的正确字符。 二、主要思想 Horspool建议仅使用窗口最右边字符的坏字符移位来计算Boyer-Moore算法中的移位。 例如: (a) Boyer-Moore 0 1 2 3 4 5 6 7 8 9 ... a b c a b d a a c b a b c a a b b c a a b (b) Horspool 0 1 2 3 4 5 6 7 8 9 ... a b c a b d a a c b a b c a a b b c a a b 观察是上面两个不同算法的例子,后缀ab匹配,比较c-a表示不匹配。 Boyer-Moore算法(a)根据最后一次出现c的坏字符位置的策略确定滑动距离。 Horspool算法(b