Sunday算法

文本串S如下

模式串T如下

期望从S中找到T的位置。

设有指向文本串S的游标i,指向模式串T的游标j。初始i = 0, j = 0

1:i = 0, j= 0

S[i] != T[j], 所以需要向右移动i然后重新和T的开头匹配,那么我们移动多少个字符呢?

现在让我们脑洞大开,从S和T在当前位置末尾对齐的下一个位置看起,也就是目前的S[3]位置,S[3] = E。

开始向右移动T。

---->移动一个字符,S[3]和T[2]对齐,

明显这个位置是不可能匹配成功的,因为S[3] != T[2]。

---->移动两个字符,S[3]和T[1]对齐。

同理,这也不可能匹配成功。

---->移动三个字符,S[3]和T[0]对齐。

同理,这也不可能匹配成功。

是不是稍微有点感觉了,好,现在来稍微总结下思路。

当在位置i(S的游标),j(T的游标)不匹配时,找到对齐后的下一个位置pos的字符C,然后把T中最后一个出现字符C的位置,和S的pos位置对齐,然后重新开始验证匹配,这样才有可能匹配。如果T中不存在字符C,说明T的任何一个位置都不能和S的pos位置匹配,那么只能从S的pos+1的位置开始和T[0]开始匹配了。

现在按这种方法,来演示一遍。

第一步:i = 0, j = 0

i和j的位置不匹配,找到对齐后的下一个位置pos = 3,字符为E,由于T中不存在字符E,所有设置i = 4(pos的下一个位置), j = 0(j从头匹配)

第二步:i = 4, j = 0

------------------------

匹配串:O U R S T R O N G X S E A R C H

模式串:S E A R C H

这里我们看到O-S不相同,我们就看匹配串中的O在模式串的位置,没有出现在模式串中。

匹配串:O U R S T R O N G X S E A R C H

模式串: _ _ _ _ _ _ _ _ S E A R C H

移动模式串,使模式串的首字符和O的下一个字符对齐。

匹配串:O U R S T R O N G X S E A R C H

模式串:_ _ _ _ _ _ _ _ S E A R C H

继续比较,N-S不相同,字符R出现在模式串,则后移模式串,将把它们对齐

匹配串:O U R S T R O N G X S E A R C H

模式串: _ _ _ _ _ _ _ _ _ _ _ S E A R C H

时间: 2024-10-13 15:14:07

Sunday算法的相关文章

字符串匹配的sunday算法

sunday算法核心思想:启发式移动搜索步长! SUNDAY 算法描述: 字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).这里介绍一种比BM算法更快一些的sunday查找算法. 例如我们要在"substring searching algorithm"查找"search",刚开始时,把子串与文本左边对齐: substring searching algorithm search ^ 结果在第二个

字符串模式匹配sunday算法

文字部分转自:http://www.cnblogs.com/mr-ghostaqi/p/4285868.html 代码是我自己写的 今天在做LeetCode的时候,碰到一个写字符串匹配的题目: https://oj.leetcode.com/problems/implement-strstr/ 我一看就懵了,字符串模式匹配我记得当时在上数据结构的时候,书上只写了BF和KMP算法,老师说考试“只可能会考BF”,KMP不要求掌握. 然后出于一颗探求的心,我还是看了一下KMP,这算法好难理解,于是就没

字符串匹配-sunday算法

#include<iostream> using namespace std; //匹配字符串.能匹配子串在原始字符串中所有出现的位置的开始下标,下标以0开始. int match(int i, int n, const char *ori, const char *sub) {  int j;  for (j = 0; j < n; j++)  {   if (ori[i] == sub[j])   {    if (j == n - 1)    {     cout <<

字符串匹配之Sunday算法

Sunday算法不像KMP算法那么复杂,但是效率又比较高,在KMP之上,下面简单介绍Sunday算法及其实现. Sunday 算法由 Daniel M.Sunday 在 1990 年提出,它的思想跟 BM 算法很相似: 只不过 Sunday 算法是从前往后匹配,在匹配失败时关注的是文本串中参加匹配的最末位字符的下一位字符. 如果该字符没有在模式串中出现则直接跳过,即移动位数 = 匹配串长度 + 1:否则,其移动位数 = 模式串中最右端的该字符到末尾的距离 +1,使得下一位字符与模式串中与其相等的

Sunday算法模板

Sunday是一个线性字符串模式匹配算法.算法的概念如下: Sunday算法是Daniel M.Sunday于1990年提出的一种字符串模式匹配算法.其核心思想是:在匹配过程中,模式串并不被要求一定要按从左向右进行比较还是从右向左进行比较,它在发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率. 记模式串为S,子串为T,长度分别为N,M. 对于T,我们做一个简单而巧妙的预处理:记录T中每一种字符最后出现的位置,将其存入一个数组中. 假设在发生不匹配时S[i]≠T[j],

sunday算法简介

概述 一说到字符串匹配算法,脑海里的第一映像,大部分是KMP算法,因为一般教科书里面都有,但是kmp算法对于我这种脑袋不怎么好用的,看完过一段时间就忘了.sunday同样是作为字符串匹配算法,比kmp,bm算法快,关键的关键是原理简单. 问题描述 先说说sunday算法解决的问题吧:给两个字符串A,B,问字符串A的所有子串中有没有B 具体的例子来说,给你一篇文章,判断该文章里面有没有"我爱我的家"这句话. 原理 最简单的办法肯定是蛮力匹配,从文章的开始位置,先看前5个字是不是"

字符串匹配sunday算法c++实现(转)

转载于http://blog.csdn.net/eqmcc/article/details/8205249 sunday.h #include <cstdlib> #include <string> #include <iostream> #include <map> #ifndef _SUNDAYDLL_H_ #define _SUNDAYDLL_H_ using namespace std; class Sunday{ public: Sunday(st

字符串匹配算法之sunday算法

本节介绍一下sunday算法,看一下sunday算法是如何做的呢 首先定义连个字符串 src:abcdacdaahfacabcdabcdeaa pattern:abcde 我们的目的就是在src串中查找pattern串是否存在,找的方法如下 1. 先左对齐,即从src[0].pattern[0]开始,进行依次比较,比较结果如下 arc[0]=pattern[0] 比较成功 arc[1]=pattern[1] 比较成功 arc[2]=pattern[2] 比较成功 arc[3]=pattern[3

字符串匹配——Sunday算法(C++)

源代码: #include<iostream>#include<cstdio>#include<string>using namespace std;string s1,s2;int m,n,k(0);bool t(0);int main(){ getline(cin,s1); getline(cin,s2); m=s1.size(); n=s2.size(); //C++字符串函数还有待学习. while (!t) { t=true; for (int a=k;a&l