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 }

 

 

点赞