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 ...
随机推荐
- php简单文件管理器——php经典实例
<html> <head> <title>文件管理</title> <meta charset='utf-8' /> </head&g ...
- uboot之---make smdk2410_config命令详细解析
先进入顶层Makefile.有很多相对不同板子的配置,如: gec2440_config:unconfig @$(MKCONFIG) $(@:_config=) arm arm920t gec2440 ...
- Attention is all you need 论文详解(转)
一.背景 自从Attention机制在提出之后,加入Attention的Seq2Seq模型在各个任务上都有了提升,所以现在的seq2seq模型指的都是结合rnn和attention的模型.传统的基于R ...
- oracle客户端不需要配置tnsnames.ora文件直接连接服务器数据库
在以前的oracle使用过程中,想要在客户端连接到服务器时,都是在客户端中的tnsnames.ora文件配置如以下内容: adb = (DESCRIPTION = (ADDRESS_LIST = (A ...
- HTTPS握手过程
HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密.具体是如何进行加密,解密,验证的,且看下图,下面的称为一次握手. 1. 客户端发起HT ...
- LGPL 与GPL的区别
GPL(GNU General Public License) 我们很熟悉的Linux就是采用了GPL.GPL协议和BSD, Apache Licence等鼓励代码重用的许可很不一样.GPL的出发点是 ...
- 关于ZIP自动打包的进一步进化思路
http://blog.163.com/long200259@126/blog/static/11288755920093120529157/
- springboot 零xml集成mybatis
maven依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...
- vs2013设置语言
设置语言格式 [工具]-[选项]-[国际化]
- 原生js将数组分割成固定个数一组的小数组
reSetData(dataList,num) { let arr = []; let len = dataList.length; for (let i = 0; i < len; i += ...