ACM -- 算法小结(五)字符串算法之Sunday算法
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算法的更多相关文章
- 字符串匹配算法之Sunday算法(转)
字符串匹配算法之Sunday算法 背景 我们第一次接触字符串匹配,想到的肯定是直接用2个循环来遍历,这样代码虽然简单,但时间复杂度却是Ω(m*n),也就是达到了字符串匹配效率的下限.于是后来人经过研究 ...
- 字符串匹配算法之Sunday算法
字符串匹配查找算法中,最着名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简 ...
- 字符串匹配算法:Sunday算法
背景 我们第一次接触字符串匹配,想到的肯定是直接用2个循环来遍历,这样代码虽然简单,但时间复杂度却是\(Ω(m*n)\),也就是达到了字符串匹配效率的下限.于是后来人经过研究,构造出了著名的KMP算法 ...
- 【Todo】字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树
另开一文分析字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树. 先来一个汇总, 算法: 本文中提到的字符串匹配算法有:KMP, BM, Horspool, Sunday, BF, ...
- 动画演示Sunday字符串匹配算法——比KMP算法快七倍!极易理解!
前言 上一篇我用动画的方式向大家详细说明了KMP算法(没看过的同学可以回去看看). 这次我依旧采用动画的方式向大家介绍另一个你用一次就会爱上的字符串匹配算法:Sunday算法,希望能收获你的点赞关注收 ...
- BF、KMP、BM、Sunday算法讲解
BF.KMP.BM.Sunday算法讲解 字串的定位操作通常称作串的模式匹配,是各种串处理系统中最重要的操作之一. 事实上也就是从一个母串中查找一模板串,判定是否存在. 现给出四种匹配算法包括BF(即 ...
- Sunday算法(字符串查找、匹配)
字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简单的 ...
- 字符串模式匹配sunday算法
文字部分转自:http://www.cnblogs.com/mr-ghostaqi/p/4285868.html 代码是我自己写的 今天在做LeetCode的时候,碰到一个写字符串匹配的题目: htt ...
- 字符串查找算法总结(暴力匹配、KMP 算法、Boyer-Moore 算法和 Sunday 算法)
字符串匹配是字符串的一种基本操作:给定一个长度为 M 的文本和一个长度为 N 的模式串,在文本中找到一个和该模式相符的子字符串,并返回该字字符串在文本中的位置. KMP 算法,全称是 Knuth-Mo ...
随机推荐
- okhttp3使用详解
http://blog.csdn.net/itachi85/article/details/51190687
- python之微信公众号开发(基本配置和校验)
前言 最近有微信公众号开发的业务,以前没有用python做过微信公众号开发,记录一下自己的学习和开发历程,共勉! 公众号类型 订阅号 普通订阅号 认证订阅号 服务号 普通服务号 认证服务号 服务方式 ...
- 64_p4
perl-Test-Compile-1.3.0-4.fc26.noarch.rpm 12-Feb-2017 05:09 26486 perl-Test-ConsistentVersion-0.3.0- ...
- 全面了解 Nginx 主要应用场景
前言 本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解到过得.所以还请见谅,同时欢迎留言交流 N ...
- 「caffe编译bug」python/caffe/_caffe.cpp:10:31: fatal error: numpy/arrayobject.h: No such file or directory
在Makefile.config找到PYTHON_INCLUDE,发现有点不同: PYTHON_INCLUDE := /usr/include/python2.7 \ /usr/lib ...
- selenium grid结构图
调用 Selenium-Grid 的基本结构图如下: 上面是使用 selenium-grid 的一种普通方式,仅仅使用了其支持的分布式执行的功能,即当你同时需 要测试用例比较多时,可以平行的执行这些用 ...
- leetcode 之Longest Consecutive Sequence(六)
这题要仔细体会下哈希表的用法,要注意的是数组本身是无序的,因此需要向左右进行扩张. 另外这个思路可以进行聚类,把连续的标记为一类. int longestConsecutive(const vecto ...
- ISSCC 2017论文导读 Session 14:A 288μW Programmable Deep-Learning Processor with 270KB On-Chip Weight
A 288μW Programmable Deep-Learning Processor with 270KB On-Chip Weight Storage Using Non-Uniform Mem ...
- ubuntu安装Shutter截图工具以及设置系统快捷键
一.安装截图工具 Shutter 1. 添加安装包软件源 sudo add-apt-repository ppa:shutter/ppa 2. 更新源并安装 shutter sudo apt-get ...
- Web开发——服务器端应用技术简单比较
在开发动态网站时,离不开服务器端技术,服务器端技术主要有CGI.ASP.PHP.ASP.NET和JSP. 1.CGI CGI(Common Gateway Interface 通用网关接口)是最早用来 ...