之前的BM算法已经剔除了大部分的冗余遍历,使得整个的模板匹配算法变得更加高效,但是很明显从例子上就可以看出,有两个缺点一是跨度的时机不能很好的把握,而是仍然有冗余遍历。所以BMH算法被提出来作为BM算法的改进算法。
BMH算法全称是Boyer-Moore-Horspool算法。它不再像BM算法一样关注失配的字符,它的关注的焦点在于匹配文本每一次匹配失败的最后一个字符X,根据这个字符X是否在模板出现过来决定跳跃的步数,否则跳跃模板的长度。
所以分了两种情况:
一:字符X不在模板P中,则跳跃的步数为模板P的长度
二:字符X在模板P中,跳跃的步数为字符X距离离尾部最近的字符X的距离(不包括最后一个字符)
加入文本为missipipi,模板为pip:
<

BMH算法作为BM算法的改进版,通过关注匹配失败时的最后一个字符来减少冗余遍历。当字符不在模板中时,跳跃步数为模板长度;在模板中则按字符距离模板尾部的最近相同字符距离跳跃。例如,文本missipipi与模板pip匹配只需匹配三次。C++实现代码包含于内容中。

563

被折叠的 条评论
为什么被折叠?



