1. Sunday算法是Daniel M.Sunday于1990年提出的一种比BM算法搜索速度更快的算法。

2. Sunday算法其实思想跟BM算法很相似,只不过Sunday算法是从前往后匹配,

在匹配失败时关注的是文本串中参加匹配的最末位字符的下一位字符。

如果该字符没有在匹配串中出现则直接跳过,即移动步长= 匹配串长度+ 1;

否则,同BM算法一样其移动步长=匹配串中最右端的该字符到末尾的距离+1。

3. 举例如下:

//pos=0;
//匹配串:abcdacdaahfacabcdabcdeaa
//模式串:abcde
//这里我们看到a-e没有对上,我们就看匹配串中的pos+len2在模式串的位置,然后对齐。 //匹配串:abcdacdaahfacabcdabcdeaa
//模式串: abcde
//pos=3;
//这里我们看到d-a没有对上,我们就看匹配串中的pos+len2在模式串的位置,然后对齐。 //匹配串:abcdacdaahfacabcdabcdeaa
//模式串: abcde
//pos=8;
//这里我们看到h-b没有对上,我们就看匹配串中的pos+len2在模式串的位置,然后对齐。 //匹配串:abcdacdaahfacabcdabcdeaa
//模式串: abcde
//pos=13;
//这里我们看到c-b没有对上,我们就看匹配串中的pos+len2在模式串的位置,然后对齐。 //匹配串:abcdacdaahfacabcdabcdeaa
//模式串: abcde
//pos=17;
//这里我们看到模式串完全匹配

代码演示如下:

 #include <iostream>
#include <cstring>
using namespace std; char T[];
char P[];
int next[]; int sunday(const char* T, const char* P)
{
int len1=strlen(T);
int len2=strlen(P);
memset(next,,sizeof(next)); for(int j=; j<;++j)
next[j]=len2+;
for(j=; j<len2;++j)
{
next[P[j]-'a']=len2-j; //记录字符到最右段的最短距离+1
//cout<<"next["<<P[j]-'a'<<"]="<<next[P[j]-'a']<<endl;
}
//例如:p[]="abcedfb"
//next = {7 6 5 4 3 2 1 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8} int pos = ;
while(pos<(len1-len2+)) //末端对齐
{
int i=pos;
int j;
for(j=;j<len2;++j,++i)
{
if(T[i]!=P[j]) //不等于就跳跃,跳跃是核心
{
pos+= next[T[pos + len2]-'a'];
//cout<<"pos="<<pos<<endl<<endl;
break;
}
}
if(j==len2)
return pos;
}
return -;
}
int main()
{
char T[]="abcdacdaahfacabcdabcdeaa";
char P[]="abcde";
while(scanf("%s%s",T,P)!=EOF)
cout<<sunday(T,P)<<endl;
return ;
}

ACM -- 算法小结(五)字符串算法之Sunday算法的更多相关文章

  1. 字符串匹配算法之Sunday算法(转)

    字符串匹配算法之Sunday算法 背景 我们第一次接触字符串匹配,想到的肯定是直接用2个循环来遍历,这样代码虽然简单,但时间复杂度却是Ω(m*n),也就是达到了字符串匹配效率的下限.于是后来人经过研究 ...

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

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

  3. 字符串匹配算法:Sunday算法

    背景 我们第一次接触字符串匹配,想到的肯定是直接用2个循环来遍历,这样代码虽然简单,但时间复杂度却是\(Ω(m*n)\),也就是达到了字符串匹配效率的下限.于是后来人经过研究,构造出了著名的KMP算法 ...

  4. 【Todo】字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树

    另开一文分析字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树. 先来一个汇总, 算法: 本文中提到的字符串匹配算法有:KMP, BM, Horspool, Sunday, BF, ...

  5. 动画演示Sunday字符串匹配算法——比KMP算法快七倍!极易理解!

    前言 上一篇我用动画的方式向大家详细说明了KMP算法(没看过的同学可以回去看看). 这次我依旧采用动画的方式向大家介绍另一个你用一次就会爱上的字符串匹配算法:Sunday算法,希望能收获你的点赞关注收 ...

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

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

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

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

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

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

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

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

随机推荐

  1. PHP对象1: 创建对象与 $this

    <?php class perl{ public $name; function __construct($name){ echo '一个对象造好了<br/>'; $this-> ...

  2. 超级ping(多线程版)

    发现学校公共wifi的ip段是10.1.0-255.0-255段的,还是之前的思路批量ping一波. 其实可以使用nmap的.但是脚本写都写了.是吧.你懂的. #!/usr/bin/env pytho ...

  3. C++ Class与Struct的区别

    转自某楼层的回复http://bbs.csdn.net/topics/280085643 首先,讨论这个问题应该仅从语法上讨论,如果讨论不同人之间编程风格上的差异,那这个问题是没有答案的.毕竟不同的人 ...

  4. linux设置时区同步时间

    linux设置时区同步时间 一.运行tzselect sudo tzselect 在这里我们选择亚洲 Asia,确认之后选择中国(China),最后选择北京(Beijing) 如图:   二.复制文件 ...

  5. 在Ubuntu上安装Redis MySQL MongoDB memcached Nginx

    1.安装Redis sudo apt-get install redis-server 2.安装MySQL sudo apt-get install mysql-server 3.安装MongoDB ...

  6. C++——map注意事项

    1. C++标准模块库STL中提供了两种基本的关联容器:set和map.其内部实现是都是采用红黑树,但不同的是,set中结点存储的是键值,map中结点存储的是<key,value>的键值对 ...

  7. chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息

    chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法:chkconfig [--ad ...

  8. python基础(12)--初识Socket

    socket: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket的英文原义是“孔”或“插座”.作为BSD UNIX的进程通信机制,取后一种意思. ...

  9. Mariadb 10.2中的json使用及应用场景思考

    -- 创建示例表DROP TABLE IF EXISTS `t_base_user`;CREATE TABLE `t_base_user`  (  `USER_ID` char(36) CHARACT ...

  10. mvc部署

    权限中加入windows 2008中加入SERVICE,windows2003中加入NETWORK SERVICE