zoukankan
html css js c++ java
KMP匹配算法中的失效函数
今天总算是看懂了字符串匹配算法中的KMP,记下来吧,以后查的时候方便
失效函数:设模式 P=p
0
p
1
....p
m-2
p
m-1,
则它的失效函数定义如下:
f(j)=k |当 0<=k<j 时,且使得 p0p1....pk=p
j-k
p
j-k+1
...p
j
的最大数
f(j)= -1 | 其它情况。
j
0
1
2
3
4
5
6
7
p
a
b
a
a
b
c
a
c
f(j)
-1
-1
0
0
1
-1
0
-1
详细的不记了,把算法记下来。
void
String::fail
{
int
lengthP
=
curLen;
f[
0
]
=-
1
;
for
(
int
j
=
1
;j
<
lengthP;j
++
)
{
int
i
=
f[j
-
1
];
while
(
*
(ch
+
j)
!=*
(ch
+
i
+
1
)
&&
i
>=
0
) i
=
f[i] ;
//
递推计算
if
(
*
(ch
+
j)
==*
(ch
+
i
+
1
))f[j]
=
i
+
1
;
elsef[j]
=-
1
;
}
}
下面是普通的匹配算法:
int
String::find(String
&
pat)
const
{
char
*
p
=
pat.ch;
*
s
=
ch;
int
i
=
0
;
if
(
*
p
&&
*
s)
while
(i
<=
curLen
-
pat.curLen)
if
(
*
p
++==*
s
++
)
{
//
C++的精典之处
if
(
!*
p)
return
i;
}
else
{ i
++
; s
=
ch
+
i; p
=
pat.ch; }
return
-
1
;
}
下面是 KMP 算法:
int
String::fastFind(String
&
pat)
const
{
int
posP
=
0
, pasT
=
0
;
int
lengthP
=
pat.curLen, lengthT
=
curLen;
while
(posP
<
lengthP
&&
posT
<
lengthT)
if
(pat.ch[pasP]
==
ch[posT]
{
posP
++
; posT
++
;
}
else
if
(posP
==
0
) posT
++
;
else
posP
=
pat.f[posP
-
1
]
+
1
;
if
(posP
<
lengthP)
return
-
1
;
else
return
posT
-
lengthP;
}
查看全文
相关阅读:
Xshell的一些使用方法和注意事项
adobe premiere pro cc2015.0已停止工作 解决办法
视频播放效果--video.js播放mp4文件
centos 7.0 编译安装php 7.0.3
centos 7.0 安装nginx 1.9.10
centos 7.0 firewall 防火墙常用命令
webstorm 更改默认服务器端口
css3 动画效果 定义和绑定执行
css 图片垂直居中总结
JS 面向对象随笔
原文地址:https://www.cnblogs.com/icehong/p/46613.html
最新文章
复旦大学数学学院高等代数历届期中考试大题精选之二(13级--17级)
mac shell终端编辑命令行快捷键
在vue init webpack my-project卡住的问题
java的redis工具类
springboot中的日志配置
PHP操作Redis常用技巧
wamp 安装redis扩展
Apache 配置多个HTTPS站点
mysql根据经纬度获取附近的商家
Incorrect datetime value
热门文章
php获取目录下所有文件路径(递归)
Nginx 启用ngx_http_stub_status_module 模块实现对Nginx 状态查询
/etc/security/limits.conf 详解与配置
记一次hosts配置内容过多引起的故障
微信 AES 解密报错 Illegal key size 三种解决办法
shell 字符串比较与脚本 too many arguments 报错
Jenkins 有关 Maven 的内容
Jenkins 在 Tomcat 运行访问路径设置
Zabbix 预警问题-预警对应的用户报警媒介收不到
一篇干货满满的 NFS 文章
Copyright © 2011-2022 走看看