Boyer-Moore-Horspool 算法也称Horspool 算法,由Nigel Horspool设计于1980年,是在BM算法上改进版,因为BM算法里面的 好后缀规则较难理解,同时其效率与正确性的证明当时一直没有得到解决,所以Horspool 算法只用了一个BM里的坏字符规则.
借用“find a needle in a haystack” 典故,意为"大海捞针",引意到我们这里就是 从haystack 字串中查找needle字串(needle 字串等同pattern字串),同时假定haystack字串长度n,needle字串长度为m;
基本原理:
Horspool算法 也是从右向左比较,但Horspool算法相对于Boyer-Moore算法改进了坏字符规则;从右向左匹配,当遇到 不匹配字符(mismatch character)时:
BM 跳转规则:当前不匹配字符和needle中最右边出现的该字符对齐匹配;
Horspool 跳转规则:haystack字串中与needle字串尾部字符对应的字符和needle中最右边出现的该字符匹配;
坏字符规则跳转表初始化和BM中一样,理解了原理,code理解起来就容易了;
下面是实现代码:
#include
#include //
#include //UCHAR_MAX
/* Returns a pointer to the first occurrence of "needle"
* within "haystack", or NULL if not found. Works like
* memmem() OR strs