zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    使用iframe从网页调起移动端应用
    综合练习:词频统计
    组合数据类型练习
    python 绘制五星红旗
    熟悉常用的Linux操作
    大数据概述
    windowBackground打造闪屏页
    安卓日期选择对话框
    c语言语法分析器
    C语言文法
  • 原文地址:https://www.cnblogs.com/dsky/p/2473487.html
Copyright © 2011-2022 走看看