zoukankan      html  css  js  c++  java
  • BNDM字符串匹配算法

    horspool算法从右往左匹配,它跳转的时候只利用了一个字符的信息,这样使得跳转会比较短,速度比较慢。

    BNDM算法是一种跳转时考虑子串的算法。具体实现的时候,为了提高速度,用了跟SHIFT AND一样的技巧。对于字符集里的每个字符,计算它在模式串的哪些位置出现,然后用一个整数表示这个集合。用一个整数D表示当前活跃的状态,第i位为1,表示在模式串i的位置有一个子串匹配到了,子串的具体长度取决于源串匹配的情况。如果D里第m位为1,这时候表示找到了模式串的一个前缀,如果这时候源串也匹配了m个字符,则表示找到了模式串,否则,只是一个子串,这时候要调整一个跳转的长度。跳转的长度为m-这个前缀的长度。每找到一个前缀都要更新一个跳转的距离,所以跳转的距离是越来越短。

     1 int BNDMMatch(byte* pSrc, int nSrcSize, byte* pSubSrc, int nSubSrcSize)
     2 {
     3     unsigned int skip[256] = {0}; 
     4     for(int i = 0; i < nSubSrcSize; i++)
     5     {
     6         skip[ pSubSrc[i] ] |= 1 << (nSubSrcSize - 1 - i);
     7     }
     8 
     9     int nPos = 0;
    10     while(nPos <= nSrcSize - nSubSrcSize)
    11     {
    12         int j = nSubSrcSize -1;
    13         int last = nSubSrcSize;
    14         unsigned int D = -1;
    15         while(D)
    16         {
    17             D &= skip[pSrc[nPos + j]];
    18             if (D & (1<<(nSubSrcSize-1)))
    19             {
    20                 if (j > 0)
    21                 {
    22                     last = j;
    23                 }
    24                 else                    
    25                 {
    26                     return nPos;
    27                 }
    28             }
    29             j--;
    30             D <<= 1;
    31         }
    32         nPos += last;
    33     }
    34     return -1;
    35 }
  • 相关阅读:
    冲刺第十三天
    冲刺第十二天
    冲刺第十一天
    Android Studio三种运行方法
    第十三周学习进度
    冲刺第一阶段意见评论
    第十二周学习进度
    冲刺第十天
    大二暑假周总结(五)
    大二暑假周总结(四)
  • 原文地址:https://www.cnblogs.com/dsky/p/2470855.html
Copyright © 2011-2022 走看看