sunday算法简介

概述

一说到字符串匹配算法,脑海里的第一映像,大部分是KMP算法,因为一般教科书里面都有,但是kmp算法对于我这种脑袋不怎么好用的,看完过一段时间就忘了。sunday同样是作为字符串匹配算法,比kmp,bm算法快,关键的关键是原理简单。

问题描述

先说说sunday算法解决的问题吧:给两个字符串A,B,问字符串A的所有子串中有没有B

具体的例子来说,给你一篇文章,判断该文章里面有没有“我爱我的家”这句话。

原理

最简单的办法肯定是蛮力匹配,从文章的开始位置,先看前5个字是不是“我爱我的家”,如果不是,向后移动一位,看第2到第6个字是不是“我爱我的家“,然后如此的进行下去。这样的方法肯定是能找出来的,但是效率就太低了。sunday算法的思想就是,当匹配不成功的时候,尽可能的跳过多的字符。

当匹配不成功的时候,我们就看子串结束位置的下一个字符,用C来表示,

情况一:如果C没有出现在B中,那我们下次比较的时候,就可以直接跳到C的下一个字符开始

情况二:如果C出现在B中,我们就用B的中最靠后C与之对其,所以在匹配之前,我们要对B先进行预处理,用来确定,当C为B中的某个字符的时候,所需要移动的步数

比如”我爱我的家”,我们预处理的结果为 (字符:步数){“我”:3,“爱”:4 ,“的”:2,”家”:1}

下面举一个具体的例子

A: 我 的 家 在 太 阳 , 太 阳 给 了 我 力 量,所 以 我 爱 我 的 家,我 爱 太 阳

B : - 我 爱 我 的 家

首先比较,是不成功,我们在看下一个字符C为 “阳”, 明显 “阳” 字不在B中,所以就是上面的情况一,然后我们再移动B字符,对其阳的下一个字符,“,”

A: 我 的 家 在 太 阳 , 太 阳 给 了 我 力 量,所 以 我 爱 我 的 家,我 爱 太 阳

B : ———————– 我 爱 我 的 家

也没有匹配成功,看下一个字符C为“我”,出现在B中,通过我们预处理的结果,出现“我”字移动3个位置,ok我们移动三个位置

A: 我 的 家 在 太 阳 , 太 阳 给 了 我 力 量 , 我 爱 我 的 家,我 爱 太 阳

B : —————————————- 我 爱 我 的 家

依然没有匹配成功,下一个字是“爱”, 出现在B中,预处理的结果告诉我们,移动4个位置

A: 我 的 家 在 太 阳 , 太 阳 给 了 我 力 量 ,我 爱 我 的 家,我 爱 太 阳

B : —————————————————— 我 爱 我 的 家

匹配成功

通过4次比较就找出来了,简单暴力吧

时间: 2024-08-29 08:11:37

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 <<

TF-IDF算法简介

TF-IDF算法全称为term frequency–inverse document frequency.TF就是term frequency的缩写,意为词频.IDF则是inverse document frequency的缩写,意为逆文档频率. 该算法在信息处理中通常用来抽取关键词.比如,对一个文章提取关键词作为搜索词,就可以采用TF-IDF算法. 要找出一篇文章中的关键词,通常的思路就是,就是找到出现次数最多的词.如果某个词很重要,它应该在这篇文章中多次出现.于是,我们进行"词频"

最小生成树 kruskal算法简介

生成树--在一个图中的一个联通子图  使得所有的节点都被(访问) 最小生成树 (MST) 即联通子图的总代价(路程)最小 已知的一个图 有n个点 m条边 kruskal的算法如下 先对边从小到大排序 从最小的边起,不停的合并这条边的两个节点到一个集合,如果这条边的两个节点已经在一个集合里,则无视,否则形成回路(显然错误)直到所有的节点并到一个集合里 这里需要用到并查集来合并节点 1 int cmp(const int i,const int j) { 2 return w[i] < w[j];

字符串匹配之Sunday算法

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

AES算法简介

AES算法简介 一. AES的结构 1.总体结构 明文分组的长度为128位即16字节,密钥长度可以为16,24或者32字节(128,192,256位).根据密钥的长度,算法被称为AES-128,AES-192或者AE-256. 2.明文密钥组织方式 3.一些相关的的术语定义和表示 • 状态(State):密码运算的中间结果称为状态. • State的表示:状态用以字节为基本构成元素的矩阵阵列来表示,该阵列有4行,列数记为Nb. Nb=分组长度(bits)÷ 32.Nb可以取的值为4,对应的分组长

Java哈希散列算法简介 - MD5 &amp; SHA-512

Java哈希散列算法简介 - MD5 & SHA-512 在日常的开发工作中,我们常常会碰到这样的一个场景:我们需要有一种可靠的行之有效的方法来检验跟判断数据在传输过程当中的完整性.最常见的一种情况就是当我们传输文件的时候,由于网络故障或者其他的一些因素,可能会出现我们下载下来的文件不完整,这给我们日常的开发和维护带了一些难题:另外的一个较为常用的场景就是:有没有一种行之有效的方法让我们可以很方便的判断服务器上的文件是不是有最新的数据更新,比如我们现在的移动Hybird App开发,我们经常会发

MD5算法 简介

MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权费用. MD5功能 l 输入任意长度的信息,经过处理,输出为128位的信息(数字指纹): l 不同的输入得到的不同的结果(唯一性): l 根据128位的输出结果不可能反推出输入的信息(不可逆): MD5用途 1.防止被篡改: 1)比如发送一个电子文档,发送前,我先得到MD5的输出结果a.然后在对方收到电子文档后,对方也得到一个M