Sunday字符串匹配算法
逛ACM神犇的博客的时候看到的这个神奇的算法
KMP吧,失配函数难理解,代码量长
BF吧,慢,很慢,特别慢。
BM吧,我不会写。。。
现在看到了Sunday算法呀,眼前一亮,神清气爽啊。
字符串匹配算法的效率大概是取决于在发生失配时如何进行下一步的问题。
其他咱就不说了。
这个Sunday算法在发生失配的时候,跳过了尽可能多的字符。

图1 Sunday算法不匹配的情况

图2 Sunday算法移动的第1种情况

图3 Sunday算法移动的第2种情况
例如我们要在"substring searching algorithm"查找"search",刚开始时,把子
串与文本左边对齐,
substring searching algorithm
search
^
结果在第二个字符处发现不匹配,于是要把子串往后移动。但是该移动多少呢?这
就是各种算法各显神通的地方了,最简单的做法是移动一个字符位置;KMP是利用
已经匹配部分的信息来移动;BM算法是做反向比较,并根据已经匹配的部分来确定
移动量。这里要介绍的方法是看紧跟在当前子串之后的那个字符(上图中的'i'。
显然,不管移动多少,这个字符是肯定要参加下一步的比较的,也就是说,如果下
一步匹配到了,这个字符必须在子串内。所以,可以移动子串,使子串中的最右边
的这个字符与它对齐。现在子串'search'中并不存在'i',则说明可以直接跳过一
大片,从'i'之后的那个字符开始作下一步的比较,如下图:
substring searching algorithm
search
^
比较的结果,第一个字符就不匹配,再看子串后面的那个字符,是'r',它在子串中
出现在倒数第三位,于是把子串向前移动三位,使两个'r'对齐,如下:
substring searching algorithm
search
这样就匹配完成了 再比如:
上个代码吧
var s,check:string;
next:array [..] of longint; function sunday(s,check:string):longint;
var len_s,len_c,i,pos,j:longint;
begin
len_s:=length(s);
len_c:=length(check);
for i:= to do
next[i]:=len_c+;
for i:= to len_c do
next[ord(check[i])-ord('a')]:=len_c-i;
pos:=;
while pos<(len_s-len_c+) do
begin
i:=pos;
for j:= to len_c do
begin
if s[i]<>check[j] then
begin
inc(pos,next[ord(s[pos+len_c])-ord('a')]);
break;
end;
inc(i);
end;
if j=len_c then exit(pos);
end;
exit(-);
end; begin
readln(s);
readln(check);
writeln(sunday(s,check));
end.
Sunday字符串匹配算法的更多相关文章
- 动画演示Sunday字符串匹配算法——比KMP算法快七倍!极易理解!
前言 上一篇我用动画的方式向大家详细说明了KMP算法(没看过的同学可以回去看看). 这次我依旧采用动画的方式向大家介绍另一个你用一次就会爱上的字符串匹配算法:Sunday算法,希望能收获你的点赞关注收 ...
- Sunday 字符串匹配算法(C++实现)
简介: Sunday算法是Daniel M.Sunday于1990年提出的一种字符串模式匹配算法.其核心思想是:在匹配过程中,模式串并不被要求一定要按从左向右进行比较还是从右向左进行比较,它在发现不匹 ...
- 字符串匹配算法之Sunday算法
字符串匹配查找算法中,最着名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简 ...
- Sunday算法:字符串匹配算法进阶
背景 我们第一次接触字符串匹配,想到的肯定是直接用2个循环来遍历,这样代码虽然简单,但时间复杂度却是\(Ω(m*n)\),也就是达到了字符串匹配效率的下限.于是后来人经过研究,构造出了著名的KMP算法 ...
- 字符串匹配算法:Sunday算法
背景 我们第一次接触字符串匹配,想到的肯定是直接用2个循环来遍历,这样代码虽然简单,但时间复杂度却是\(Ω(m*n)\),也就是达到了字符串匹配效率的下限.于是后来人经过研究,构造出了著名的KMP算法 ...
- 字符串匹配算法之Sunday算法(转)
字符串匹配算法之Sunday算法 背景 我们第一次接触字符串匹配,想到的肯定是直接用2个循环来遍历,这样代码虽然简单,但时间复杂度却是Ω(m*n),也就是达到了字符串匹配效率的下限.于是后来人经过研究 ...
- Boyer-Moore 字符串匹配算法
字符串匹配问题的形式定义: 文本(Text)是一个长度为 n 的数组 T[1..n]: 模式(Pattern)是一个长度为 m 且 m≤n 的数组 P[1..m]: T 和 P 中的元素都属于有限的字 ...
- KMP单模快速字符串匹配算法
KMP算法是由Knuth,Morris,Pratt共同提出的算法,专门用来解决模式串的匹配,无论目标序列和模式串是什么样子的,都可以在线性时间内完成,而且也不会发生退化,是一个非常优秀的算法,时间复杂 ...
- 字符串匹配算法--KMP字符串搜索(Knuth–Morris–Pratt string-searching)C语言实现与讲解
一.前言 在计算机科学中,Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串S内查找一个词W的出现位置.此算法通过运用对这个词在不匹配时本身就包含足够的信息 ...
随机推荐
- Javascript基础示例:用JS写简易版贪吃蛇(面向对象)
废话不多说,代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...
- Android android:clickable 问题
android:clickable继承自View的xml属性,其值必须是boolean值,即true.false.该标签目的是设置button是否可以被点击. <View android:cli ...
- Facebook 调试工具Stetho配置入门
I decided to spend a few hours on Stetho.Stetho is a sophisticated debug bridge for Android applicat ...
- textarea 在浏览器中固定大小和禁止拖动
HTML 标签 textarea 在大部分浏览器中只要指定行(rows)和列(cols)属性,就可以规定 textarea 的尺寸,大小就不会改变,不过更好的办法是使用 CSS 的 height 和 ...
- 读取本地HTML的小说阅读器应用源码项目
该源码是一个不错的读取本地HTML的小说阅读器,读取本地HTML的小说阅读器,并且源码也比较简单的,非常适合我们的新手朋友拿来学习,有兴趣的朋友研究下. 源码下载: http://code.662p. ...
- linux文件名乱码解决办法
1.linux解压压缩文件乱码 unzip -O CP936 xxx.zip 2.一般文件用convmv sudo convmv -f gbk -t utf-8 -r --notest /your_d ...
- mybatis.generator.configurationFile
mybatis.generator.configurationFile 有一个更好的配置方法,可以不用在generateConfig.xml里面写死驱动的地址:如果你的mybatis连接也是在pom. ...
- Xcode 3.2.5免证书开发调试
Xcode 3.2.5免证书开发调试 xcode3.2.5 应该没人用了.这里做个保存而已. Xcode编译遇到过 Code Sign error: a valid provisioning prof ...
- _extend用法总结
针对对象数组: 后面的属性会覆盖更新前面的属性 看代码: <!DOCTYPE html> <html> <head> <meta charset=" ...
- as3 与js相互通信
1.as和js通讯实例 如果as3调用 JAVA script 中的函数直接在as中添加 if (ExternalInterface.available) { ExternalInterf ...