bmh算法

#include <string.h> #include <limits.h> /* Returns a pointer to the first occurrence of "needle" * within "haystack", or NULL if not found. Works like * memmem(). */ /* Note: In this example needle is a C string. The ending * 0x00 will be cut off, so you could call this example with * boyermoore_horspool_memmem(haystack, hlen, "abc", sizeof("abc")) */ const unsigned char * boyermoore_horspool_memmem ( const unsigned char * haystack, size_t hlen, const unsigned char * needle, size_t nlen ) { size_t scan = 0 ; size_t bad_char_skip [ UCHAR_MAX + 1 ] ; /* Officially called: * bad character shift */ /* Sanity checks on the parameters */ if (nlen <= 0 || !haystack || !needle ) return NULL ; /* ---- Preprocess ---- */ /* Initialize the table to default value */ /* When a character is encountered that does not occur * in the needle, we can safely skip ahead for the whole * length of the needle. */ for (scan = 0 ; scan <= UCHAR_MAX ; scan = scan + 1 ) bad_char_skip [scan ] = nlen ; /* C arrays have the first byte at [0], therefore: * [nlen - 1] is the last byte of the array. */ size_t last = nlen - 1 ; /* Then populate it with the analysis of the needle */ for (scan = 0 ; scan < last ; scan = scan + 1 ) bad_char_skip [needle [scan ] ] = last - scan ; /* ---- Do the matching ---- */ /* Search the haystack, while the needle can still be within it. */ while (hlen >= nlen ) { /* scan from the end of the needle */ for (scan = last ; haystack [scan ] == needle [scan ] ; scan = scan - 1 ) if (scan == 0 ) /* If the first byte matches, we've found it. */ return haystack ; /* otherwise, we need to skip some bytes and start again. Note that here we are getting the skip value based on the last byte of needle, no matter where we didn't match. So if needle is: "abcd" then we are skipping based on 'd' and that value will be 4, and for "abcdd" we again skip on 'd' but the value will be only 1. The alternative of pretending that the mismatched character was the last character is slower in the normal case (E.g. finding "abcd" in "...azcd..." gives 4 by using 'd' but only 4-2==2 using 'z'. */ hlen - = bad_char_skip [haystack [last ] ] ; haystack + = bad_char_skip [haystack [last ] ] ; } return NULL ; }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值