• Sunday字符串匹配算法


    Sunday算法是Daniel M.Sunday于1990年提出的一种比BM算法搜索速度更快的算法。其核心思想是:在匹配过程中,模式串并不被要求一定要按从左向右进行比较还是从右向左进行比较,它在发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率。

    Sunday的算法思想和Horspool有些相似,但是。当出现不匹配的时候,却不是去找匹配串中不匹配的字符在模式串的位置,而是直接找最右边对齐的右一位的那个字符在模式串的位置。

    如果该字符没有在匹配串中出现则直接跳过,即移动步长= 匹配串长度+1;否则,同BM算法一样其移动步长=匹配串中最右端的该字符到末尾的距离+1。

    比如:

       匹配串:abcbczdxzc
       模式串:zbcac
       这里b-a没有对上,就看匹配串中的z在模式串的位置,然后对齐。
         匹配串:abcbczdxzc
         模式串:        zbcac
       如果模式串中的没有那个字符的话就跳过去。
         匹配串:abcbcedxzcs
        模式串: zbcac

      e不在模式串中出现,那么我们就

      匹配串:abcbcedxzcs

      模式串:zbcac

     1 int SundayMatch(byte* pSrc, int nSrcSize, byte* pSubSrc, int nSubSrcSize)
     2 {
     3     int skip[256];
     4     for (int i = 0; i < 256; i++)
     5     {
     6         skip[i] = nSubSrcSize + 1;
     7     }
     8 
     9     for (int i = 0; i < nSubSrcSize; i++)
    10     {
    11         skip[pSubSrc[i]] = nSubSrcSize - i;
    12     }
    13 
    14     int nPos = 0;
    15     while(nPos <= nSrcSize - nSubSrcSize)
    16     {
    17         int j = nSubSrcSize - 1;
    18         while(j >= 0 && pSrc[nPos + j] == pSubSrc[j])
    19         {
    20             j--;
    21         }
    22         if (j < 0)
    23         {
    24             break;
    25         }
    26         nPos = nPos + skip[pSrc[nPos + nSubSrcSize]];
    27     }
    28     return nPos;
    29 }
  • 相关阅读:
    浮点数精度问题(2.01.1=0.8999999999)
    创建android的模拟器时屏幕的大小设置
    hdu 3038 How Many Answers Are Wrong(并查集)
    hdu 3635 Dragon Balls(并查集)
    hdu 1598 find the most comfortable road(并查集+暴力搜索)
    hdu 1671 Phone List (字典树)
    hdu 3047Zjnu Stadium(并查集)
    hdu 1247 Hat’s Words(字典树)
    后缀数组——处理字符串的有力工具
    hdu 2473 JunkMail Filter(并查集+虚拟节点)
  • 原文地址:https://www.cnblogs.com/dsky/p/2473487.html
Copyright © 2020-2023  润新知