sunday 算法

编辑

锁定

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

中文名

sunday 算法

外文名

Sunday Algorithm人    物

Daniel M.Sunday

时    间

1990年

类    属

字符串模式匹配

sunday 算法算法介绍

编辑

Sunday是一个线性字符串模式匹配算法。算法的概念如下:

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

记模式串为S,子串为T,长度分别为N,M。

对于T,我们做一个简单而巧妙的预处理:记录T中每一种字符最后出现的位置,将其存入一个数组中。

假设在发生不匹配时S[i]≠T[j],1≤i≤N,1≤j≤M。设S此次第一个匹配的字符位置为L。显然,S[L+M+1]肯定要参加下一轮的匹配,并且T至少要与S[L+M+1]匹配才有可能与整个S匹配。

这时我们就寻找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时,匹配完毕。

Sunday算法思想跟BM算法很相似,在匹配失败时关注的是文本串中参加匹配的最末位字符的下一位字符。如果该字符没有在匹配串中出现则直接跳过,即移动步长= 匹配串长度+1;否则,同BM算法一样其移动步长=匹配串中最右端的该字符到末尾的距离+1。

sunday 算法算法举例

编辑

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

成功匹配。

sunday 算法算法实现

编辑

递归代码,求神犇轻虐

数组党:

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++;}

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<

else cout<

return 0;

}

STL党:(也没多大区别)

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<

else cout<

return 0;

}

sunday算法特征码_sunday 算法相关推荐

  1. sunday算法特征码_Sunday算法介绍及Java实现

    前言 最初想写这篇文章的原因是在LeetCode上看到了一道实现strStr函数的题: 实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haysta ...

  2. sunday算法和kmp算法

    最近看到一个字符串匹配算法sunday,类似于kmp算法,特此记录一下. ---->sunday算法 sunday算法关注的是,每次匹配不成功后主串中下一位不与模式串进行比较的位置(如下图中,第 ...

  3. 分布式一致性算法:Raft 算法(论文翻译)

    Raft 算法是可以用来替代 Paxos 算法的分布式一致性算法,而且 raft 算法比 Paxos 算法更易懂且更容易实现.本文对 raft 论文进行翻译,希望能有助于读者更方便地理解 raft 的 ...

  4. 条件随机场(CRF) - 4 - 学习方法和预测算法(维特比算法)

    声明: 1,本篇为个人对<2012.李航.统计学习方法.pdf>的学习总结,不得用作商用,欢迎转载,但请注明出处(即:本帖地址). 2,由于本人在学习初始时有很多数学知识都已忘记,所以为了 ...

  5. SURF算法与SIFT算法的性能比较——图像特征点检测与提取算法分析

    图像特征点提取算法的算法研究(SURF和SIFT算法) 1. 摘要 计算机视觉中,很大一部分研究集中在图像特征提取和特征生成算法上.对图像的优化,不同于一般数学问题的优化方法,图像的优化是对像素点,在 ...

  6. 数据结构与算法(5)字符串(BF算法、KMP算法及KMP算法优化)

    目录 一.BF算法(暴力算法) 二.KMP算法 三.KMP算法优化 一.BF算法(暴力算法) 一个一个往后匹配,匹配失败继续从母串下一个和头(子串的头)往后继续匹配. 虽然简单,但是需要较多的时间复杂 ...

  7. 标准K-means算法的缺陷、K-mean++初始化算法、初始化算法步骤、Kmeans++算法实现

    标准K-means算法的缺陷.K-mean++初始化算法.初始化算法步骤.Kmeans++算法实现 目录 标准K-means算法的缺陷.K-mean&

  8. Apriori算法、FP-Growth算法、顺序分析、PrefixSpan算法

    Apriori算法.FP-Growth算法.顺序分析.PrefixSpan算法 目录 Apriori算法.FP-Growth算法.顺序分析.PrefixSpan算法 Apriori算法 FP-Grow ...

  9. Java-JVM虚拟机内存垃圾回收机制gc入门:引用类型,对象标记算法,回收算法,常见的 garbage collector

    文章目录 GC的优缺点 引用的四种类型 对象标记算法 引用计数法 可达性分析法 回收算法 标记-清除算法(Mark-Sweep) 复制算法 标记-整理算法(Mark-Compact) 分代收集算法 常 ...

最新文章

  1. 亚马逊AWS:正确设置FTP
  2. 怎样才算熟悉python-终于找到python怎么才算入门
  3. 【数据结构】—顺序表的插入、删除、查找操作
  4. 2016面试——腾讯、蚂蚁金服、蘑菇街
  5. Ros学习——launch文件解析
  6. python股票交易最大值最多可以完成k比交易_leetcode_贪心算法_python
  7. java string to bit_Java Convert String to Binary
  8. 《移动应用开发技术——Android》课程报告-个人记账系统
  9. TRIZ 40创新原理
  10. 小白新手web开发简单总结(三)-一个简单的Web开发项目
  11. 云服务器1M带宽表示什么意思,购买服务器时如何选择服务器带宽?
  12. 电脑怎么连接隐藏的无线WiFi信号呢
  13. iOS自动自动隐藏软键盘
  14. failed to obtain node locks, tried with lock id [0]; maybe these locations are not writable or multi
  15. html引导蒙层,web开发中实现图标点击态蒙层
  16. Guava(一)RateLimter设计分析
  17. 《权威指南》笔记 -- 8.4 作为值的函数
  18. pythonmultiprocessing之 queue线程_python中的进程、线程(threading、multiprocessing、Queue、subprocess)...
  19. 钉钉企业内部机器人开发——绑定群聊信息到机器人
  20. python menuconfig_make menuconfig详解

热门文章

  1. 深圳大学信息检索:链接分析实验
  2. Java 面试常见项目问题回答
  3. Android导出数据到Excel表
  4. python——计算n的阶乘
  5. C#为WindowsDefender防火墙添加出入站规则
  6. 多张照片合成视频和给视频添加背景音乐
  7. 【Android】Android界面设计
  8. 基于Vue的星级评分
  9. ignore的音标_英语ignore的意思解释|读音发音|相关词语_英语词典_词林在线词典...
  10. 教师计算机培训心得体会2000,双师型教师计算机培训心得体会定稿(全文完整版)...