Sunday算法:最快的字符串匹配算法

以前被KMP的next数组搞的头昏脑胀说不上也是比较烦人的,今天看到还有这么有趣并且高效的算法(比KMP还快),看来有必要作一点笔记了算法

Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配算法,其简单、快速的特色很是好!数组

思路

其核心思想是:在匹配过程当中,模式串发现不匹配时,算法能跳过尽量多的字符以进行下一步的匹配,从而提升了匹配效率;能够预见到,“跳过多个数”这个逻辑又能够写一个方法,而后被主函数调用curl

若是该字符没有在匹配串中出现则直接跳过,即移动步长= 匹配串长度+1;不然,同BM算法同样其移动步长=匹配串中最右端的该字符到末尾的距离+1 
这里写图片描述
每一次移动前决定移动步长的是模式串末尾的下一个位置对应的主串字符函数

实现

//C语言

#include <stidio.h>
#include <string.h>

int getCurlA(char *tar, char ch, int curlA)
{
    int *p = tar;
    int delta = 0;
    while(p && *p!=ch){
        p++;
        delta + = 1;
    }
    return curlA - delta;
}

int SundaySearch(char *src, char *tar)
{
    int srcLen = strlen(src);
    int tarLen = strlen(tar);
    int curlA = curlB = 0;
    while(src[curlA] == tar[curlB]){
        if(curlB == tarLen-1){
            return curlB - tarLen + 1;
        }else{
            curlA = getCurlB(&tar, src[curlA], curlB+1);
        }
        curlA++;
    }
    return -1;
}
相关文章
相关标签/搜索