Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配。其核心思想是:在匹配过程中,模式串发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率。

  核心思想:在匹配过程中,模式串并不被要求一定要按从左向右进行比较还是从右向左进行比较,它在发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率。

    算法内容:1.记模式串为S,子串为T,长度分别为N,M。

         2.对于T,我们做一个简单而巧妙的预处理:记录T中每一种字符最后出现的位置,将其存入一个数组中。
         3.假设在发生不匹配时S[i]≠T[j],1≤i≤N,1≤j≤M。设S此次第一个匹配的字符位置为L。显然,S[L+M+1]肯定要参加下一轮的匹配,并且T至少要与S[L+M+1]匹配才有可能与整个S匹配。
         4.这时我们就寻找T中S[L+M+1]出现的位置了。利用我们预处理好的数组,可以O(1)查找出那个位置u,并将其直接移动至T[u]==S[L+M+1]。特殊地,若S[L+M+1]没有在T中出现,那么T不可能会与S[L+M+1]匹配,则将T的第一位直接移动到S[L+M+2],继续匹配。直至L+M>N时,匹配完毕。
          移动步长= 匹配串长度+1

算法举例

S:abcceabcaabcd
T:abcd
发现d与c不匹配。此时S[L+M+1]=='e',没有出现在T中。于是:
S:abcceabcaabcd
T:--------abcd
发现d与a不匹配。此时S[L+M+1]=='a',T中最后出现在T[0]。于是:
S:abcceabcaabcd
T:--------------abcd
成功匹配。
 
int wei[301]={0};
int ans=0,lend,lenc,tot=0;//tot用于统计匹配次数,便于直观地与其他算法比较
char c[10001],d[10001];
void pei()
{
int w=0;
while(w+lend<=lenc)
{
int i=0;
bool f=false;
while(i<=lend && f==false)
{
if(c[i+w]!=d[i])f=true;
i++;tot++;
}
if(f==false){ans++;w++;}//ans可以用来记录子串出现的次数
else
{
i=lend+1;
if(wei[c[i+w]]==-1)w=w+i+1;//不匹配,到下一位
else w=w+i-wei[c[w+i]];//回到当前这个字符子串的开头
}
}
return;
}
int main()
{
gets(c);
gets(d);
lenc=strlen(c)-1;
lend=strlen(d)-1;
for(int i=0;i<=300;++i)wei[i]=-1;
for(int i=0;i<=lend;++i)
wei[d[i]]=i;
pei();
if(ans)
cout<<ans<<endl<<tot;
else cout<<"mission failed";
return 0;
}

  

int wei[301]={0};
int ans=0,lend,lenc,tot=0;
string c,d;
void pei()
{
int w=0;
while(w+lend<=lenc)
{
int i=0;
bool f=false;
while(i<=lend && f==false)
{
if(c[i+w]!=d[i])f=true;
i++;tot++;
}
if(f==false){ans++;w++;}
else
{
i=lend+1;
if(wei[c[i+w]]==-1)w=w+i+1;
else w=w+i-wei[c[w+i]];
}
}
return;
}
int main()
{
cin>>c;
cin>>d;
lenc=c.length()-1;
lend=d.length()-1;
for(int i=0;i<=300;++i)wei[i]=-1;
for(int i=0;i<=lend;++i)
wei[d[i]]=i;
pei();
if(ans)
cout<<ans<<endl<<tot;
else cout<<"mission failed";
return 0;
}

  ps:以上内容皆整理自百度百科

Sunday算法的更多相关文章

  1. 文本比较算法三——SUNDAY 算法

    SUNDAY 算法描述: 字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上 ...

  2. 字符串匹配的sunday算法

    sunday算法核心思想:启发式移动搜索步长! SUNDAY 算法描述: 字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).这里介 ...

  3. Sunday算法(字符串查找、匹配)

    字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简单的 ...

  4. 字符串模式匹配sunday算法

    文字部分转自:http://www.cnblogs.com/mr-ghostaqi/p/4285868.html 代码是我自己写的 今天在做LeetCode的时候,碰到一个写字符串匹配的题目: htt ...

  5. 字符串匹配算法之Sunday算法

    字符串匹配查找算法中,最着名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简 ...

  6. sunday算法实现

    这个算法比其他的kmp  bm 好理解的太多,而且速度还很快. sunday思路是: 1,Sunday算法是Daniel M.Sunday于1990年提出的一种比BM算法搜索速度更快的算法.  2,S ...

  7. BF、KMP、BM、Sunday算法讲解

    BF.KMP.BM.Sunday算法讲解 字串的定位操作通常称作串的模式匹配,是各种串处理系统中最重要的操作之一. 事实上也就是从一个母串中查找一模板串,判定是否存在. 现给出四种匹配算法包括BF(即 ...

  8. 字符串查找算法总结(暴力匹配、KMP 算法、Boyer-Moore 算法和 Sunday 算法)

    字符串匹配是字符串的一种基本操作:给定一个长度为 M 的文本和一个长度为 N 的模式串,在文本中找到一个和该模式相符的子字符串,并返回该字字符串在文本中的位置. KMP 算法,全称是 Knuth-Mo ...

  9. 数据结构 Sunday算法

    Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配算法.相对比较KMP和BM算法而言,简单了许多. Sunday算法的思想类似于BM算法中的坏字符思想,有点像其删减版.差 ...

  10. 字符串匹配 - sunday算法

    常见的字符串匹配算法有BF.KMP(教科书中非常经典的).BM.Sunday算法 这里主要想介绍下性能比较好并且实现比较简单的Sunday算法 . 基本原理: 从前往后匹配,如果遇到不匹配情况判断母串 ...

随机推荐

  1. springboot整合Ehcache

    首先引入maven包: <dependency> <groupId>org.springframework.boot</groupId> <artifactI ...

  2. self-awareness is key in changing the way you think

    1: controlling the way you think is a manageable process The good news is that you have control over ...

  3. 1.2 使用电脑测试MC20模块的GPS功能测试

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  4. Hadoop学习基础之三:MapReduce

    现在是讨论这个问题的不错的时机,因为最近媒体上到处充斥着新的革命所谓“云计算”的信息.这种模式需要利用大量的(低端)处理器并行工作来解决计算问题.实际上,这建议利用大量的低端处理器来构建数据中心,而不 ...

  5. POJ - 2464 Brownie Points II 【树状数组 + 离散化】【好题】

    题目链接 http://poj.org/problem?id=2464 题意 在一个二维坐标系上 给出一些点 Stan 先画一条过一点的水平线 Odd 再画一条 过Stan那条水平线上的任一点的垂直线 ...

  6. java word导入导出工具类

    package com.shareworx.yjwy.utils; import java.io.InputStream; import java.util.HashMap; import java. ...

  7. 写python中的装饰器

    python中的装饰器主要用于在已有函数实现功能前附加需要输出的信息,下面将用实例展示我如何写装饰器. 首先分别尝试写装饰器装饰一个无参函数和一个有参函数(被装饰函数仅输出,无返回值情况下) def ...

  8. argparse.add_argument()应用

    ArgumentParser.add_argument(name or flags…[, action][, nargs][, const][, default][, type][, choices] ...

  9. linux开发应用程序到运行的过程

    1.给linux配置交叉编译环境 2.在windows下使用source insight写程序,一共有m个h文件,n个c文件,k个main函数 3.将源代码放在linux里 4.在源代码文件夹里新建m ...

  10. 模型融合之blending和stacking

    1. blending 需要得到各个模型结果集的权重,然后再线性组合. """Kaggle competition: Predicting a Biological Re ...